Таймер допилка

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

День добрый господа формучане, да прибудет с вами сила) Собственно есть, готовый скетч таймера кухонного, казалось бы все просто, но нужно чуть допилить. Добавить кнопку - МИНУС( кнопка прибавления есть) и добавить кнопку ПАУЗА. Если кто поможет, отблагодарю чем смогу.

Сам код:

#include "TM1637.h"         //библиотека дисплея
#define DISPLAY_CLK_PIN 3
#define DISPLAY_DIO_PIN 2
TM1637 display(DISPLAY_CLK_PIN, DISPLAY_DIO_PIN);
int8_t timeDisp[4];
//=========================
//const int Pin_tone = 5; // номер порта зуммера
//============================
int hour       = 0; //пер.хранения часов
int minute     = 0; //пер.хранения минут
int second     = 0; //пер.хранения секунд
int halfsecond = 0; //пер Х.З., но очень нужна для мигания точек
int Update     = 0; //пер.для хранения разрешения на обновление цифр на дисплее
//============================
#define tonePin        5 // пищалка
#define Btn_plus60_minute 7 //пин кнопки +60 минута
#define Btn_plus1_minute  8 //пин кнопки +1 минута
#define Btn_plus10_minute 9 //пин кнопки +10 минут
#define Btn_Sbros        10 //пин сброса таймера
#define ledPin           13 // сюда подключено питание дисплея
#define rele           4 // пин реле
//============================переменки таймера
unsigned long timeTimer = 0;
unsigned long startTimer = 0;
//============================
int timerFlag =   0;        //флаг работы таймера
int duration =    0;        //пер.
int i = 4;                  // Яркость дисплея (яркость 0-7)
//============================ display
void setup() {
  display.set(0);          //Яркость дисплея
  display.init();          //Инициализация дисплея
  digitalWrite(ledPin,               HIGH);
  
  displey();
  pinMode(Btn_plus1_minute,  INPUT_PULLUP);
  pinMode(Btn_plus10_minute, INPUT_PULLUP);
  pinMode(Btn_plus60_minute, INPUT_PULLUP);
  pinMode(Btn_Sbros,         INPUT_PULLUP);
  pinMode(ledPin,                  OUTPUT);
  pinMode(rele, OUTPUT); // пин реле
}
/*обрабатываем в цыкле функцию knopki, а остальные функции обрабатываются по прерыванию
  таймера Timer1 один раз в полсекунды*/
void loop() {
  knopki();                          //ф-ция обработки кнопок
  if (Update == 1) {
    displey(); //если отработала функция timer, то перезаписываем экран
  }
  Start();
  //if (timerFlag == 1);{digitalWrite(rele, HIGH); }//реле вкл
 // if (timerFlag == 0);{digitalWrite(rele, LOW);} //реле выкл
  
}

/*функция обработки кнопок*/
void knopki() {
  if (digitalRead(Btn_plus1_minute) == LOW) {              //если нажали кнопку "+1"
    delay (500), duration = (duration + 1); timerFlag = 1; //то задержка 0,5 сек.//добавляем минуту//запускаем таймер
    tone(5, 4000, 150); display.set(i);
    digitalWrite(rele, HIGH); //вкл реле
  }
  if (digitalRead(Btn_plus10_minute) == LOW) {             //если нажали кнопку "+10"
    delay (500), duration = (duration + 10); timerFlag = 1;//то задержка 0,5 сек.//добавляем 10 минут//запускаем таймер
    tone(5, 4300, 150); display.set(i);
    digitalWrite(rele, HIGH);//вкл реле
  }
  if (digitalRead(Btn_plus60_minute) == LOW) {             //если нажали кнопку "+60"
    delay (500), duration = (duration + 60); timerFlag = 1;//то задержка 0,5 сек.//добавляем 60 минут//запускаем таймер
    tone(5, 4600, 150); display.set(i);
    digitalWrite(rele, HIGH);//вкл реле
  }
  if (digitalRead(Btn_Sbros) == LOW) {                     //если нажали "сброс"
    tone(5, 3000, 200);
    display.set(i);
    display.set(0);
    delay (10);                                            //то задержка 0,01 сек.
    digitalWrite(rele, LOW); //выкл реле если нажали "сброс"
    timerFlag =  0;                                        //останавливаем таймер
    duration =   0;                                        //И ОБНУЛЯЕМ ПЕРЕМЕННЫЕ
    hour =       0;                                        //И ОБНУЛЯЕМ ПЕРЕМЕННЫЕ
    minute =     0;                                        //И ОБНУЛЯЕМ ПЕРЕМЕННЫЕ
    second =     0;                                        //И ОБНУЛЯЕМ ПЕРЕМЕННЫЕ
    halfsecond = 0;                                        //И ОБНУЛЯЕМ ПЕРЕМЕННЫЕ
    displey();
    
  }
}
void kohec() {                                            //По окончанию работы
  timeDisp[0] = 16;
  timeDisp[1] = 0;                                      //таймера вкл. надпись OFF
  timeDisp[2] = 15;
  timeDisp[3] = 15;
  Update = 0;
  display.display(timeDisp);
  
}
void Start() {
  timeTimer = (millis() - startTimer);
  if (timeTimer > 500 && timerFlag == 1) {
    timer();
    startTimer = millis();
  }
}

