Как стать автором
Обновить

Arduino будильник, поливающий водой

Последнее время я работаю на дому и нет острой острой необходимости вставать ежедневно ровно в определенное время. Из за чего я и расслабился, расслабился на столько сильно, что включаю себе от двух до десяти будильников на телефоне подряд, но когда телефон пытается разбудить меня своим звонком, я на автомате провожу пальцем по экрану и телефон вырубается. И так делаю несколько заходов т.к. будильники звонят с небольшим интервалом, и продолжаю спать. В общем толку от него нет.
Тогда я задумался над тем чтобы сделать из своей arduino будильник, который был бы более эффективным.

image

Сразу пришла в голову идея с бутылкой воды которая на меня выливается, но каждое утро просыпаться мокрым и в мокрой постели желания не было. Поэтому нужно было предусмотреть и обычную пищалку, если я ее не вырублю, то только тогда на меня должна вылиться вода. Но вырубить пищалку обычным нажатием на кнопку — плохой вариант т.к. это еще проще чем провести по экрану. Тогда было решено вырубать будильник из другой комнаты с помощью компьютера, который у меня всегда включен, через bluetooth (В итоге сделал без компа и bluetooth).

Используется:

  • Бутылка 0,5 л
  • Баллончик из под краски (в него отлично входит бутылка)
  • Небольшая доска
  • Самый дешевый сервопривод
  • Кнопка (достал из мышки не рабочей)
  • Светодиод (тоже из мышки достал)
  • Пъезо-пищалка
  • Arduino UNO
  • Sensor shield(для удобства)


Первоначальная идея с вырубанием будильника через bluetooth потерпела не удачу, т.к. я случайно спалил свой bluetooth модуль, тем что нарушил полярность по неосторожности.

Тогда было решено сделать не зависящую от компьютера конструкцию с вырубанием через кнопку, но не простым нажатием, а таким чтоб успеть проснуться пока вырубаешь. В итоге получился такой принцип действия:
  • Нажимаем на кнопку перезагрузки arduino и она начинает обратный отсчет (6 часов например)
  • По прошествии шести часов начинает звонить пищалка в течение 60 секунд
  • За это время нужно успеть нажать и удерживать кнопку выключения, и считать количество миганий светодиода, на десятый раз нужно отпустить кнопку
  • Если он моргнет меньше 10 раз, то по прошествии минуты вода выльется
  • Если он моргнет больше 10 раз, то вода выльется сразу


Сооружение достаточно простое и надежное, подробнее можно посмотреть на видео (смотреть с субтитрами):


Смотреть скетч
#include <Servo.h> 

int ledPin = 13;                // сетодиод
int btnPin = 9;                // кнопка
int val=0; //статус кнопки
int raz=0; // количество нажатий кнопки
int kol_raz = 10; //количество необходимых нажатий кнопки

Servo servo;  // create servo object to control a servo
int time = 60*60*6; // время через которое просыпаться нужно
int beep_time = 60; // время сирены
int pos = 90; // начальная позиция сервы

void setup() {
  // put your setup code here, to run once:
  pinMode(ledPin, OUTPUT);      // светодиод
  pinMode(btnPin, INPUT);       // кнопка
  pinMode (8, OUTPUT); // пищалка
  Serial.begin(9600);  
  servo.attach(9);  // серва

  // put your main 
  for (int i=1; i <= (time); i++){
    Serial.println(i);  // prints hello with ending line break 
    if(i==time){
      for (int x=1; x <= (beep_time); x++){
        if(x < beep_time){
          if(raz==0){
            knopka();
            music();

          }
          else{
            if(!knopka()){
              Serial.println("11 times you lose");
              break;
            };
          }
          delay(1000);
        }
        else{
          if(raz==10){
            Serial.println("You WON");
          }
          else{
            Serial.println("WATER you lose");
            servo.write(150); 
            break;
          }
        }    

      }
    }
    delay(1000);
  }

}

void music(){
  tone (8,10,1000);
  delay (500);
  tone (8,15,100);
  delay (500);
}

bool knopka()                      
{
  val = digitalRead(btnPin);    // узнаём состояние кнопки
  if(val==HIGH)                 // кнопка нажата
  {
    raz=(raz+1);    
    digitalWrite(ledPin, HIGH); // зажигаем светодиод
  }
  else{
    digitalWrite(ledPin, LOW);
  }
  if(raz>kol_raz){ //если нажали больше раз чем нужно выливаем воду
    return false;
  }
  else{
    return true;
  }

}

void loop() {


}



Хотел это все перенести на TI LaunchPad MSP-EXP430G2 т.к. эта штука у меня тоже есть, и на ней бы дешевле вся конструкция обошлась, и можно бы было даже не выпаивать микроконтроллер, а так и оставить с платой, но с ним возникла проблема(серва не могла быть беззвучно на одном месте, постоянно звуки издавала, и на грудус туда-сюда ходила).

Потом хорошо бы было добавить сюда дисплейчик, и возможность менять время таймера без загрузки нового скетча, но это потом.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.