Re: Часы с будильником 1602
Надо схему собирать, завтра постараюсь публиковать новый код.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Законченные проекты → Часы с будильником 1602
Надо схему собирать, завтра постараюсь публиковать новый код.
Спасибо, может на праздниках время свободное найдётся и ещё посмотрите заодно там где температура если например +8 градусов то показывает 08 градуса, хочется конечно тоже без 0
Хорошо, что напомнили, а то я уже забыл!
#include <Wire.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h> //Библиотека - http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip // DS3231.zip
DHT dht(2, DHT11); // выход DAT подключен к цыфровому входу 2
DS3231 clock;RTCDateTime DateTime;
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
byte v1[8] = {31,31,31,31,31,31,31,31};
byte v2[8] = {31,31,31, 0, 0, 0, 0, 0};
byte v3[8] = { 0, 0, 0, 0, 0,31,31,31};
byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
byte v5[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
byte v6[8] = { 0, 0,14,31,31,14, 0, 0}; //*
byte v7[8] = { 0, 0, 0, 0, 0, 0,31,31};
byte v8[8] = { 0, 4,14,14,14,31, 4, 0};// alarm
int a[4],digit,sek_old,w,w1,w2,h,t;
byte i,d1,d2,d3,d4,d5,d6,e1,e2,e3;
unsigned long times;
void setup(){ Wire.begin(); clock.begin(); Serial.begin(9600); dht.begin();
//clock.setDateTime(__DATE__, __TIME__);
lcd.init();lcd.backlight();// Включаем подсветку дисплея
//lcd.noBacklight();// Выключаем подсветку дисплея
pinMode(12,INPUT); clock.setOutput(DS3231_1HZ);
lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
}
void loop(){
if(millis()-times>3000){
h = dht.readHumidity();// влажность
t = dht.readTemperature();// температура
}
DateTime=clock.getDateTime();
if(millis()-times<=3000){digit = DateTime.hour*100+DateTime.minute;
if(w1==1){lcd.clear();w1=0;}w=1;
if(digit>999){a[0]=digit/1000;}else{a[0]=11;}
a[1]=digit/100%10;
a[2]=digit/10%10;
a[3]=digit%10%10;
for(i=0;i<4;i++){
switch(i){
case 0: e1=0,e2=1,e3=2;break;
case 1: e1=4,e2=5,e3=6;break;
case 2: e1=9,e2=10,e3=11;break;
case 3: e1=13,e2=14,e3=15;break;}
switch(a[i]){
case 0: d1=1,d2=2,d3=1,d4=1,d5=3,d6=1;break;
case 1: d1=2,d2=1,d3=5,d4=7,d5=1,d6=7;break;
case 2: d1=2,d2=4,d3=1,d4=1,d5=3,d6=3;break;
case 3: d1=2,d2=4,d3=1,d4=3,d5=3,d6=1;break;
case 4: d1=1,d2=3,d3=1,d4=5,d5=5,d6=1;break;
case 5: d1=1,d2=4,d3=2,d4=3,d5=3,d6=1;break;
case 6: d1=1,d2=4,d3=2,d4=1,d5=3,d6=1;break;
case 7: d1=2,d2=2,d3=1,d4=5,d5=5,d6=1;break;
case 8: d1=1,d2=4,d3=1,d4=1,d5=3,d6=1;break;
case 9: d1=1,d2=4,d3=1,d4=3,d5=3,d6=1;break;
case 11: d1=5,d2=5,d3=5,d4=5,d5=5,d6=5;break;
}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}
if(digitalRead(12) == HIGH){lcd.setCursor(7,0);lcd.write((uint8_t)6);}else{ lcd.setCursor(7,0);lcd.write((uint8_t)5);}
if(digitalRead(12) == LOW){lcd.setCursor(8,0);lcd.write((uint8_t)6);}else{ lcd.setCursor(8,0);lcd.write((uint8_t)5);}
// lcd.setCursor(8,0);lcd.write((uint8_t)8);
lcd.setCursor(7,1);if(DateTime.second<10){lcd.print("0");}lcd.print(DateTime.second);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(millis()-times>3000&&millis()-times<6000){digit=t;
if(w==1){lcd.clear();w=0;}w2=1;
if(digit>=10){a[0]=digit/10;}else{a[0]=11;}
a[1]=digit%10;
for(i=0;i<2;i++){
switch(i){
case 0: e1=4,e2=5,e3=6;break;
case 1: e1=8,e2=9,e3=10;break;}
switch(a[i]){
case 0: d1=1,d2=2,d3=1,d4=1,d5=3,d6=1;break;
case 1: d1=2,d2=1,d3=5,d4=7,d5=1,d6=7;break;
case 2: d1=2,d2=4,d3=1,d4=1,d5=3,d6=3;break;
case 3: d1=2,d2=4,d3=1,d4=3,d5=3,d6=1;break;
case 4: d1=1,d2=3,d3=1,d4=5,d5=5,d6=1;break;
case 5: d1=1,d2=4,d3=2,d4=3,d5=3,d6=1;break;
case 6: d1=1,d2=4,d3=2,d4=1,d5=3,d6=1;break;
case 7: d1=2,d2=2,d3=1,d4=5,d5=5,d6=1;break;
case 8: d1=1,d2=4,d3=1,d4=1,d5=3,d6=1;break;
case 9: d1=1,d2=4,d3=1,d4=3,d5=3,d6=1;break;
case 11: d1=5,d2=5,d3=5,d4=5,d5=5,d6=5;break;
}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}
lcd.setCursor(11,0);lcd.print(char(223));
}
///////////////////////////////////////////////////////////////////////////////////////
if(millis()-times>=6000&&millis()-times<9000){digit=h;
if(w2==1){lcd.clear();w2=0;}w1=1;
a[0]=digit/10;
a[1]=digit%10;
for(i=0;i<2;i++){
switch(i){
case 0: e1=4,e2=5,e3=6;break;
case 1: e1=8,e2=9,e3=10;break;}
switch(a[i]){
case 0: d1=1,d2=2,d3=1,d4=1,d5=3,d6=1;break;
case 1: d1=2,d2=1,d3=5,d4=7,d5=1,d6=7;break;
case 2: d1=2,d2=4,d3=1,d4=1,d5=3,d6=3;break;
case 3: d1=2,d2=4,d3=1,d4=3,d5=3,d6=1;break;
case 4: d1=1,d2=3,d3=1,d4=5,d5=5,d6=1;break;
case 5: d1=1,d2=4,d3=2,d4=3,d5=3,d6=1;break;
case 6: d1=1,d2=4,d3=2,d4=1,d5=3,d6=1;break;
case 7: d1=2,d2=2,d3=1,d4=5,d5=5,d6=1;break;
case 8: d1=1,d2=4,d3=1,d4=1,d5=3,d6=1;break;
case 9: d1=1,d2=4,d3=1,d4=3,d5=3,d6=1;break;
case 11: d1=5,d2=5,d3=5,d4=5,d5=5,d6=5;break;
}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}
lcd.setCursor(11,0);lcd.print("%");
}
if(millis()-times>9000){times=millis();}
}// loop
Спасибо работает, но обнаружил баг при первом запуске и при перезагрузке МК на дисплее печатает большой ноль после времени т.е время потом ноль потом температура и влажность
Замените:
if(millis()-times>3000){
h = dht.readHumidity();// влажность
t = dht.readTemperature();// температура
}
на
//if(millis()-times>3000){
h = dht.readHumidity();// влажность
t = dht.readTemperature();// температура
//}
Спасибо помогло, часы моей мечты
Всем привет. Ардуино изучаю не давно. Искал часики с будильником и попал сюда. Нужна помощь.
Имеется:
18B20
RTC_DS1307
LCD 1602
но не могу скеч доделать, все ошибки, дошел до этого (код ниже), а дальше немогу..
хочу как у вас что бы время с температурой менялось и будильник хочу как у вас))
#include <Wire.h>
#include <LiquidCrystal_I2C.h> //Библиотека - http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <iarduino_RTC.h>
iarduino_RTC times(RTC_DS1307, 6, 7, 8); // RST, CLK, DAT
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
byte v1[8] = {31,31,31,31,31,31,31,31};
byte v2[8] = {31,31,31, 0, 0, 0, 0, 0};
byte v3[8] = { 0, 0, 0, 0, 0,31,31,31};
byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
byte v5[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
byte v6[8] = { 0, 0,14,31,31,14, 0, 0}; //*
byte v7[8] = { 0, 0, 0, 0, 0, 0,31,31};
byte v8[8] = { 0, 4,14,14,14,31, 4, 0};// alarm
int a[4],time,sek_old;
byte i,d1,d2,d3,d4,d5,d6,e1,e2,e3;
#include <OneWire.h>
OneWire ds(4);
int BL = 10;
void setup(){ Wire.begin(); times.begin();
//times.settime(0,43,13,24,10,19,4); // Записываем время в модуль: сек, мин, час, дата, месяц, год (2019 = 19), день недели (пон = 1).
lcd.init();lcd.backlight();// Включаем подсветку дисплея
//lcd.noBacklight();// Выключаем подсветку дисплея
lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
analogWrite(BL, 125);
}
void loop(){
byte data[2]; // Место для значения температуры
ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство
ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
delay(100); // Микросхема измеряет температуру, а мы ждем.
ds.reset(); // Теперь готовимся получить значение измеренной температуры
ds.write(0xCC);
ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
// Получаем и считываем ответ
data[0] = ds.read(); // Читаем младший байт значения температуры
data[1] = ds.read(); // А теперь старший
// Формируем итоговое значение:
// - сперва "склеиваем" значение,
// - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625)
float temperature = ((data[1] << 8) | data[0]) * 0.0625;
times.gettime();
time = times.Hours*100+times.minutes;
a[0]=time/1000;
a[1]=time/100%10;
a[2]=time/10%10;
a[3]=time%10%10;
sek_old=times.seconds;
for(i=0;i<4;i++){
switch(i){
case 0: e1=0,e2=1,e3=2;break;
case 1: e1=4,e2=5,e3=6;break;
case 2: e1=9,e2=10,e3=11;break;
case 3: e1=13,e2=14,e3=15;break;}
switch(a[i]){
case 0: d1=1,d2=2,d3=1,d4=1,d5=3,d6=1;break;
case 1: d1=2,d2=1,d3=5,d4=7,d5=1,d6=7;break;
case 2: d1=2,d2=4,d3=1,d4=1,d5=7,d6=7;break;
case 3: d1=2,d2=4,d3=1,d4=3,d5=7,d6=1;break;
case 4: d1=1,d2=7,d3=1,d4=5,d5=5,d6=1;break;
case 5: d1=1,d2=4,d3=2,d4=3,d5=7,d6=1;break;
case 6: d1=1,d2=4,d3=2,d4=1,d5=3,d6=1;break;
case 7: d1=2,d2=2,d3=1,d4=5,d5=5,d6=1;break;
case 8: d1=1,d2=4,d3=1,d4=1,d5=7,d6=1;break;
case 9: d1=1,d2=4,d3=1,d4=3,d5=7,d6=1;break;
}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
}
if(digitalRead(13) == HIGH){lcd.setCursor(7,0);lcd.write((uint8_t)6);}else{ lcd.setCursor(7,0);lcd.write((uint8_t)5);}
lcd.setCursor(8,0);lcd.write((uint8_t)8);
lcd.setCursor(7,1);
if(times.seconds<10){lcd.print("0");}lcd.print(times.seconds);
if(times.Hours>=0&×.Hours<6){lcd.noBacklight();}else{lcd.backlight();}
tone(5,1200,500);
}
Всем привет. Ардуино изучаю не давно. Искал часики с будильником и попал сюда. Нужна помощь.
Имеется:
18B20
RTC_DS1307
LCD 1602но не могу скеч доделать, все ошибки, дошел до этого (код ниже), а дальше немогу..
хочу как у вас что бы время с температурой менялось и будильник хочу как у вас))
18B20 > A0
DS1307(DS3231) SQ >D13
#include <Wire.h>
#include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
#include <DallasTemperature.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/DallasTemperature.zip
#include <LiquidCrystal_I2C.h> //Библиотека - http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip // DS3231.zip
#include <EEPROM.h>
DS3231 clock;RTCDateTime DateTime;
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
OneWire oneWire(A0);// вход датчика 18b20
DallasTemperature t(&oneWire);
byte v1[8] = {31,31,31,31,31,31,31,31};
byte v2[8] = {31,31,31, 0, 0, 0, 0, 0};
byte v3[8] = { 0, 0, 0, 0, 0,31,31,31};
byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
byte v5[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
byte v6[8] = { 0, 0,14,31,31,14, 0, 0}; //*
byte v7[8] = { 0, 0, 0, 0, 0, 0,31,31};
byte v8[8] = { 0, 4,14,14,14,31, 4, 0};// alarm
int a[4],time,k,reg,m,h,w,i0,led,ton,w1,w2,w3;
byte i,d1,d2,d3,d4,d5,d6,e1,e2,e3;
unsigned long eeprom;
byte rom0,rom1,rom2;
void setup(){ Wire.begin(); clock.begin();
pinMode(2,INPUT);pinMode(3,INPUT);pinMode(4,INPUT);pinMode(5,INPUT); // кнопки
pinMode(13,INPUT); // ds3231 SQW
//clock.setDateTime(__DATE__, __TIME__);
lcd.init();lcd.backlight();// Включаем подсветку дисплея
lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
rom0 = EEPROM.read(0);if(rom0>59){EEPROM.update(0,0);}
rom1 = EEPROM.read(1);if(rom1>23){EEPROM.update(1,0);}
rom2 = EEPROM.read(2);if(rom2>3){EEPROM.update(2,0);}
m=rom0;h=rom1;w=rom2;
clock.setOutput(DS3231_1HZ);
t.begin();
t.setResolution(9);//11 бит
}
void loop(){ if(digitalRead(5)==HIGH&&led==0&&w1==0){led=1;lcd.noBacklight();delay(500);}
if(digitalRead(5)==HIGH&&led==1&&w1==0){led=0;lcd.backlight();delay(500);}
i0++;if(i0>4){i0=0;}
if(digitalRead(2)==HIGH){k++;reg=1;lcd.clear();delay(300);}if(k>3){k=0;reg=0;}
if(reg==1) {
if(k==1){
if(digitalRead(3)==HIGH){m++;}if(m>59){m=0;}
if(digitalRead(4)==HIGH){m--;}if(m<0){m=0;}}
if(k==2){
if(digitalRead(3)==HIGH){h++;}if(h>23){h=0;}
if(digitalRead(4)==HIGH){h--;}if(h<0){h=0;}}
if(k==3){
if(digitalRead(3)==HIGH){w++;delay(300);}if(w>3){w=0;}
if(digitalRead(4)==HIGH){w--;delay(300);}if(w<0){w=3;}
}
lcd.setCursor(0,0);lcd.print("Alarm ");
if(i0==1&&k==2){lcd.print(" ");}else{if(h < 10 ){lcd.print("0");}lcd.print(h);} lcd.print(":");
if(i0==1&&k==1){lcd.print(" ");}else{if(m < 10 ){lcd.print("0");}lcd.print(m);}
lcd.setCursor(0,1);
if(i0==1&&k==3){lcd.print(" ");}
if(w==0){lcd.print("every day");} //каждый день 1234567
if(w==1){lcd.print("on weekdays");}//по будням 12345
if(w==2){lcd.print("on weekends");}//по выходным 67
if(w==3){lcd.print("off");}
rom0=m;rom1=h;rom2=w;
eeprom=0;
}
if(reg==0){ if(eeprom==1){EEPROM.update(0,rom0);EEPROM.update(1,rom1);EEPROM.update(2,rom2);}
DateTime=clock.getDateTime();
if(DateTime.second%10>=5&&DateTime.second%10<=8){w3=1;w2=1; t.requestTemperatures();time = t.getTempCByIndex(0);
a[0]=time/10;
a[1]=time%10;
for(i=0;i<2;i++){
switch(i){
case 0: e1=9,e2=10,e3=11;break;
case 1: e1=13,e2=14,e3=15;break;
}
digit();
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
}}
else{w2=0;
if(w3==1){w3=0;lcd.clear();}
time = DateTime.hour*100+DateTime.minute;
a[0]=time/1000;
a[1]=time/100%10;
a[2]=time/10%10;
a[3]=time%10%10;
for(i=0;i<4;i++){
switch(i){
case 0: e1=0,e2=1,e3=2;break;
case 1: e1=4,e2=5,e3=6;break;
case 2: e1=9,e2=10,e3=11;break;
case 3: e1=13,e2=14,e3=15;break;}
digit();
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
}}
if(w2==0){
if(digitalRead(13) == HIGH){lcd.setCursor(7,0);lcd.write((uint8_t)6);}else{ lcd.setCursor(7,0);lcd.write((uint8_t)5);}
lcd.setCursor(7,1);if(DateTime.second<10){lcd.print("0");}lcd.print(DateTime.second);}
else{
lcd.setCursor(0,0);lcd.print("TEMP ");
lcd.setCursor(0,1);lcd.print("DS18B20 ");
}
if(digitalRead(5)==HIGH&&ton==0){lcd.backlight();ton=1;w1=0;delay(300);}
if(DateTime.hour*60+DateTime.minute!=h*60+m){ton=0;}
if(w==0){pic();if(w2==0){lcd.setCursor(8,0);lcd.write((uint8_t)8);}}
else if(w==1&&(DateTime.dayOfWeek<6)){pic();if(w2==0){lcd.setCursor(8,0);lcd.write((uint8_t)8);}}
else if(w==2&&(DateTime.dayOfWeek>5)){pic();if(w2==0){lcd.setCursor(8,0);lcd.write((uint8_t)8);}}
else {lcd.setCursor(8,0);lcd.write((uint8_t)5);}
}//reg=0
eeprom++;
delay(100);
}
void pic(){if(ton==0&&(DateTime.hour*60+DateTime.minute==h*60+m)){w1=1;tone(6,1200,500);delay(500);}}
void digit(){
switch(a[i]){
case 0: d1=1,d2=2,d3=1,d4=1,d5=3,d6=1;break;
case 1: d1=2,d2=1,d3=5,d4=7,d5=1,d6=7;break;
case 2: d1=2,d2=4,d3=1,d4=1,d5=3,d6=3;break;
case 3: d1=2,d2=4,d3=1,d4=3,d5=3,d6=1;break;
case 4: d1=1,d2=3,d3=1,d4=5,d5=5,d6=1;break;
case 5: d1=1,d2=4,d3=2,d4=3,d5=3,d6=1;break;
case 6: d1=1,d2=4,d3=2,d4=1,d5=3,d6=1;break;
case 7: d1=2,d2=2,d3=1,d4=5,d5=5,d6=1;break;
case 8: d1=1,d2=4,d3=1,d4=1,d5=3,d6=1;break;
case 9: d1=1,d2=4,d3=1,d4=3,d5=3,d6=1;break;
}
}
Спасибо, все работает, кроме яркости дисплея (через 10 пин).
delay(100)- наверно вот эта штука дает мерцание..?
Я просто забыл вставить эту функцию
после
t.setResolution(9);//11 бит
добавить
analogWrite(10, 125);
Да это я добавил сам, и мерцание присутствует, что может быть?
Я просто забыл вставить эту функцию
после
t.setResolution(9);//11 бит
добавить
analogWrite(10, 125);
часы бомба, осталось немного), убрать мерцание и припаять кнопки
Как Вы реализуете подсветку?
У меня все работает, мерцания нет, подал ШИМ с D10 на вход led модуля PCF8574
аналогично, ну буду копать..
Как Вы реализуете подсветку?
У меня все работает, мерцания нет, подал ШИМ с D10 на вход led модуля PCF8574
delay(100); - постоянно
delay(10000); - через 10 сек мерцает
https://drive.google.com/file/d/1HQqinW … sp=sharing
Вы не поместили функцию analogWrite(10, 125) в цикл loop()?
шо в лупе шо в сетапе - мерцает, щас код пропробую скинуть
Вы не поместили функцию analogWrite(10, 125) в цикл loop()?
#include <Wire.h>
int BL = 10;
#include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
#include <DallasTemperature.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/DallasTemperature.zip
#include <LiquidCrystal_I2C.h> //Библиотека - http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip // DS3231.zip
#include <EEPROM.h>
DS3231 clock;RTCDateTime DateTime;
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
OneWire oneWire(4);// вход датчика 18b20
DallasTemperature t(&oneWire);
byte v1[8] = {31,31,31,31,31,31,31,31};
byte v2[8] = {31,31,31, 0, 0, 0, 0, 0};
byte v3[8] = { 0, 0, 0, 0, 0,31,31,31};
byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
byte v5[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
byte v6[8] = { 0, 0,14,31,31,14, 0, 0}; //*
byte v7[8] = { 0, 0, 0, 0, 0, 0,31,31};
byte v8[8] = { 0, 4,14,14,14,31, 4, 0};// alarm
int a[4],time,k,reg,m,h,w,i0,led,ton,w1,w2,w3;
byte i,d1,d2,d3,d4,d5,d6,e1,e2,e3;
unsigned long eeprom;
byte rom0,rom1,rom2;
void setup(){
Wire.begin(); clock.begin();
pinMode(2,INPUT);pinMode(3,INPUT);pinMode(4,INPUT);pinMode(5,INPUT); // кнопки
pinMode(13,INPUT); // ds3231 SQW
//clock.setDateTime(__DATE__, __TIME__);
lcd.init();
//lcd.backlight();// Включаем подсветку дисплея
lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
rom0 = EEPROM.read(0);if(rom0>59){EEPROM.update(0,0);}
rom1 = EEPROM.read(1);if(rom1>23){EEPROM.update(1,0);}
rom2 = EEPROM.read(2);if(rom2>3){EEPROM.update(2,0);}
m=rom0;h=rom1;w=rom2;
clock.setOutput(DS3231_1HZ);
t.begin();
t.setResolution(9);//11 бит
analogWrite(10, 125);
}
void loop(){
if(digitalRead(5)==HIGH&&led==0&&w1==0){led=1;lcd.noBacklight();delay(500);}
if(digitalRead(5)==HIGH&&led==1&&w1==0){led=0;lcd.backlight();delay(500);}
i0++;if(i0>4){i0=0;}
if(digitalRead(2)==HIGH){k++;reg=1;lcd.clear();delay(300);}if(k>3){k=0;reg=0;}
if(reg==1) {
if(k==1){
if(digitalRead(3)==HIGH){m++;}if(m>59){m=0;}
if(digitalRead(4)==HIGH){m--;}if(m<0){m=0;}}
if(k==2){
if(digitalRead(3)==HIGH){h++;}if(h>23){h=0;}
if(digitalRead(4)==HIGH){h--;}if(h<0){h=0;}}
if(k==3){
if(digitalRead(3)==HIGH){w++;delay(300);}if(w>3){w=0;}
if(digitalRead(4)==HIGH){w--;delay(300);}if(w<0){w=3;}
}
lcd.setCursor(0,0);lcd.print("Alarm ");
if(i0==1&&k==2){lcd.print(" ");}else{if(h < 10 ){lcd.print("0");}lcd.print(h);} lcd.print(":");
if(i0==1&&k==1){lcd.print(" ");}else{if(m < 10 ){lcd.print("0");}lcd.print(m);}
lcd.setCursor(0,1);
if(i0==1&&k==3){lcd.print(" ");}
if(w==0){lcd.print("every day");} //каждый день 1234567
if(w==1){lcd.print("on weekdays");}//по будням 12345
if(w==2){lcd.print("on weekends");}//по выходным 67
if(w==3){lcd.print("off");}
rom0=m;rom1=h;rom2=w;
eeprom=0;
}
if(reg==0){ if(eeprom==1){EEPROM.update(0,rom0);EEPROM.update(1,rom1);EEPROM.update(2,rom2);}
DateTime=clock.getDateTime();
if(DateTime.second%10>=5&&DateTime.second%10<=8){w3=1;w2=1; t.requestTemperatures();time = t.getTempCByIndex(0);
a[0]=time/10;
a[1]=time%10;
for(i=0;i<2;i++){
switch(i){
case 0: e1=9,e2=10,e3=11;break;
case 1: e1=13,e2=14,e3=15;break;
}
digit();
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
}}
else{w2=0;
if(w3==1){w3=0;lcd.clear();}
time = DateTime.hour*100+DateTime.minute;
a[0]=time/1000;
a[1]=time/100%10;
a[2]=time/10%10;
a[3]=time%10%10;
for(i=0;i<4;i++){
switch(i){
case 0: e1=0,e2=1,e3=2;break;
case 1: e1=4,e2=5,e3=6;break;
case 2: e1=9,e2=10,e3=11;break;
case 3: e1=13,e2=14,e3=15;break;}
digit();
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
}}
if(w2==0){
if(digitalRead(13) == HIGH){lcd.setCursor(7,0);lcd.write((uint8_t)6);}else{ lcd.setCursor(7,0);lcd.write((uint8_t)5);}
lcd.setCursor(7,1);if(DateTime.second<10){lcd.print("0");}lcd.print(DateTime.second);}
else{
lcd.setCursor(0,0);lcd.print("TEMP ");
lcd.setCursor(0,1);lcd.print("DS18B20 ");
}
if(digitalRead(5)==HIGH&&ton==0){lcd.backlight();ton=1;w1=0;delay(300);}
if(DateTime.hour*60+DateTime.minute!=h*60+m){ton=0;}
if(w==0){pic();if(w2==0){lcd.setCursor(8,0);lcd.write((uint8_t)8);}}
else if(w==1&&(DateTime.dayOfWeek<6)){pic();if(w2==0){lcd.setCursor(8,0);lcd.write((uint8_t)8);}}
else if(w==2&&(DateTime.dayOfWeek>5)){pic();if(w2==0){lcd.setCursor(8,0);lcd.write((uint8_t)8);}}
else {lcd.setCursor(8,0);lcd.write((uint8_t)5);}
}//reg=0
eeprom++;
delay(100);
}
void pic(){if(ton==0&&(DateTime.hour*60+DateTime.minute==h*60+m)){w1=1;tone(6,1200,500);delay(500);}}
void digit(){
switch(a[i]){
case 0: d1=1,d2=2,d3=1,d4=1,d5=3,d6=1;break;
case 1: d1=2,d2=1,d3=5,d4=7,d5=1,d6=7;break;
case 2: d1=2,d2=4,d3=1,d4=1,d5=3,d6=3;break;
case 3: d1=2,d2=4,d3=1,d4=3,d5=3,d6=1;break;
case 4: d1=1,d2=3,d3=1,d4=5,d5=5,d6=1;break;
case 5: d1=1,d2=4,d3=2,d4=3,d5=3,d6=1;break;
case 6: d1=1,d2=4,d3=2,d4=1,d5=3,d6=1;break;
case 7: d1=2,d2=2,d3=1,d4=5,d5=5,d6=1;break;
case 8: d1=1,d2=4,d3=1,d4=1,d5=3,d6=1;break;
case 9: d1=1,d2=4,d3=1,d4=3,d5=3,d6=1;break;
}
}
У меня тоже самое если нажать и удерживать кнопку на D5
а 5 ка у нас что? у меня пока кнопок нет
У меня тоже самое если нажать и удерживать кнопку на D5
D5 - кнопка гашения экрана, нет подтяжки входа через 10К к GND
а 5 ка у нас что? у меня пока кнопок нет
У меня тоже самое если нажать и удерживать кнопку на D5
а
а что пока закоментить?
D5 - кнопка гашения экрана, нет подтяжки входа через 10К к GND
Подайте на вход D5 землю
Почему так?
OneWire oneWire(4);// вход датчика 18b20
D4 занят под кнопку
Спасибо, распределил пины и заработало! Ну Вы молодцом
Почему так?
OneWire oneWire(4);// вход датчика 18b20
D4 занят под кнопку
forum.rcl-radio.ru → Законченные проекты → Часы с будильником 1602
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|