Re: Часы (DS3231) с будильником (Arduino)
остался открытый вопрос по сенсорной кнопке D11 (вкл/выкл подсветки экрана)
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Тестирование скетчей → Часы (DS3231) с будильником (Arduino)
остался открытый вопрос по сенсорной кнопке D11 (вкл/выкл подсветки экрана)
двоеточие мигает
#define SET 4
#define UP 2
#define DW 3
#define ALARM 5
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <Adafruit_Sensor.h> // https://github.com/adafruit/Adafruit_Sensor.git
#include <Adafruit_BME280.h> // https://github.com/adafruit/Adafruit_BME280_Library.git
// может понадобится библиотека Adafruit_I2CDevice.h >>> https://github.com/adafruit/Adafruit_BusIO.git
#include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
DS3231 clock;RTCDateTime DateTime;
Adafruit_BME280 bme;
LiquidCrystal_I2C lcd(0x27,16,2);
int hour,minut,secon,year,month,day,den;
int svet;
float temp,p,h;
int set,hh,mm,ss,dd,mn,gg, hh_alarm,mm_alarm;
long times,times0,times1;
byte v1[8] = {B11111,B10001,B10001,B10001,B10001,B10001,B10001,B00000};// П
byte v2[8] = {B10001,B10001,B10001,B01111,B00001,B00001,B00001,B00000};// Ч
byte v3[8] = {B11110,B10000,B10000,B11110,B10001,B10001,B11110,B00000};// Б
int reg;
byte alarm_on;
bool alarm,tic;
void setup() {
Serial.begin(9600);
lcd.init();lcd.backlight();
lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);
pinMode(10,OUTPUT); // LCD1602_LED
pinMode(9,OUTPUT); // BUZZER
pinMode(8,OUTPUT); // LED (инд. будильника)
analogWrite(10, 200);
clock.begin();
bme.begin(0x76);
pinMode(A2,INPUT);// Вход фоторезистора
pinMode(12,INPUT);// кнопка будильника
pinMode(11,INPUT);// кнопка LED
pinMode(SET,INPUT_PULLUP); // SET (сброс) кнопка
pinMode(UP,INPUT_PULLUP); // UP (час+) кнопка
pinMode(DW,INPUT_PULLUP); // DW (мин+) кнопка
pinMode(ALARM,INPUT_PULLUP); // ВКЛ/ОТК БУД. (сигнал) тумблер
///clock.setDateTime(__DATE__, __TIME__);
hh_alarm = EEPROM.read(0);mm_alarm = EEPROM.read(1);
}
void loop() {
if(digitalRead(11)==HIGH){
if(millis()-times0>5000){
svet = map(analogRead(A2), 0,250,10,250);if(svet>250){svet=250;}
analogWrite(10, svet);
times0=millis();
}}else{analogWrite(10, 0);}
DateTime = clock.getDateTime();
hour = DateTime.hour;
minut = DateTime.minute;
secon = DateTime.second;
year=DateTime.year;
month=DateTime.month;
day=DateTime.day;
den=DateTime.dayOfWeek;
hh=hour;mm=minut;ss=secon;dd=day;mn=month;gg=year;
temp = bme.readTemperature();
p = bme.readPressure() / 133.3224;
// h = bme.readHumidity();
Serial.print(hour/10);Serial.print(hour%10);Serial.print(":");
Serial.print(minut/10);Serial.print(minut%10);Serial.print(":");
Serial.print(secon/10);Serial.println(secon%10);
Serial.println(temp,1);
Serial.println(p,1);
// Serial.println(h,1);
Serial.println(svet);
Serial.print("D12 = ");Serial.println(digitalRead(12));
if(digitalRead(SET)==LOW && reg==0){reg=1;delay(200);lcd.clear();}
if(reg==1){
lcd.setCursor(0, 0);
lcd.print("SET TIME & ALARM");
lcd.setCursor(0, 1);
lcd.print("UP>TIME DW>ALARM");
if(digitalRead(UP)==LOW){reg = 2;delay(200);lcd.clear();}
if(digitalRead(DW)==LOW){reg = 3;delay(200);lcd.clear();}
}
if(reg==2){
if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);}
if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==4 && digitalRead(UP)==LOW){mn++;if(mn>12){mn=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==4 && digitalRead(DW)==LOW){mn--;if(mn<1){mn=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2099){gg=2099;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2024){gg=2024;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
lcd.setCursor(0, 0);lcd.print("SET_TIME_MENU");
lcd.setCursor(0, 1);
if(set==1&&millis()-times<200){lcd.print(" ");}else{lcd.print(hour/10%10);lcd.print(hour%10);}lcd.print(":");
if(set==2&&millis()-times<200){lcd.print(" ");}else{lcd.print(minut/10%10);lcd.print(minut%10);}lcd.print(" ");
if(set==3&&millis()-times<200){lcd.print(" ");}else{lcd.print(day/10%10);lcd.print(day%10);}lcd.print(".");
if(set==4&&millis()-times<200){lcd.print(" ");}else{lcd.print(month/10%10);lcd.print(month%10);}lcd.print(".");
if(set==5&&millis()-times<200){lcd.print(" ");}else{lcd.print(year);}
if(set==0&&(digitalRead(UP)==LOW || digitalRead(DW)==LOW)){reg=0;set=0;lcd.clear();delay(200);}
}
if(reg==3){
if(digitalRead(SET)==LOW){set++;if(set>2){set=0;}delay(200);}
if(set==1 && digitalRead(UP)==LOW){hh_alarm++;if(hh_alarm>23){hh_alarm=0;}delay(200);}
if(set==1 && digitalRead(DW)==LOW){hh_alarm--;if(hh_alarm<0){hh_alarm=0;}delay(200);}
if(set==2 && digitalRead(UP)==LOW){mm_alarm++;if(mm_alarm>59){mm_alarm=0;}delay(200);}
if(set==2 && digitalRead(DW)==LOW){mm_alarm--;if(mm_alarm<0){mm_alarm=0;}delay(200);}
lcd.setCursor(0, 0);lcd.print("SET_ALARM_MENU");
lcd.setCursor(0, 1);
if(set==1&&millis()-times<200){lcd.print(" ");}else{lcd.print(hh_alarm/10%10);lcd.print(hh_alarm%10);}lcd.print(":");
if(set==2&&millis()-times<200){lcd.print(" ");}else{lcd.print(mm_alarm/10%10);lcd.print(mm_alarm%10);}lcd.print(" ");
if(set==0&&(digitalRead(UP)==LOW || digitalRead(DW)==LOW)){reg=0;set=0;lcd.clear();delay(200);EEPROM.update(0,hh_alarm);EEPROM.update(1,mm_alarm);}
}
if(reg==0){
if(millis()-times1<500){tic=1;}else{tic=0;}if(millis()-times1>1000){times1=millis();}
lcd.setCursor(0, 0);
lcd.print(temp,1);lcd.print((char)223);lcd.print("C ");
lcd.setCursor(8, 0);
if(set==1&&millis()-times<200){lcd.print(" ");}else{lcd.print(hour/10%10);lcd.print(hour%10);}if(tic==1){lcd.print(":");}else{lcd.print(" ");}
if(set==2&&millis()-times<200){lcd.print(" ");}else{lcd.print(minut/10%10);lcd.print(minut%10);}
lcd.setCursor(14, 0);
switch(den){
case 1: lcd.write((uint8_t)1);lcd.print("H");break;//ПН
case 2: lcd.print("BT");break;
case 3: lcd.print("CP");break;
case 4: lcd.write((uint8_t)2);lcd.print("T");break; //ЧТ
case 5: lcd.write((uint8_t)1);lcd.print("T");break; //ПТ
case 6: lcd.print("C");lcd.write((uint8_t)3);break; //СБ
case 7: lcd.print("BC");break;
}
lcd.setCursor(0, 1);
lcd.print(p,0);lcd.print("mH");
lcd.setCursor(6, 1);
if(set==3&&millis()-times<200){lcd.print(" ");}else{lcd.print(day/10%10);lcd.print(day%10);}lcd.print(".");
if(set==4&&millis()-times<200){lcd.print(" ");}else{lcd.print(month/10%10);lcd.print(month%10);}lcd.print(".");
if(set==5&&millis()-times<200){lcd.print(" ");}else{lcd.print(year);}
}
if(millis()-times>400){times=millis();}
if(digitalRead(ALARM)==LOW){digitalWrite(8,HIGH);alarm = 1;}else{digitalWrite(8,LOW);alarm = 0;}
if(hh_alarm*100+mm_alarm!=hour*100+minut){alarm_on=0;}
if(hh_alarm*100+mm_alarm==hour*100+minut && alarm==1 && alarm_on==0){alarm_on=1;}
if(hh_alarm*100+mm_alarm==hour*100+minut && alarm==1 && alarm_on==1){pic();Serial.println("ZZZZzzzz");}
if(digitalRead(12)==LOW && alarm_on==1){alarm_on=2;delay(200);}
delay(100);
}
void pic(){tone(9,1500,150);}
D11 работает
Добрый день.
Вчера дал супруге часы и попросил установить будильник. С ходу не смогла. Исходя из этого необходимо внести изменения в подменю и сделать его более интуитивно понятным:
Верхняя строчка "SETTING MENU"
Вторая строчка:
> Budilnik
> Clock&Data
> Temperatura
> Davlenie
Алгоритм действий следующий:
- нажимая на кнопку "СБРОС" D4, появляется выше указанное меню, нажимая кнопки "ЧАС" и "МИН" по кругу перебирается вторая строчка. Выбрав нужный пункт второй строчки нажимаем "СБРОС" и попадаем в подменю, где и производятся настройки и коррекция. Закончив настройки нажимаем кнопку "ЧАС" или "МИН" и выходим на главный экран.
P.S. создание доп.пунктов > Temperatura и > Davlenie, обусловлено тем, что в собранном состоянии датчик BME280 даёт значительные погрешности (коррекция температуры -5 до +5 шаг коррекции 0,1, коррекция давления -10 до +10 шаг коррекции 1), которые необходимо корректировать.
Доброго вечера, Вы прочитали моё последнее сообщение?
Добрый день.
Вчера частично допилил код, исходя из выше описанных проблем связанных с интуитивно понятным меню настроек.
Код проверил, работает как следует.
Кроме того, поменял библиотеку, для отображения надписей на русском языке.
Уперся в проблему которую решить самостоятельно не могу и нужна Ваша помощь, а именно, я не знаю как сделать подменю для коррекции температуры и давления.
Прошу уделить внимание на решение этого вопроса, буду Вам очень признателен за оказанную помощь и сопровождение проекта, до его финального завершения.
#include <Wire.h>
#include <LCD_1602_RUS.h>
LCD_1602_RUS lcd(0x27,16,2);
#define SET 4
#define UP 2
#define DW 3
#define ALARM 5
#include <EEPROM.h>
#include <DS3231.h>
#include <Adafruit_BME280.h>
DS3231 clock;
RTCDateTime DateTime;
Adafruit_BME280 bme;
int hour,minut,secon,year,month,day,den;
int svet;
float temp,p,h;
int set,hh,mm,ss,dd,mn,gg, hh_alarm,mm_alarm;
long times,times0,times1;
int reg;
byte alarm_on;
bool alarm,tic;
void setup() {
//Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(10,OUTPUT); // LCD1602_LED
pinMode(9,OUTPUT); // BUZZER
pinMode(8,OUTPUT); // LED (инд. будильника)
analogWrite(10, 200);
clock.begin();
bme.begin(0x76);
pinMode(A2,INPUT); // вход фоторезистора
pinMode(12,INPUT); // сенсорная кнопка будильника (в режиме тактовой кнопки)
pinMode(11,INPUT); // сенсорная кнопка LED LCD (в режиме переключателя)
pinMode(SET,INPUT_PULLUP); // SET (сброс) кнопка
pinMode(UP,INPUT_PULLUP); // UP (час+) кнопка
pinMode(DW,INPUT_PULLUP); // DW (мин+) кнопка
pinMode(ALARM,INPUT_PULLUP); // ВКЛ/ОТК БУД. (сигнал) тумблер
//clock.setDateTime(__DATE__, __TIME__); //установка времени с ПК (во время прошивки)
hh_alarm = EEPROM.read(0);mm_alarm = EEPROM.read(1);
}
void loop() {
if(digitalRead(11)==HIGH){
if(millis()-times0>1000){ //время реакции фоторезистора на свет
svet = map(analogRead(A2), 0,250,10,250);if(svet>250){svet=250;}
analogWrite(10, svet);
times0=millis();
}}else{analogWrite(10, 0);}
DateTime = clock.getDateTime();
hour = DateTime.hour;
minut = DateTime.minute;
secon = DateTime.second;
year=DateTime.year;
month=DateTime.month;
day=DateTime.day;
den=DateTime.dayOfWeek;
hh=hour;mm=minut;ss=secon;dd=day;mn=month;gg=year;
temp = bme.readTemperature();
p = bme.readPressure() / 133.3224;
//h = bme.readHumidity();
/*Serial.print(hour/10);Serial.print(hour%10);Serial.print(":");
Serial.print(minut/10);Serial.print(minut%10);Serial.print(":");
Serial.print(secon/10);Serial.println(secon%10);
Serial.println(temp,1);
Serial.println(p,1);
Serial.println(h,1);
Serial.println(svet);
Serial.print("D11 = ");Serial.println(digitalRead(11));
Serial.print("D12 = ");Serial.println(digitalRead(12));*/
if(digitalRead(SET)==LOW && reg==0){reg=1;delay(200);lcd.clear();}
if(reg==1){
lcd.setCursor(2, 0);
lcd.print("Настроика");
lcd.setCursor(0, 1);
lcd.print("> будильника");
if(digitalRead(UP)==LOW){reg = 2;delay(200);lcd.clear();}
if(digitalRead(DW)==LOW){reg = 4;delay(200);lcd.clear();}
if(digitalRead(SET)==LOW){reg = 6;delay(200);lcd.clear();}
}
if(reg==2){
lcd.setCursor(2, 0);
lcd.print("Настроика");
lcd.setCursor(0, 1);
lcd.print("> часов и даты");
if(digitalRead(UP)==LOW){reg = 3;delay(200);lcd.clear();}
if(digitalRead(DW)==LOW){reg = 1;delay(200);lcd.clear();}
if(digitalRead(SET)==LOW){reg = 5;delay(200);lcd.clear();}
}
if(reg==3){
lcd.setCursor(2, 0);
lcd.print("Настроика");
lcd.setCursor(0, 1);
lcd.print("> температуры");
if(digitalRead(UP)==LOW){reg = 4;delay(200);lcd.clear();}
if(digitalRead(DW)==LOW){reg = 2;delay(200);lcd.clear();}
}
if(reg==4){
lcd.setCursor(2, 0);
lcd.print("Настроика");
lcd.setCursor(0, 1);
lcd.print("> давления");
if(digitalRead(UP)==LOW){reg = 1;delay(200);lcd.clear();}
if(digitalRead(DW)==LOW){reg = 3;delay(200);lcd.clear();}
}
if(reg==5){ // подменю - руч.настройки времени и даты
if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);}
if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==4 && digitalRead(UP)==LOW){mn++;if(mn>12){mn=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==4 && digitalRead(DW)==LOW){mn--;if(mn<1){mn=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2099){gg=2099;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2024){gg=2024;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
lcd.setCursor(0, 0);lcd.print("Время и дата");
lcd.setCursor(0, 1);
if(set==1&&millis()-times<200){lcd.print(" ");}else{lcd.print(hour/10%10);lcd.print(hour%10);}lcd.print(":");
if(set==2&&millis()-times<200){lcd.print(" ");}else{lcd.print(minut/10%10);lcd.print(minut%10);}lcd.print(" ");
if(set==3&&millis()-times<200){lcd.print(" ");}else{lcd.print(day/10%10);lcd.print(day%10);}lcd.print(".");
if(set==4&&millis()-times<200){lcd.print(" ");}else{lcd.print(month/10%10);lcd.print(month%10);}lcd.print(".");
if(set==5&&millis()-times<200){lcd.print(" ");}else{lcd.print(year);}
if(set==0&&(digitalRead(UP)==LOW || digitalRead(DW)==LOW)){reg=0;set=0;lcd.clear();delay(200);}
}
if(reg==6){ // подменю - настройки времени будильника
if(digitalRead(SET)==LOW){set++;if(set>2){set=0;}delay(200);}
if(set==1 && digitalRead(UP)==LOW){hh_alarm++;if(hh_alarm>23){hh_alarm=0;}delay(200);}
if(set==1 && digitalRead(DW)==LOW){hh_alarm--;if(hh_alarm<0){hh_alarm=0;}delay(200);}
if(set==2 && digitalRead(UP)==LOW){mm_alarm++;if(mm_alarm>59){mm_alarm=0;}delay(200);}
if(set==2 && digitalRead(DW)==LOW){mm_alarm--;if(mm_alarm<0){mm_alarm=0;}delay(200);}
lcd.setCursor(0, 0);lcd.print("Будильник");
lcd.setCursor(0, 1);
if(set==1&&millis()-times<200){lcd.print(" ");}else{lcd.print(hh_alarm/10%10);lcd.print(hh_alarm%10);}lcd.print(":");
if(set==2&&millis()-times<200){lcd.print(" ");}else{lcd.print(mm_alarm/10%10);lcd.print(mm_alarm%10);}lcd.print(" ");
if(set==0&&(digitalRead(UP)==LOW || digitalRead(DW)==LOW)){reg=0;set=0;lcd.clear();delay(200);EEPROM.update(0,hh_alarm);EEPROM.update(1,mm_alarm);}
}
// блок главного экрана
if(reg==0){
if(millis()-times1<500){tic=1;}else{tic=0;}if(millis()-times1>1000){times1=millis();}
lcd.setCursor(0, 0);
lcd.print(temp,1);lcd.print((char)223);lcd.print("C ");
lcd.setCursor(8, 0);
if(set==1&&millis()-times<200){lcd.print(" ");}else{lcd.print(hour/10%10);lcd.print(hour%10);}if(tic==1){lcd.print(":");}else{lcd.print(" ");}
if(set==2&&millis()-times<200){lcd.print(" ");}else{lcd.print(minut/10%10);lcd.print(minut%10);}
lcd.setCursor(14, 0);
switch(den){
case 1: lcd.print("ПН");break;
case 2: lcd.print("BT");break;
case 3: lcd.print("CP");break;
case 4: lcd.print("ЧТ");break;
case 5: lcd.print("ПТ");break;
case 6: lcd.print("CБ");break;
case 7: lcd.print("BC");break;
}
lcd.setCursor(0, 1);
lcd.print(p,0);lcd.print("mH");
lcd.setCursor(6, 1);
if(set==3&&millis()-times<200){lcd.print(" ");}else{lcd.print(day/10%10);lcd.print(day%10);}lcd.print(".");
if(set==4&&millis()-times<200){lcd.print(" ");}else{lcd.print(month/10%10);lcd.print(month%10);}lcd.print(".");
if(set==5&&millis()-times<200){lcd.print(" ");}else{lcd.print(year);}
}
if(millis()-times>400){times=millis();}
if(digitalRead(ALARM)==LOW){digitalWrite(8,HIGH);alarm = 1;}else{digitalWrite(8,LOW);alarm = 0;}
if(hh_alarm*100+mm_alarm!=hour*100+minut){alarm_on=0;}
if(hh_alarm*100+mm_alarm==hour*100+minut && alarm==1 && alarm_on==0){alarm_on=1;}
if(hh_alarm*100+mm_alarm==hour*100+minut && alarm==1 && alarm_on==1){pic();/*Serial.println("ZZZZzzzz");*/}
if(digitalRead(12)==LOW && alarm_on==1){alarm_on=2;delay(200);}
delay(100);
}
void pic(){tone(9,1500,150);}
Подскажите, как сделать таймер обратного времени.
-=Таймер обратного отсчёта времени=-
D7 - кнопка (режим "тумблер вкл/выкл") - включение таймера обратного отсчёта
D2 - кнопка (режим "кнопка") - старт таймера обратного отсчёта
D3 - кнопка (режим "кнопка") - пауза таймера обратного отсчёта
D4 - кнопка (режим "кнопка") - сброс таймера обратного отсчёта
D12 - сенсорная кнопка (режим "кнопка") - сброс сигнала таймера обратного отсчёта
Алгоритм работы таймера обратного отсчёта:
1. Настройка
Нажимаем кнопку D4 (SET) открывается меню настройки
Кнопками D2 (D3) листаем меню и выбираем пункт "Настройка таймера", нажимаем D4 (SET) и попадаем в подменю настройки времени таймера
Выставляем время таймера, выходим на основной экран if(reg==0)
2. Включение таймера
Переводим кнопку D7 в положение ВКЛ, открывается экран:
Пример:
1 строка - Таймер
2 строка - 00:05:00 (таймер на 5 минут)
Нажимаем кнопку D2, начинается обратный отсчёт времени.
Нажимаем кнопку D3, обратный отсчёт времени встал на паузу.
Нажимаем кнопку D2, обратный отсчёт времени продолжается.
По окончании работы таймера звучит сигнал, в течении 30 сек., который можно прервать кнопкой D12.
Нажимаем кнопку D4, таймер сбрасывается на изначально установленное время.
Переводим кнопку D7 в положение ВЫКЛ, работа таймера прерывается и открывается главный экран.
#include <Wire.h>
#include <LCD_1602_RUS.h>
LCD_1602_RUS lcd(0x27,16,2);
#define SET 4
#define UP 2
#define DW 3
#define ALARM 5
#define BB 6
#include <EEPROM.h>
#include <DS3231.h>
#include <Adafruit_BME280.h>
DS3231 clock;
RTCDateTime DateTime;
Adafruit_BME280 bme;
int x = 0;
int y = 0;
int n2 = 0;
int m2 = 0;
int r3 = 0;
int r4 = 0;
int hour,minut,secon,year,month,day,den;
int svet;
float temp,p,h;
int set,hh,mm,ss,dd,mn,gg, hh_alarm,mm_alarm;
long times,times0,times1;
int reg;
byte alarm_on;
bool alarm,tic;
byte customChar0[] = {B00000,B00000,B00000,B00000,B00000,B00000,B00000,B00000};
byte customChar1[] = {B01110,B11111,B11111,B11111,B11111,B11111,B11111,B01110};
byte customChar2[] = {B11111,B01110,B00000,B00000,B00000,B00000,B00000,B00000};
byte customChar3[] = {B00000,B00000,B00000,B00000,B00000,B00000,B01110,B11111};
byte customChar4[] = {B11111,B01110,B00000,B00000,B00000,B00000,B01110,B11111};
byte customChar6[] = {B00000,B00000,B00001,B00011,B00011,B00001,B00000,B00000};
byte customChar7[] = {B00000,B00000,B10000,B11000,B11000,B10000,B00000,B00000};
void T1() { // Большие цифры для часов
n2 = hh;
m2 = mm;
NB1();
NB2();
lcd.createChar(6, customChar6);lcd.setCursor(7, 0);lcd.write(6);
lcd.createChar(7, customChar7);lcd.setCursor(8, 0);lcd.write(7);
lcd.createChar(6, customChar6);lcd.setCursor(7, 1);lcd.write(6);
lcd.createChar(7, customChar7);lcd.setCursor(8, 1);lcd.write(7);
delay(250);
lcd.createChar(0, customChar0);lcd.setCursor(7, 0);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor(8, 0);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor(7, 1);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor(8, 1);lcd.write(0);
delay(250);
}
void n3() {
if (y == 0) {x0();}
if (y == 1) {x1();}
if (y == 2) {x2();}
if (y == 3) {x3();}
if (y == 4) {x4();}
if (y == 5) {x5();}
if (y == 6) {x6();}
if (y == 7) {x7();}
if (y == 8) {x8();}
if (y == 9) {x9();}
if (y == 10) {x10();}
}
void x0() {
lcd.createChar(1, customChar1);lcd.setCursor(x, 0);lcd.write(1);
lcd.createChar(2, customChar2);lcd.setCursor((x + 1), 0);lcd.write(2);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 0);lcd.write(1);
lcd.createChar(1, customChar1);lcd.setCursor(x, 1);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 1);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 1);lcd.write(1);
}
void x1() {
lcd.createChar(2, customChar2);lcd.setCursor(x, 0);lcd.write(2);
lcd.createChar(1, customChar1);lcd.setCursor((x + 1), 0);lcd.write(1);
lcd.createChar(0, customChar0);lcd.setCursor((x + 2), 0);lcd.write(0);
lcd.createChar(3, customChar3);lcd.setCursor(x, 1);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 1), 1);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor((x + 2), 1);lcd.write(3);
}
void x2() {
lcd.createChar(2, customChar2);lcd.setCursor(x, 0);lcd.write(2);
lcd.createChar(4, customChar4);lcd.setCursor((x + 1), 0);lcd.write(4);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 0);lcd.write(1);
lcd.createChar(1, customChar1);lcd.setCursor(x, 1);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 1);lcd.write(3);
lcd.createChar(3, customChar3);lcd.setCursor((x + 2), 1);lcd.write(3);
}
void x3() {
lcd.createChar(2, customChar2);lcd.setCursor(x, 0);lcd.write(2);
lcd.createChar(4, customChar4);lcd.setCursor((x + 1), 0);lcd.write(4);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 0);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor(x, 1);lcd.write(3);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 1);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 1);lcd.write(1);
}
void x4() {
lcd.createChar(1, customChar1);lcd.setCursor(x, 0);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 0);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 0);lcd.write(1);
lcd.createChar(0, customChar0);lcd.setCursor(x, 1);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor((x + 1), 1);lcd.write(0);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 1);lcd.write(1);
}
void x5() {
lcd.createChar(1, customChar1);lcd.setCursor(x, 0);lcd.write(1);
lcd.createChar(4, customChar4);lcd.setCursor((x + 1), 0);lcd.write(4);
lcd.createChar(2, customChar2);lcd.setCursor((x + 2), 0);lcd.write(2);
lcd.createChar(3, customChar3);lcd.setCursor(x, 1);lcd.write(3);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 1);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 1);lcd.write(1);
}
void x6() {
lcd.createChar(1, customChar1);lcd.setCursor(x, 0);lcd.write(1);
lcd.createChar(4, customChar4);lcd.setCursor((x + 1), 0);lcd.write(4);
lcd.createChar(2, customChar2);lcd.setCursor((x + 2), 0);lcd.write(2);
lcd.createChar(1, customChar1);lcd.setCursor(x, 1);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 1);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 1);lcd.write(1);
}
void x7() {
lcd.createChar(2, customChar2);lcd.setCursor(x, 0);lcd.write(2);
lcd.createChar(2, customChar2);lcd.setCursor((x + 1), 0);lcd.write(2);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 0);lcd.write(1);
lcd.createChar(0, customChar0);lcd.setCursor(x, 1);lcd.write(0);
lcd.createChar(1, customChar1);lcd.setCursor((x + 1), 1);lcd.write(1);
lcd.createChar(0, customChar0);lcd.setCursor((x + 2), 1);lcd.write(0);
}
void x8() {
lcd.createChar(1, customChar1);lcd.setCursor(x, 0);lcd.write(1);
lcd.createChar(4, customChar4);lcd.setCursor((x + 1), 0);lcd.write(4);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 0);lcd.write(1);
lcd.createChar(1, customChar1);lcd.setCursor(x, 1);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 1);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 1);lcd.write(1);
}
void x9() {
lcd.createChar(1, customChar1);lcd.setCursor(x, 0);lcd.write(1);
lcd.createChar(4, customChar4);lcd.setCursor((x + 1), 0);lcd.write(4);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 0);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor(x, 1);lcd.write(3);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 1);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 1);lcd.write(1);
}
void x10() {
lcd.createChar(0, customChar0);lcd.setCursor(x, 0);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor((x + 1), 0);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor((x + 2), 0);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor(x, 1);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor((x + 1), 1);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor((x + 2), 1);lcd.write(0);
}
void NB1() {
if (n2 >= 10 & n2 < 100) {x = 0; r3 = n2 / 10; y = r3; n3(); x = 4; r4 = n2 - r3 * 10; y = r4; n3();}
if (n2 >= 0 & n2 < 10) {x = 0; y = 10; n3(); x = 4; r4 = n2; y = r4; n3();}
}
void NB2() {
if (m2 >= 10 & m2 < 100) {x = 9; r3 = m2 / 10; y = r3; n3(); x = 13; r4 = m2 - r3 * 10; y = r4; n3();}
if (m2 >= 0 & m2 < 10) {x = 9; y = 0; n3(); x = 13; r4 = m2; y = r4; n3();}
}
void NB3() {
if (n2 >= 10 & n2 < 100) {x = 0; r3 = n2 / 10; y = r3; n3(); x = 4; r4 = n2 - r3 * 10; y = r4; n3();}
if (n2 >= 0 & n2 < 10) {x = 0; y = 10; n3(); x = 4; r4 = n2; y = r4; n3();}
}
void NB4() {
if (m2 >= 10 & m2 < 100) {x = 9; r3 = m2 / 10; y = r3; n3(); x = 13; r4 = m2 - r3 * 10; y = r4; n3();}
if (m2 >= 0 & m2 < 10) {x = 9; y = 0; n3(); x = 13; r4 = m2; y = r4; n3();}
}
void setup() {
//Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(10,OUTPUT); // LCD1602_LED
pinMode(9,OUTPUT); // BUZZER
pinMode(8,OUTPUT); // LED (инд. будильника)
analogWrite(10, 250); //управление яркостью подсветки LCD, 10-пин на который подключена подсветка LCD, 250-подаваемое напряжение (мах - 255-5В)
clock.begin();
bme.begin(0x76);
pinMode(A2,INPUT); // вход фоторезистора
pinMode(12,INPUT); // сенсорная кнопка будильника (в режиме тактовой кнопки)
pinMode(11,INPUT); // сенсорная кнопка LED LCD (в режиме переключателя)
pinMode(SET,INPUT_PULLUP); // SET (сброс) - кнопка
pinMode(UP,INPUT_PULLUP); // UP (час+) - кнопка
pinMode(DW,INPUT_PULLUP); // DW (мин-) - кнопка
pinMode(ALARM,INPUT_PULLUP); // ВКЛ/ОТК БУД. (сигнал) - тумблер
pinMode(BB,INPUT_PULLUP); // ВКЛ/ОТК больших цифр часов - тумблер
//clock.setDateTime(__DATE__, __TIME__); //установка времени с ПК (во время прошивки)
hh_alarm = EEPROM.read(0);mm_alarm = EEPROM.read(1);
}
void loop() {
if(digitalRead(11)==HIGH){
if(millis()-times0>1000){ //время реакции фоторезистора на свет
svet = map(analogRead(A2), 0,250,10,250);if(svet>250){svet=250;}
analogWrite(10, svet);
times0=millis();
}}else{analogWrite(10, 0);}
DateTime = clock.getDateTime();
hour = DateTime.hour;
minut = DateTime.minute;
secon = DateTime.second;
year=DateTime.year;
month=DateTime.month;
day=DateTime.day;
den=DateTime.dayOfWeek;
hh=hour;mm=minut;ss=secon;dd=day;mn=month;gg=year;
temp = bme.readTemperature();
p = bme.readPressure() / 133.3224;
h = bme.readHumidity();
/*Serial.print(hour/10);Serial.print(hour%10);Serial.print(":");
Serial.print(minut/10);Serial.print(minut%10);Serial.print(":");
Serial.print(secon/10);Serial.println(secon%10);
Serial.println(temp,1);
Serial.println(p,1);
Serial.println(h,1);
Serial.println(svet);
Serial.print("D5 = ");Serial.println(digitalRead(5));
Serial.print("D6 = ");Serial.println(digitalRead(6));
Serial.print("D7 = ");Serial.println(digitalRead(7));
Serial.print("D11 = ");Serial.println(digitalRead(11));
Serial.print("D12 = ");Serial.println(digitalRead(12));*/
if(digitalRead(BB)==LOW && reg==0){reg=8;delay(200);lcd.clear();}
if(digitalRead(SET)==LOW && reg==0){reg=1;delay(200);lcd.clear();}
if(reg==1){
lcd.setCursor(2, 0);
lcd.print("Настроика");
lcd.setCursor(0, 1);
lcd.print("> будильника");
if(digitalRead(UP)==LOW){reg = 2;delay(200);lcd.clear();}
if(digitalRead(DW)==LOW){reg = 5;delay(200);lcd.clear();}
if(digitalRead(SET)==LOW){reg = 7;delay(200);lcd.clear();}
}
if(reg==2){
lcd.setCursor(2, 0);
lcd.print("Настроика");
lcd.setCursor(0, 1);
lcd.print("> таимера");
if(digitalRead(UP)==LOW){reg = 3;delay(200);lcd.clear();}
if(digitalRead(DW)==LOW){reg = 1;delay(200);lcd.clear();}
if(digitalRead(SET)==LOW){reg = 0;delay(200);lcd.clear();}
}
if(reg==3){
lcd.setCursor(2, 0);
lcd.print("Настроика");
lcd.setCursor(0, 1);
lcd.print("> часов и даты");
if(digitalRead(UP)==LOW){reg = 4;delay(200);lcd.clear();}
if(digitalRead(DW)==LOW){reg = 2;delay(200);lcd.clear();}
if(digitalRead(SET)==LOW){reg = 6;delay(200);lcd.clear();} //D4
}
if(reg==4){
lcd.setCursor(2, 0);
lcd.print("Коррекция");
lcd.setCursor(0, 1);
lcd.print("> температуры");
if(digitalRead(UP)==LOW){reg = 5;delay(200);lcd.clear();}
if(digitalRead(DW)==LOW){reg = 3;delay(200);lcd.clear();}
if(digitalRead(SET)==LOW){reg = 0;delay(200);lcd.clear();}
}
if(reg==5){
lcd.setCursor(2, 0);
lcd.print("Коррекция");
lcd.setCursor(0, 1);
lcd.print("> давления");
if(digitalRead(UP)==LOW){reg = 1;delay(200);lcd.clear();}
if(digitalRead(DW)==LOW){reg = 4;delay(200);lcd.clear();}
if(digitalRead(SET)==LOW){reg = 0;delay(200);lcd.clear();}
}
if(reg==6){ // подменю - руч.настройки времени и даты
if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);}
if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==4 && digitalRead(UP)==LOW){mn++;if(mn>12){mn=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==4 && digitalRead(DW)==LOW){mn--;if(mn<1){mn=1;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2099){gg=2099;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2024){gg=2024;}clock.setDateTime(gg, mn, dd, hh, mm, ss);delay(200);}
lcd.setCursor(0, 0);lcd.print("Время и дата");
lcd.setCursor(0, 1);
if(set==1&&millis()-times<200){lcd.print(" ");}else{lcd.print(hour/10%10);lcd.print(hour%10);}lcd.print(":");
if(set==2&&millis()-times<200){lcd.print(" ");}else{lcd.print(minut/10%10);lcd.print(minut%10);}lcd.print(" ");
if(set==3&&millis()-times<200){lcd.print(" ");}else{lcd.print(day/10%10);lcd.print(day%10);}lcd.print(".");
if(set==4&&millis()-times<200){lcd.print(" ");}else{lcd.print(month/10%10);lcd.print(month%10);}lcd.print(".");
if(set==5&&millis()-times<200){lcd.print(" ");}else{lcd.print(year);}
if(set==0&&(digitalRead(UP)==LOW || digitalRead(DW)==LOW)){reg=0;set=0;lcd.clear();delay(200);}
}
if(reg==7){ // подменю - настройки времени будильника
if(digitalRead(SET)==LOW){set++;if(set>2){set=0;}delay(200);}
if(set==1 && digitalRead(UP)==LOW){hh_alarm++;if(hh_alarm>23){hh_alarm=0;}delay(200);}
if(set==1 && digitalRead(DW)==LOW){hh_alarm--;if(hh_alarm<0){hh_alarm=0;}delay(200);}
if(set==2 && digitalRead(UP)==LOW){mm_alarm++;if(mm_alarm>59){mm_alarm=0;}delay(200);}
if(set==2 && digitalRead(DW)==LOW){mm_alarm--;if(mm_alarm<0){mm_alarm=0;}delay(200);}
lcd.setCursor(0, 0);lcd.print("Будильник");
lcd.setCursor(0, 1);
if(set==1&&millis()-times<200){lcd.print(" ");}else{lcd.print(hh_alarm/10%10);lcd.print(hh_alarm%10);}lcd.print(":");
if(set==2&&millis()-times<200){lcd.print(" ");}else{lcd.print(mm_alarm/10%10);lcd.print(mm_alarm%10);}lcd.print(" ");
if(set==0&&(digitalRead(UP)==LOW || digitalRead(DW)==LOW)){reg=0;set=0;lcd.clear();delay(200);EEPROM.update(0,hh_alarm);EEPROM.update(1,mm_alarm);}
}
if(reg==8){ // подменю - с большими цифрами часов
T1();
if(digitalRead(UP)==LOW){reg = 8;delay(200);lcd.clear();}
if(digitalRead(DW)==LOW){reg = 5;delay(200);lcd.clear();}
if(digitalRead(SET)==LOW){reg = 1;delay(200);lcd.clear();}
if(digitalRead(BB)==HIGH){reg = 0;delay(200);lcd.clear();}
}
// блок главного экрана
if(reg==0){
if(millis()-times1<500){tic=1;}else{tic=0;}if(millis()-times1>1000){times1=millis();}
lcd.setCursor(0, 0);
lcd.print(temp,1);lcd.print((char)223);lcd.print("C ");
lcd.setCursor(8, 0);
if(set==1&&millis()-times<200){lcd.print(" ");}else{lcd.print(hour/10%10);lcd.print(hour%10);}if(tic==1){lcd.print(":");}else{lcd.print(" ");}
if(set==2&&millis()-times<200){lcd.print(" ");}else{lcd.print(minut/10%10);lcd.print(minut%10);}
lcd.setCursor(14, 0);
switch(den){
case 1: lcd.print("ПН");break;
case 2: lcd.print("BT");break;
case 3: lcd.print("CP");break;
case 4: lcd.print("ЧТ");break;
case 5: lcd.print("ПТ");break;
case 6: lcd.print("CБ");break;
case 7: lcd.print("BC");break;
}
lcd.setCursor(0, 1);
lcd.print(p,0);lcd.print("mH");
lcd.setCursor(6, 1);
if(set==3&&millis()-times<200){lcd.print(" ");}else{lcd.print(day/10%10);lcd.print(day%10);}lcd.print(".");
if(set==4&&millis()-times<200){lcd.print(" ");}else{lcd.print(month/10%10);lcd.print(month%10);}lcd.print(".");
if(set==5&&millis()-times<200){lcd.print(" ");}else{lcd.print(year);}
}
if(millis()-times>400){times=millis();}
if(digitalRead(ALARM)==LOW){digitalWrite(8,HIGH);alarm = 1;}else{digitalWrite(8,LOW);alarm = 0;}
if(hh_alarm*100+mm_alarm!=hour*100+minut){alarm_on=0;}
if(hh_alarm*100+mm_alarm==hour*100+minut && alarm==1 && alarm_on==0){alarm_on=1;}
if(hh_alarm*100+mm_alarm==hour*100+minut && alarm==1 && alarm_on==1){pic();/*Serial.println("ZZZZzzzz");*/}
if(digitalRead(12)==LOW && alarm_on==1){alarm_on=2;delay(200);}
delay(100);
}
void pic(){tone(9,2780,100);}// 9 - пин к которому подключен пьезодинамик, 2780 - частота, 100 - период
forum.rcl-radio.ru → Тестирование скетчей → Часы (DS3231) с будильником (Arduino)
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|