Advertisement
Al_Ninyo

kitchen_timer

May 27th, 2015
837
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.25 KB | None | 0 0
  1. #include <Wire.h>
  2. #include <LiquidCrystal_I2C.h>
  3.  
  4. LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
  5.  
  6. const int ledPins[] = {5,6,9,10}; // пины, к которым подключены светодиоды
  7. const int buttonPin = 12;         // пин подключения кнопки установки таймера
  8. const int resetPin = 11;          // пин подключения кнопки сброса таймера
  9. const int buzzerPin = 7;          // пин подключения пищалки
  10. long timer = -1;                  // таймер, в минутах
  11. int alarm = 0;                    // сколько раз пропищал сигнал срабатывания таймера
  12. unsigned int count = 0;           // "количество нажатий" кнопки. Если держать кнопку 5+ секунд,
  13.                                   // count станет больше 5 и время таймера начнёт увиличиваться
  14.                                   // на 5 минут, вместо 1 минуты
  15. unsigned long previousMillis = 0;
  16. unsigned long currentMillis = 0;
  17. long interval = 1000;             // интервал в милисекундах (минута = 60000)
  18.  
  19. void setup() {
  20.   // обозначаем пины светодиодов и пищалки как ВЫХОД, а пину кнопок как ВХОД
  21.   for (int i=0; i<4; i++) {
  22.     pinMode(ledPins[i], OUTPUT);
  23.   }
  24.   pinMode(buzzerPin, OUTPUT);
  25.   pinMode(buttonPin, INPUT);
  26.   pinMode(resetPin, INPUT);
  27.  
  28.   lcd.init();                  // инициализируем экран
  29.   lcd.backlight();             // включаем подсветку экрана
  30.   lcd.setCursor(0,0);          // устанавливаем курсор в первый символ первой строки
  31.   lcd.print("Kitchen timer");  // выводим на экран надпись
  32.   lcd.setCursor(5,1);          // устанавливаем курсор в пятый символ второй строки
  33.   lcd.print("v. 3.0");         // выводим на экран надпись
  34.   delay(3000);                 // ждём 3 секунды
  35.   lcd.clear();                 // очищаем экран
  36. }
  37.  
  38. void loop() {
  39.   currentMillis = millis();
  40.   if (digitalRead(resetPin) == 0) { // если кнопка сброса нажата
  41.     lcd.clear();
  42.     timer = -1;
  43.     lcd.setCursor(0,0);
  44.     lcd.print("Timer is off");
  45.     delay(3000);                    // пауза 3 секунды
  46.     lcd.noBacklight();              // отключаем подсветку экрана
  47.   }
  48.   // если нажата кнопка установки таймера и удерживается дольше, чем interval
  49.   if (digitalRead(buttonPin) == 0 && currentMillis - previousMillis >= interval) {
  50.     if (count == 0) {               // если начали устанавливать таймер
  51.       lcd.clear();                  // очищаем экран
  52.     }
  53.     lcd.backlight();
  54.     lcd.setCursor(0,0);
  55.     lcd.print("Timer: ");
  56.       if (count >= 5) {             // count увеличивается на 1 каждую секунду, поэтому,
  57.                                     // если кнопку настройки нажата дольше 5 секунд, начинаем
  58.                                     // увеличивать таймер на 5 минут за раз
  59.         timer = timer + 5;
  60.       } else if (timer == -1) {     // если это первоначальная настройка, то, чтобы исключить лишнее
  61.                                     // срабатывание сигнала, перескакиваем через 0
  62.         timer = timer + 2;
  63.       } else {                      // иначе увеличиваем значение таймера на 1 минуту
  64.         timer++;
  65.       }
  66.     count++;
  67.     previousMillis = currentMillis;
  68.     lcd.print(timer);               // выводим на экран значение таймера
  69.     lcd.print(" min   ");
  70. /*    lcd.setCursor(0,1);
  71.     lcd.print("count: ");
  72.     lcd.print(count);
  73. */
  74.   }
  75.   // если кнопка настройки не нажата и таймер установлен, то
  76.   if (digitalRead(buttonPin) == 1 && timer > 0) {
  77.     count = 0;
  78.     // если прошло чётное количество секунд с начала отсчёта таймера,
  79.     // то мигаем на экране звёздочкой, чтобы видеть работу таймера
  80.     if ((((millis() - previousMillis)/1000)%60)%2 == 0) {
  81.       lcd.setCursor(15,1);
  82.       lcd.print("*");
  83.     } else {
  84.       lcd.setCursor(15,1);
  85.       lcd.print(" ");
  86.     }
  87.     // если с начала отсчёта прошла минута, то уменьшаем значение таймера на 1
  88.     if ((((millis() - previousMillis)/1000)/60)%60 == 1) {
  89.       timer = timer - 1;
  90.       previousMillis = currentMillis;
  91.     }
  92.     lcd.setCursor(0,0);
  93.     lcd.print("Timer: ");
  94.     lcd.print(timer);
  95.     lcd.print(" min   ");
  96.     lcd.setCursor(0,1);
  97.     lcd.print("Tick-Tock!");
  98.   }
  99.    // если кнопка установки не нажата и раньше таймер не устанавливался,
  100.    // выводим предложение нажать кнопку для настройки таймера
  101.    else if (digitalRead(buttonPin) == 1 && previousMillis == 0) {
  102.     lcd.setCursor(0,0);
  103.     lcd.print("Press button 1");
  104.     lcd.setCursor(0,1);
  105.     lcd.print("to set timer");
  106.   }
  107.   if (timer == 0) {                 // если таймер закончился
  108.     while (alarm < 5) {             // 5 раз сверкаем и пищим
  109.       lcd.clear();
  110.       lcd.setCursor(0,0);
  111.       lcd.print("    ALARM!!!    ");
  112.       for (int i=0; i<4; i++) {
  113.         digitalWrite(ledPins[i], HIGH);
  114.         }
  115.       tone(buzzerPin, 800, 500);
  116.       delay(1000);
  117.       for (int i=0; i<4; i++) {
  118.         digitalWrite(ledPins[i], LOW);
  119.         }
  120.       alarm++;
  121.     }
  122.     noTone(buzzerPin);
  123.     lcd.setCursor(0,0);
  124.     lcd.print(" Bon appetit :)");
  125.     alarm = 0;
  126.     timer = -1;
  127.   }
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement