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 - период
liman324, добрый день.
Прошу помощи в возникшей проблеме, самостоятельно вопрос решить не смог.
Буду очень признателен.
???
1. Решил перейти с LCD1602 на LCD1604 и столкнулся с проблемой не отображаются русские буквы в дне недели. Причём если отключить большие цифры, то буквы появляются.
2. Как прикрутить значок будильника, т.е. при включении будильника загорался значок активности будильника. Сейчас реализована функция включения светодиода.
3. При отключении общего питания на схеме, модуль DS3231 останавливается и не продолжает внутренний отсчёт времени (батарейка CR2032, новая и показывает 3,1v)
1. Решил перейти с LCD1602 на LCD1604 и столкнулся с проблемой не отображаются русские буквы в дне недели. Причём если отключить большие цифры, то буквы появляются.
LCD1604 имеет только 8 байт для произвольных символов, они все заняты большими цифрами. Одновременно большие цифры и дни недели работать не будут
Как прикрутить значок будильника, т.е. при включении будильника загорался значок активности будильника. Сейчас реализована функция включения светодиода.
Я не вижу скетча, не могу ответить
3. При отключении общего питания на схеме, модуль DS3231 останавливается и не продолжает внутренний отсчёт времени (батарейка CR2032, новая и показывает 3,1v)
Уберите с платы часов диод, через него идет заряд батарейки, напряжение становиться больше 3 В, часы начинают глючить. Или замените батарейку на аккумулятор
Для чистоты эксперимента по 3-му вопросу, батарейку снял и подключил аккумулятор, через защитную плату. Результат - 0.
Питание от АКБ 4.15v
#include <Wire.h>
#include <LCD_1602_RUS.h> // https://github.com/ssilver2007/LCD_1602_RUS
LCD_1602_RUS lcd(0x27,16,4);
#define SET 4
#define UP 2
#define DW 3
#define ALARM 5
#define BB 6
#include <EEPROM.h>
#include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/ … DS3231.zip
#include <Adafruit_BME280.h> // https://github.com/adafruit/Adafruit_BME280_Library.git
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 customChar5[] = {B00000,B00100,B01110,B01110,B01110,B11111,B11111,B00010}; // значок будильника
//byte customChar6[] = {B00000,B00000,B00001,B00011,B00011,B00001,B00000,B00000};
//byte customChar7[] = {B00000,B00000,B10000,B11000,B11000,B10000,B00000,B00000};
void T1() { // Большие цифры для часов (на 2-3 строках)
n2 = hh;
m2 = mm;
NB1();
NB2();
/*// этот блок показывает двоеточие в часах
lcd.createChar(6, customChar6);lcd.setCursor(3, 2);lcd.write(6);
lcd.createChar(7, customChar7);lcd.setCursor(4, 2);lcd.write(7);
lcd.createChar(6, customChar6);lcd.setCursor(3, 3);lcd.write(6);
lcd.createChar(7, customChar7);lcd.setCursor(4, 3);lcd.write(7);
delay(250);
// этот блок затирает двоеточие в часах
lcd.createChar(0, customChar0);lcd.setCursor(3, 2);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor(4, 2);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor(3, 3);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor(4, 3);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, 2);lcd.write(1);
lcd.createChar(2, customChar2);lcd.setCursor((x + 1), 2);lcd.write(2);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 2);lcd.write(1);
lcd.createChar(1, customChar1);lcd.setCursor(x, 3);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 3);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 3);lcd.write(1);
}
void x1() {
lcd.createChar(2, customChar2);lcd.setCursor(x, 2);lcd.write(2);
lcd.createChar(1, customChar1);lcd.setCursor((x + 1), 2);lcd.write(1);
lcd.createChar(0, customChar0);lcd.setCursor((x + 2), 2);lcd.write(0);
lcd.createChar(3, customChar3);lcd.setCursor(x, 3);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 1), 3);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor((x + 2), 3);lcd.write(3);
}
void x2() {
lcd.createChar(2, customChar2);lcd.setCursor(x, 2);lcd.write(2);
lcd.createChar(4, customChar4);lcd.setCursor((x + 1), 2);lcd.write(4);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 2);lcd.write(1);
lcd.createChar(1, customChar1);lcd.setCursor(x, 3);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 3);lcd.write(3);
lcd.createChar(3, customChar3);lcd.setCursor((x + 2), 3);lcd.write(3);
}
void x3() {
lcd.createChar(2, customChar2);lcd.setCursor(x, 2);lcd.write(2);
lcd.createChar(4, customChar4);lcd.setCursor((x + 1), 2);lcd.write(4);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 2);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor(x, 3);lcd.write(3);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 3);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 3);lcd.write(1);
}
void x4() {
lcd.createChar(1, customChar1);lcd.setCursor(x, 2);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 2);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 2);lcd.write(1);
lcd.createChar(0, customChar0);lcd.setCursor(x, 3);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor((x + 1), 3);lcd.write(0);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 3);lcd.write(1);
}
void x5() {
lcd.createChar(1, customChar1);lcd.setCursor(x, 2);lcd.write(1);
lcd.createChar(4, customChar4);lcd.setCursor((x + 1), 2);lcd.write(4);
lcd.createChar(2, customChar2);lcd.setCursor((x + 2), 2);lcd.write(2);
lcd.createChar(3, customChar3);lcd.setCursor(x, 3);lcd.write(3);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 3);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 3);lcd.write(1);
}
void x6() {
lcd.createChar(1, customChar1);lcd.setCursor(x, 2);lcd.write(1);
lcd.createChar(4, customChar4);lcd.setCursor((x + 1), 2);lcd.write(4);
lcd.createChar(2, customChar2);lcd.setCursor((x + 2), 2);lcd.write(2);
lcd.createChar(1, customChar1);lcd.setCursor(x, 3);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 3);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 3);lcd.write(1);
}
void x7() {
lcd.createChar(2, customChar2);lcd.setCursor(x, 2);lcd.write(2);
lcd.createChar(2, customChar2);lcd.setCursor((x + 1), 2);lcd.write(2);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 2);lcd.write(1);
lcd.createChar(0, customChar0);lcd.setCursor(x, 3);lcd.write(0);
lcd.createChar(1, customChar1);lcd.setCursor((x + 1), 3);lcd.write(1);
lcd.createChar(0, customChar0);lcd.setCursor((x + 2), 3);lcd.write(0);
}
void x8() {
lcd.createChar(1, customChar1);lcd.setCursor(x, 2);lcd.write(1);
lcd.createChar(4, customChar4);lcd.setCursor((x + 1), 2);lcd.write(4);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 2);lcd.write(1);
lcd.createChar(1, customChar1);lcd.setCursor(x, 3);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 3);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 3);lcd.write(1);
}
void x9() {
lcd.createChar(1, customChar1);lcd.setCursor(x, 2);lcd.write(1);
lcd.createChar(4, customChar4);lcd.setCursor((x + 1), 2);lcd.write(4);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 2);lcd.write(1);
lcd.createChar(3, customChar3);lcd.setCursor(x, 3);lcd.write(3);
lcd.createChar(3, customChar3);lcd.setCursor((x + 1), 3);lcd.write(3);
lcd.createChar(1, customChar1);lcd.setCursor((x + 2), 3);lcd.write(1);
}
void x10() {
lcd.createChar(0, customChar0);lcd.setCursor(x, 2);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor((x + 1), 2);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor((x + 2), 2);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor(x, 3);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor((x + 1), 3);lcd.write(0);
lcd.createChar(0, customChar0);lcd.setCursor((x + 2), 3);lcd.write(0);
}
void NB1() {
if (n2 >= 10 & n2 < 100) {x = -4; r3 = n2 / 10; y = r3; n3(); x = 0; r4 = n2 - r3 * 10; y = r4; n3();}
if (n2 >= 0 & n2 < 10) {x = -4; y = 10; n3(); x = 0; r4 = n2; y = r4; n3();}
}
void NB2() {
if (m2 >= 10 & m2 < 100) {x = 5; r3 = m2 / 10; y = r3; n3(); x = 9; r4 = m2 - r3 * 10; y = r4; n3();}
if (m2 >= 0 & m2 < 10) {x = 5; y = 0; n3(); x = 9; r4 = m2; y = r4; n3();}
}
void NB3() {
if (n2 >= 10 & n2 < 100) {x = -4; r3 = n2 / 10; y = r3; n3(); x = 0; r4 = n2 - r3 * 10; y = r4; n3();}
if (n2 >= 0 & n2 < 10) {x = -4; y = 10; n3(); x = 0; r4 = n2; y = r4; n3();}
}
void NB4() {
if (m2 >= 10 & m2 < 100) {x = 5; r3 = m2 / 10; y = r3; n3(); x = 9; r4 = m2 - r3 * 10; y = r4; n3();}
if (m2 >= 0 & m2 < 10) {x = 5; y = 0; n3(); x = 9; r4 = m2; y = r4; n3();}
}
void setup() {
//Serial.begin(9600);
lcd.init(); // initialize the lcd
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);// расположение строки со значениями BME280
lcd.print(temp,1);lcd.print((char)223);lcd.print("C ");
lcd.print(h,0);lcd.print("% ");
lcd.print(p,0);lcd.print("mH");
lcd.setCursor(3, 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);}
lcd.setCursor(1, 1);
lcd.createChar(5, customChar5);
lcd.setCursor(3, 2); // расположение дня недели
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;
}
T1(); //большие цифры часов
lcd.setCursor(3, 3); // расположение часов
//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);}
if(set==2&&millis()-times<200){lcd.print(" ");}else{lcd.print(secon/10%10);lcd.print(secon%10);}
}
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 - период
1. Решил перейти с LCD1602 на LCD1604 и столкнулся с проблемой не отображаются русские буквы в дне недели. Причём если отключить большие цифры, то буквы появляются.
LCD1604 имеет только 8 байт для произвольных символов, они все заняты большими цифрами. Одновременно большие цифры и дни недели работать не будут
Большими цифрами занято только 5 байт + 1 байт под значок будильника, если я неправ, поправьте меня
Как прикрутить значок будильника, т.е. при включении будильника загорался значок активности будильника. Сейчас реализована функция включения светодиода.
Я не вижу скетча, не могу ответить
3. При отключении общего питания на схеме, модуль DS3231 останавливается и не продолжает внутренний отсчёт времени (батарейка CR2032, новая и показывает 3,1v)
Уберите с платы часов диод, через него идет заряд батарейки, напряжение становиться больше 3 В, часы начинают глючить. Или замените батарейку на аккумулятор
Если я Вас правильно понял, то на батарейке должно быть 3V и менее?
3B или немного меньше
Вместо зажигания диода Вы можете выводить символ на LCD
if(digitalRead(ALARM)==LOW){digitalWrite(8,HIGH);alarm = 1;}else{digitalWrite(8,LOW);alarm = 0;}
Но значка будильника в наборе LCD1602 нет
Если бы у Вас был бы русифицированный дисплей, то все было бы намного проще
3B или немного меньше
Ради спортивного интереса поставил после аккумулятора (с платой защиты) понижайку и выставил на ней 2,9В. Результат - 0
У меня других вариантов нет, если есть второй модуль примените его, возможно дело в модуле.
Когда питание в общую цепь подаёшь, то на 16 ноге появляется 3,3v, отключаешь общее питание и на 16 ноге 0.
К сожалению второго модуля нет.
forum.rcl-radio.ru → Тестирование скетчей → Часы (DS3231) с будильником (Arduino)
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|