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

13 293 просмотра 3 комментария 22 октября 2012

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

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

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

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

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

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

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

 

Скетч

#include <Servo.h> 

int ledPin = 13;                // светодиод
int btnPin = 7;                // кнопка
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);
}

boolean 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 т.к. эта штука у меня тоже есть, и на ней бы дешевле вся конструкция обошлась, и можно бы было даже не выпаивать микроконтроллер, а так и оставить с платой, но с ним возникла проблема(серва не могла быть беззвучно на одном месте, постоянно звуки издавала, и на градус туда-сюда ходила). Потом хорошо бы было добавить сюда дисплейчик, и возможность менять время таймера без загрузки нового скетча, но это потом.

3 комментария

Будильник стал заголовком статьи на одном из самых посещаемых сайтов в беларуси http://dengi.onliner.by/2012/10/22/smekalka
Добрый день! у меня к вам предложение, напишите, пожалуйста, мне на почту statya@bk.ru Спасибо!!
крутая штука

Вы можете оставить комментарий