habrahabr

«Котовий брызгатрон» — или боевая турель против кота ^_^

  • суббота, 1 мая 2021 г. в 00:42:08
https://habr.com/ru/company/ruvds/blog/554270/
  • Блог компании RUVDS.com
  • Разработка под Arduino
  • DIY или Сделай сам


Эта история будет полна интриги, заговоров, разочарований, слез и искренней радости.... А впрочем, я малость увлекся - не будет там такого.

Предыстория: у меня есть пожилая мать, которая живет в другом городе. И лечит свои недуги с помощью алоэ. Метод хорошо помогает - и она постоянно сажает новые ростки, взамен потраченных. У нее проживают 2 представителя хвостатой фауны: Кузя и Марек (кот и кошечка). Почему кошечка стала вдруг "Мареком" - долгая история. Вкратце обозначим причину как "потому что так сложились звезды". То бишь, сделаем допущение, что Cat cat = new Cat ("Марек");

А теперь, самое главное - если кому понадобится, делюсь файлами.

Скетч для Arduino IDE:


int sensor1 = 2 ;// пин инфракрасного сенсора 1
int sensor2 = 3; // пин инфракрасного сенсора 2
int mosfet = 10; // пин силового мосфета, который включает насос

boolean isSensorStarted = false; // сработал ли хоть какой то датчик
boolean isMotorStarted = false; // запущен ли в данный момент двигатель
boolean catStatusMessage = false; // вывод сообщения о текущем статусе кота
boolean isFirstMessage = true; // вывод первого сообщения

boolean firstStart = true; //пауза только при первом старте системы (даёт возможность загрузиться)

volatile uint32_t startTime = 0; //время в миллисекундах, когда стартовал двигатель
volatile uint32_t workingTime = 3000; //время в миллисекундах, которое будет работать двигатель

void setup ()
{
  Serial.begin(9600);
  pinMode (sensor1, INPUT) ; // пин датчика работает как вход
  pinMode (sensor2, INPUT) ; // пин датчика работает как вход
  pinMode (mosfet, OUTPUT) ;// пин мосфета работает как выход

  attachInterrupt(digitalPinToInterrupt (sensor1), sensor_impulse, HIGH);
  attachInterrupt(digitalPinToInterrupt (sensor2), sensor_impulse, HIGH);
}

void loop ()
{

  while (isSensorStarted)
  {
      if (firstStart) //пауза при первом старте системы, после включения питания - даёт системе загрузиться и датчикам-прийти в состояние LOW
        {
          detachInterrupt(sensor1);
          detachInterrupt(sensor2);
          while ( (digitalRead(sensor1)==HIGH) || (digitalRead(sensor2)==HIGH) )
          {
            //ничего не делаем-ждем, пока не появится сигнал LOW
          }
          firstStart = false;
          isSensorStarted  = false;
          Serial.println ("Стартуем");
          isFirstMessage = false;           
          attachInterrupt(digitalPinToInterrupt (sensor1), sensor_impulse, HIGH);
          attachInterrupt(digitalPinToInterrupt (sensor2), sensor_impulse, HIGH);
          break;                      
        }
    
     if (catStatusMessage)
     {
        Serial.println ("Агонь па кату!!! :-)"); 
        catStatusMessage = false;     
     }

     detachInterrupt(sensor1);
     detachInterrupt(sensor2);
   
     digitalWrite(mosfet, HIGH);
     startTime = millis(); //записали время старта двигателя    
     isMotorStarted = true;
     Serial.println ("Двигатель запущен!");     
    
     while (isSensorStarted)
     {
        if (isMotorStarted)
        {
          if (millis()-startTime >= workingTime)
          { 
            isMotorStarted=false;
            digitalWrite(mosfet, LOW);
            Serial.println ("Двигатель остановлен!");
          }          
        }

      
      if ( (digitalRead(sensor1)==LOW) && (digitalRead(sensor2)==LOW) )
         {
           attachInterrupt(digitalPinToInterrupt (sensor1), sensor_impulse, HIGH);
           attachInterrupt(digitalPinToInterrupt (sensor2), sensor_impulse, HIGH); 
           isSensorStarted = false;
         }
     }
  }

 if (!isFirstMessage)
 {
    if (!catStatusMessage)
       {
         Serial.println ("Кота что то нету...:-(");
         catStatusMessage = true;      
       }  
 }
     

}

void sensor_impulse () 
{
  if (!isSensorStarted)
  {
     isSensorStarted = true;
  }
}

Скачать файлы для 3d печати можно по этой ссылке.

На этом всё - доклад закончил.