void timer() {
  Update = 1;
  if (timerFlag == 1) {
    halfsecond ++;
    if (halfsecond == 2) {
      halfsecond = 0, second-- ;
    }
    if (second == 0) {
      second = 60,   duration--;
    }
    if (duration == -1) {
      display.set(0);
      second =    0;
      duration =  0;
      timerFlag = 0;
      digitalWrite(rele, LOW); //выкл реле
      displey();
      kohec();
      
      MUSIC();
    }
  }
}

void displey() {
  hour = duration   / 60;
  minute = duration % 60;
  if (duration >= 60) {
    timeDisp[0] = hour / 10;
    timeDisp[1] = hour % 10;
    timeDisp[2] = minute / 10;
    timeDisp[3] = minute % 10;
  }
  else if (duration < 60 && second < 60) {
    timeDisp[0] = minute / 10;
    timeDisp[1] = minute % 10;
    timeDisp[2] = second / 10;
    timeDisp[3] = second % 10;
  }
  else if (duration < 60 && second == 60) {
    minute = duration % 60 + 1;
    timeDisp[0] = minute / 10;
    timeDisp[1] = minute % 10;
    timeDisp[2] = 0;
    timeDisp[3] = 0;
  }
  Update = 0;
  display.display(timeDisp);
  display.point(halfsecond == 1 ? POINT_ON : POINT_OFF);
}

void MUSIC() {      //ну погоди 8 сек.

  tone(tonePin, 329, 260.6175);
  delay(289.575);
  tone(tonePin, 1046, 260.6175);
  delay(289.575);
  tone(tonePin, 1174, 260.6175);
  delay(289.575);
  tone(tonePin, 880, 260.6175);
  delay(289.575);
  tone(tonePin, 1046, 260.6175);
  delay(289.575);
  tone(tonePin, 783, 130.30875);
  delay(144.7875);
  tone(tonePin, 880, 260.6175);
  delay(289.575);
  tone(tonePin, 783, 130.30875);
  delay(144.7875);
  tone(tonePin, 698, 130.30875);
  delay(144.7875);
  tone(tonePin, 523, 130.30875);
  delay(144.7875);
  tone(tonePin, 554, 1042.47);
  delay(1158.3);
  tone(tonePin, 523, 1042.47);
  delay(1158.3);
  tone(tonePin, 329, 260.6175);
  delay(289.575);
  tone(tonePin, 1046, 260.6175);
  delay(289.575);
  tone(tonePin, 1174, 260.6175);
  delay(289.575);
  tone(tonePin, 880, 260.6175);
  delay(289.575);
  tone(tonePin, 1046, 260.6175);
  delay(289.575);
  tone(tonePin, 783, 130.30875);
  delay(144.7875);
  tone(tonePin, 880, 260.6175);
  delay(289.575);
  tone(tonePin, 783, 130.30875);
  delay(144.7875);
  tone(tonePin, 698, 130.30875);
  delay(144.7875);
  tone(tonePin, 523, 130.30875);
  delay(144.7875);
  tone(tonePin, 659, 1042.47);
  delay(1158.3);
  tone(tonePin, 587, 1042.47);
  delay(1158.3);

  tone(tonePin, 329, 260.6175);
  delay(289.575);
  tone(tonePin, 1046, 260.6175);
  delay(289.575);
  tone(tonePin, 1174, 260.6175);
  delay(289.575);
  tone(tonePin, 880, 260.6175);
  delay(289.575);
  tone(tonePin, 1046, 260.6175);
  delay(289.575);
  tone(tonePin, 783, 130.30875);
  delay(144.7875);
  tone(tonePin, 880, 260.6175);
  delay(289.575);
  tone(tonePin, 783, 130.30875);
  delay(144.7875);
  tone(tonePin, 698, 130.30875);
  delay(144.7875);
  tone(tonePin, 523, 130.30875);
  delay(144.7875);
  tone(tonePin, 554, 1042.47);
  delay(1158.3);
  tone(tonePin, 523, 1042.47);
  delay(1158.3);
  tone(tonePin, 329, 260.6175);
  delay(289.575);
  tone(tonePin, 1046, 260.6175);
  delay(289.575);
  tone(tonePin, 1174, 260.6175);
  delay(289.575);
  tone(tonePin, 880, 260.6175);
  delay(289.575);
  tone(tonePin, 1046, 260.6175);
  delay(289.575);
  tone(tonePin, 783, 130.30875);
  delay(144.7875);
  tone(tonePin, 880, 260.6175);
  delay(289.575);
  tone(tonePin, 783, 130.30875);
  delay(144.7875);
  tone(tonePin, 698, 130.30875);
  delay(144.7875);
  tone(tonePin, 523, 130.30875);
  delay(144.7875);
  tone(tonePin, 659, 1042.47);
  delay(1158.3);
  tone(tonePin, 587, 1042.47);
  delay(1158.3);

}

Допил делается для ребенка, не может он с наступающим таймером.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Я бы не с подпития за этот бред не взялся бы.

Но, возможно, матерями Терезами не оскуднела... 

b707
Offline
Зарегистрирован: 26.05.2017

ой, где-то я такое уже видел :)

tone(tonePin, 523, 130.30875);
  delay(144.7875);

dozbot - вы сами-то не понимаете, что эти строчки - бредятина? :)

Да и задержки в полсекунды при нажатии кнопок не лучше...

есть ли смысл дорабатывать этот код?

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Ребят если у кого есть простой вариант , пишите на dozbot(собака)bk.ru, и реквизиты кошельков или иного.  Буду рад любым предложениям.