Добрый день! Я снова к вам с просьбой. Можете, пожалуйста,внести поправку в коде так, чтобы при подаче питания на часы, перед тем как высветится время, включался перебор цифр.
И еще такой вопрос, использую режим день-ночь, и заметил что немного не совпадают установленные значения. к примеру, дневной режим у меня стоит на включение в 9-00, а включается он только в 10-00, т.е. разница с настройками 1 час.
Заранее спасибо.
#define ID1 2
#define ID2 4
#define ID4 16
#define ID8 17
#define IN1 25
#define IN2 26
#define IN3 27
#define IN4 14
#define IN5 12
#define IN6 13
#define DP 22
#define LED_PIN 21
#define BUTTON_PIN 19
#include <WiFi.h>
#include <NTPClient.h> // http://rcl-radio.ru/wp-content/uploads/2019/11/ntpclientmaster.zip
#include <WiFiUdp.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <EEPROM.h>
#include "esp_system.h"
#ifndef APSSID
#define APSSID "ESPap"
#define APPSK "12345678"
#endif
const char *ssid = APSSID;
const char *password = APPSK;
WebServer server(80);
WiFiUDP ntpUDP;
///////////////// https://www.ntppool.org/zone/@ - другие сервера /////////////////////////////
///////////////// для России - ru.pool.ntp.org //////////////////////////////////////////////////
NTPClient timeClient(ntpUDP, "pool.ntp.org", 21600,3600123);// 21600 - временной сдвиг в секундах от UTC
int ms, ss, mm, hh, i, an, segm, brignes, brignes_low, end_night, start_night;
long a[6];
unsigned long times, sum, times1, times2, stop_ms;
byte len_ssid, len_pass;
int utc, annti;
hw_timer_t * timer = NULL;
volatile SemaphoreHandle_t timerSemaphore;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
byte lastButtonState = LOW;
byte ledState = LOW;
unsigned long debounceDuration = 50; // millis
unsigned long lastTimeButtonStateChanged = 0;
void IRAM_ATTR onTimer() {
portENTER_CRITICAL_ISR(&timerMux);
switch(i){
case 0: an=10;anod();delayMicroseconds(2000);segm=a[0]; an=0; segment();anod();break;
case 1: an=10;anod();delayMicroseconds(2000);segm=a[1]; an=1; segment();anod();break;
case 2: an=10;anod();delayMicroseconds(2000);segm=a[2]; an=2; segment();anod();break;
case 3: an=10;anod();delayMicroseconds(2000);segm=a[3]; an=3; segment();anod();break;
case 4: an=10;anod();delayMicroseconds(2000);segm=a[4]; an=4; segment();anod();break;
case 5: an=10;anod();delayMicroseconds(2000);segm=a[5]; an=5; segment();anod();break;
}
i++;if(i>5){i=0;}
portEXIT_CRITICAL_ISR(&timerMux);
xSemaphoreGiveFromISR(timerSemaphore, NULL);
}
void setup(){
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
timerSemaphore = xSemaphoreCreateBinary();
//////// GPIO ///////////////
pinMode(15,OUTPUT);
pinMode(23,INPUT_PULLUP);// D23
digitalWrite(15,HIGH);
Serial.begin(9600);
///////// PWM /////////////////////////
ledcSetup(2, 25000, 8); // 25000 kHz / 8 bit / cannel 2
ledcAttachPin(15, 2); // D15 / cannel 2
ledcWrite(2, 255-brignes);
delay(4000);
//////// AP /////////////////
if(digitalRead(23)==LOW){
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
server.on("/", handleRoot);
server.on("/ok", handleOk);
server.begin();
Serial.println("HTTP server started");
//delay(1000);
}
else{
//////// STA ///////////////
WiFi.mode( WIFI_STA);
EEPROM.begin(512);
len_ssid = EEPROM.read(96);
len_pass = EEPROM.read(97);
utc = EEPROM.read(201);
brignes = EEPROM.read(200);
brignes_low = EEPROM.read(202);
start_night = EEPROM.read(203);
end_night = EEPROM.read(204);
annti = EEPROM.read(205);
//delay(1000);
if(brignes > 150){brignes=150;}
if(brignes_low > 150){brignes_low=150;}
if(len_pass > 64) len_pass = 0;
//delay(1000);
/////// READ EEPROM
unsigned char* buf_ssid = new unsigned char[32];
unsigned char* buf_pass = new unsigned char[64];
for(byte i = 0; i < len_ssid; i++) buf_ssid[i] = char(EEPROM.read(i));
buf_ssid[len_ssid] = '\x0';
const char *ssid = (const char*)buf_ssid;
for(byte i = 0; i < len_pass; i++) buf_pass[i] = char(EEPROM.read(i + 32));
const char *pass = (const char*)buf_pass;
buf_pass[len_pass] = '\x0';
delay(2000);
Serial.print("SSID: ");Serial.print(ssid);Serial.print(" ");Serial.print("Password: ");Serial.println(pass);
/////// connection
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED){delay (10);Serial.print (".");digitalWrite(15,HIGH);}
Serial.println();Serial.print("Connected to ");Serial.println(ssid);Serial.print("IP address: ");Serial.println(WiFi.localIP());
server.begin();
server.on("/", web);
server.on("/reset", web0);
//delay(1000);
}
///////// TIMER 3 /////////////////////
timer = timerBegin(3, 8000, true);
timerAttachInterrupt(timer, &onTimer, false);
timerAlarmWrite(timer, 35, true);
timerAlarmEnable(timer);
//delay(1000);
///////////////////////////////////////
pinMode(IN1,OUTPUT);pinMode(IN2,OUTPUT);pinMode(IN3,OUTPUT); pinMode(IN4,OUTPUT); pinMode(IN5,OUTPUT);
pinMode(IN6,OUTPUT); pinMode(ID1,OUTPUT); pinMode(ID2,OUTPUT); pinMode(ID4,OUTPUT); pinMode(ID8,OUTPUT);
pinMode(DP,OUTPUT);
timeClient.setTimeOffset(utc*1800);
//delay(6000);
}
void loop(){
if (millis() - lastTimeButtonStateChanged > debounceDuration) {
byte buttonState = digitalRead(BUTTON_PIN);
if (buttonState != lastButtonState) {
lastTimeButtonStateChanged = millis();
lastButtonState = buttonState;
if (buttonState == LOW) {
ledState = (ledState == HIGH) ? LOW: HIGH;
digitalWrite(LED_PIN, ledState);
}
}
}
if(millis()-times2<500){digitalWrite(DP,LOW);}else{digitalWrite(DP,HIGH);}
if(millis()-times2>999){times2=millis();}
delay(100);
server.handleClient();
if(digitalRead(23)==HIGH){
/////////////// times ////////////////////////////
if(millis()-times>=1000){times=millis();
while(!timeClient.update()){timeClient.forceUpdate();}
hh = timeClient.getHours();
mm = timeClient.getMinutes();
ss = timeClient.getSeconds();
Serial.print(hh/10);Serial.print(hh%10);Serial.print(":");Serial.print(mm/10);Serial.print(mm%10);Serial.print(":");Serial.print(ss/10);Serial.println(ss%10);
///// brightness
if(hh>=0&&hh<=end_night||hh>=start_night){ledcWrite(2, 255-brignes_low); }else {ledcWrite(2, 255-brignes);}
}
sum = hh*10000+mm*100+ss;
///////// ///////////////
switch(annti){
// case 1: if(ss<10){anti();}break;
// case 2: if((mm==15||mm==45)&&ss<10){anti();}break;
// case 3: if((mm==15||mm==30||mm==45)&&ss<10){anti();}break;
case 1: if(ss==59){ms=0;}
if(ss<10&&ms<=9){anti();}break;
case 2: if(ss==59){ms=0;}
if((mm==5||mm==10||mm==15||mm==20||mm==25||mm==30||mm==35||mm==40||mm==45||mm==50||mm==55||mm==00)&&ss<10){anti();}break;
}
a[0]=sum/100000;
a[1]=sum/10000%10;
a[2]=sum/1000%10;
a[3]=sum/100%10;
a[4]=sum/10%10;
a[5]=sum%10;
}
}// loop
void segment(){
switch(segm){
case 0: digitalWrite(ID8,LOW);digitalWrite(ID4,LOW);digitalWrite(ID2,LOW);digitalWrite(ID1,LOW);break; // DEC 0 = 0b0000
case 1: digitalWrite(ID8,LOW);digitalWrite(ID4,LOW);digitalWrite(ID2,LOW);digitalWrite(ID1,HIGH);break; // DEC 1 = 0b0001
case 2: digitalWrite(ID8,LOW);digitalWrite(ID4,LOW);digitalWrite(ID2,HIGH);digitalWrite(ID1,LOW);break; // DEC 2 = 0b0010
case 3: digitalWrite(ID8,LOW);digitalWrite(ID4,LOW);digitalWrite(ID2,HIGH);digitalWrite(ID1,HIGH);break; // DEC 3 = 0b0011
case 4: digitalWrite(ID8,LOW);digitalWrite(ID4,HIGH);digitalWrite(ID2,LOW);digitalWrite(ID1,LOW);break; // DEC 4 = 0b0100
case 5: digitalWrite(ID8,LOW);digitalWrite(ID4,HIGH);digitalWrite(ID2,LOW);digitalWrite(ID1,HIGH);break; // DEC 5 = 0b0101
case 6: digitalWrite(ID8,LOW);digitalWrite(ID4,HIGH);digitalWrite(ID2,HIGH);digitalWrite(ID1,LOW);break; // DEC 6 = 0b0110
case 7: digitalWrite(ID8,LOW);digitalWrite(ID4,HIGH);digitalWrite(ID2,HIGH);digitalWrite(ID1,HIGH);break; // DEC 7 = 0b0111
case 8: digitalWrite(ID8,HIGH);digitalWrite(ID4,LOW);digitalWrite(ID2,LOW);digitalWrite(ID1,LOW);break; // DEC 8 = 0b1000
case 9: digitalWrite(ID8,HIGH);digitalWrite(ID4,LOW);digitalWrite(ID2,LOW);digitalWrite(ID1,HIGH);break; // DEC 9 = 0b1001
case 10:digitalWrite(ID8,HIGH);digitalWrite(ID4,HIGH);digitalWrite(ID2,HIGH);digitalWrite(ID1,HIGH);break; // Пусто = 0b1111
}}
void anod(){
switch(an){
case 0: digitalWrite(IN1,HIGH);digitalWrite(IN2,LOW);digitalWrite(IN3,LOW);digitalWrite(IN4,LOW);digitalWrite(IN5,LOW);digitalWrite(IN6,LOW);break;
case 1: digitalWrite(IN1,LOW);digitalWrite(IN2,HIGH);digitalWrite(IN3,LOW);digitalWrite(IN4,LOW);digitalWrite(IN5,LOW);digitalWrite(IN6,LOW);break;
case 2: digitalWrite(IN1,LOW);digitalWrite(IN2,LOW);digitalWrite(IN3,HIGH);digitalWrite(IN4,LOW);digitalWrite(IN5,LOW);digitalWrite(IN6,LOW);break;
case 3: digitalWrite(IN1,LOW);digitalWrite(IN2,LOW);digitalWrite(IN3,LOW);digitalWrite(IN4,HIGH);digitalWrite(IN5,LOW);digitalWrite(IN6,LOW);break;
case 4: digitalWrite(IN1,LOW);digitalWrite(IN2,LOW);digitalWrite(IN3,LOW);digitalWrite(IN4,LOW);digitalWrite(IN5,HIGH);digitalWrite(IN6,LOW);break;
case 5: digitalWrite(IN1,LOW);digitalWrite(IN2,LOW);digitalWrite(IN3,LOW);digitalWrite(IN4,LOW);digitalWrite(IN5,LOW);digitalWrite(IN6,HIGH);break;
case 10:digitalWrite(IN1,LOW);digitalWrite(IN2,LOW);digitalWrite(IN3,LOW);digitalWrite(IN4,LOW);digitalWrite(IN5,LOW);digitalWrite(IN6,LOW);break;
}}
void web(){
timerAlarmWrite(timer, 35, false);
delay(300);
String webPage = "<meta charset='utf-8'><meta name='viewport' content='width=480, user-scalable=no' />";
//style
webPage += "<head><style>.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}";
webPage += "#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}";
webPage += "#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}";
webPage += "#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}";
webPage += "#menu1 a:hover{color:#fff; background:#555;}";
webPage += "#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}";
webPage += "</style></head>";
/////////////
webPage += "<TABLE class='tab1' align='center' width='470' BORDER='1' cellspacing='0' cellpadding='5'>";
webPage +="<td colspan='2'><h1><center>ESP32<br>Страница настройки Интернет часов</h1>";
webPage +="<tr><td colspan='2'><center><big>Текущее время: ";
webPage += hh/10;webPage += hh%10; webPage +=":";webPage +=mm/10;
webPage += mm%10; webPage +=":";webPage +=ss/10;webPage += ss%10;
webPage += "</center>";
webPage += "<form method='POST' action='reset' >";
webPage += "<tr><td colspan='2'><input name='time_utc' autocomplete='off' maxlength='3' size='1'> Временной сдвиг UTC (30 мин)";
webPage += "<br><small>Установлено: ";EEPROM.begin(512);webPage += EEPROM.read(201);
webPage += " (";webPage += utc*0.5;webPage += " ч.)";
webPage += "<tr><td><input name='brignes' autocomplete='off' maxlength='3' size='1'> Яркость день 80-120";
webPage += "<br><small>Установлено: ";EEPROM.begin(512);webPage += EEPROM.read(200);
webPage += "<td><input name='brignes_low' autocomplete='off' maxlength='3' size='1'> Яркость ночь 80-120";
webPage += "<br><small>Установлено: ";EEPROM.begin(512);webPage += EEPROM.read(202);
webPage += "<tr><td colspan='2'><center> Время работы ночного режима подсветки <tr>";
webPage += "<tr><td> Начало (18-23 ч) <input name='start_night' autocomplete='off' maxlength='3' size='1'>";
webPage += "<br><small>Установлено: ";EEPROM.begin(512);webPage += EEPROM.read(203);
webPage += "<td> Конец: (1-12 ч) <input name='end_night' autocomplete='off' maxlength='3' size='1'>";
webPage += "<br><small>Установлено: ";EEPROM.begin(512);webPage += EEPROM.read(204);
webPage += "<tr><td colspan='2'><input name='annti' autocomplete='off' maxlength='3' size='1'> Антиотравление катодов индикаторов";
webPage += "<center><br><small>1 - каждую минуту, 2 - один раз в пять минут, 3 - отключено. Установлено: ";EEPROM.begin(512);webPage += EEPROM.read(205);
webPage += "<tr><td colspan='2'><center><br><input type=SUBMIT value='Сохранить настройки'>";
webPage += "</form>";
webPage += "<center><br>Заполните все ячейки формы, незаполненная ячейка формы не изменит ранее установленный параметр";
server.send(200, "text/html", webPage);
timerAlarmWrite(timer, 35, true);
timerAlarmEnable(timer);
}
void sumbit(){
if (server.args() > 0 ) {
for ( uint8_t i = 0; i < server.args(); i++ ) {
if (server.argName(i) == "brignes"){brignes = server.arg(i).toInt();}
if (server.argName(i) == "time_utc"){utc = server.arg(i).toInt();}
if (server.argName(i) == "brignes_low"){brignes_low = server.arg(i).toInt();}
if (server.argName(i) == "start_night"){start_night = server.arg(i).toInt();}
if (server.argName(i) == "end_night"){end_night = server.arg(i).toInt();}
if (server.argName(i) == "annti"){annti = server.arg(i).toInt();}
}
Serial.println("Save");
if(brignes > 150){brignes=150;} if(brignes < 0){brignes=0;}
if(brignes_low > 150){brignes_low=150;} if(brignes_low < 0){brignes_low=0;}
if(brignes==NULL){}else{EEPROM.write(200,brignes);}
if(utc==NULL){}else{EEPROM.write(201,utc);}
if(brignes_low==NULL){}else{EEPROM.write(202,brignes_low);}
if(start_night==NULL){}else{EEPROM.write(203,start_night);}
if(end_night==NULL){}else{EEPROM.write(204,end_night);}
if(annti==NULL){}else{EEPROM.write(205,annti);}
EEPROM.commit();
EEPROM.end();
EEPROM.begin(512);
brignes = EEPROM.read(200);
utc = EEPROM.read(201);
brignes_low = EEPROM.read(202);
start_night = EEPROM.read(203);
end_night = EEPROM.read(204);
annti = EEPROM.read(205);
timeClient.setTimeOffset(utc*1800);
if(hh>=0&&hh<=6||hh>=23){ledcWrite(2, 255-brignes_low);}else {ledcWrite(2, 255-brignes);}
}}
void handleRoot() {
timerAlarmWrite(timer, 35, false);
delay(300);
String str = "<meta charset='utf-8'><meta name='viewport' content='width=480, user-scalable=no' />";
//style
str += "<head><style>.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}";
str += "#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}";
str += "#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}";
str += "#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}";
str += "#menu1 a:hover{color:#fff; background:#555;}";
str += "#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}";
str += "</style></head>";
////////////
str += "<TABLE class='tab1' align='center' width='470' BORDER='1' cellspacing='0' cellpadding='10'>";
str +="<td><h1><center>ESP32<br>Авторизация</h1>";
str += "<form method='POST' action='ok'>";
str += "<tr><td><input name='ssid' autocomplete='off'><big> Имя Wi-Fi сети";
str += "<tr><td><input name='pswd' autocomplete='off'><big> Пароль";
str += "<tr><td><center><input type=SUBMIT value='Сохранить настройки'>";
str += "</form>";
server.send ( 200, "text/html", str );
timerAlarmWrite(timer, 35, true);
timerAlarmEnable(timer);
}
void handleOk(){
timerAlarmWrite(timer, 35, false);
delay(300);
String ssid_ap;
String pass_ap;
unsigned char* buf = new unsigned char[64];
String str = "<meta charset='utf-8'><meta name='viewport' content='width=480, user-scalable=no' />";;
str += "<body>";
EEPROM.begin(512);
ssid_ap = server.arg(0);
pass_ap = server.arg(1);
if(ssid_ap != ""){
EEPROM.write(96,ssid_ap.length());
EEPROM.write(97,pass_ap.length());
ssid_ap.getBytes(buf, ssid_ap.length() + 1);
for(byte i = 0; i < ssid_ap.length(); i++)
EEPROM.write(i, buf[i]);
pass_ap.getBytes(buf, pass_ap.length() + 1);
for(byte i = 0; i < pass_ap.length(); i++)
EEPROM.write(i + 32, buf[i]);
EEPROM.commit();
EEPROM.end();
const char *ast_ssid_ap = ssid_ap.c_str();
const char *ast_pass_ap = pass_ap.c_str();
/////////////////////////
WiFi.begin(ast_ssid_ap, ast_pass_ap);
// Wait for connection
while (WiFi.status() != WL_CONNECTED){delay (10);Serial.print (".");}
///////////////////////////////////////////////////////////////////////////
str +="<big><center>Конфигурация сохранена в память<br>";
str +="<big><center>Уберите перемычку с D23 и перезагрузите ESP32</p><br>";
str +="<big><b><center>";
str += WiFi.localIP().toString();
str +="</b><hr>";
str +="<a href=\"/\">Return</a> to settings page</br>";
}
else {
str += "<big><center>No WIFI Net</br>\
<a href=\"/\">Return</a> to settings page</br>";
}
str += "</body></html>";
server.send ( 200, "text/html", str );
timerAlarmWrite(timer, 35, true);
timerAlarmEnable(timer);
}
void web0() {
timerAlarmWrite(timer, 35, false);
delay(300);
String str0 = "<meta charset='utf-8'><meta name='viewport' content='width=480, user-scalable=no' />";
str0 += "<center><b><big>Настройки сохранены.<br> Для возврата на предыдущую страницу перейдите по <a href='./'>ссылке</a>";
server.send (200, "text/html", str0);
sumbit();
timerAlarmWrite(timer, 35, true);
timerAlarmEnable(timer);
}
void anti(){
if(millis()-times1>50){ms++; times1=millis();}
//if(ss==59){ms=0;}
//if(ss<10&&ms<=9){
switch(ms){
case 0: sum=000000;break;
case 1: sum=111111;break;
case 2: sum=222222;break;
case 3: sum=333333;break;
case 4: sum=444444;break;
case 5: sum=555555;break;
case 6: sum=666666;break;
case 7: sum=777777;break;
case 8: sum=888888;break;
case 9: sum=999999;break;}
}