<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; ESP32 ретро часы (разработка)]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=292&amp;type=atom" />
	<updated>2025-02-25T00:14:44Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=292</id>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11431#p11431" />
			<content type="html"><![CDATA[<p>Я в setup добавил:</p><div class="codebox"><pre><code> for(int cikk=0;cikk&lt;=9;cikk++){

switch(cikk){
    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;
}

  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;
 delay(200);
}  </code></pre></div><p>Время обновления определяется:</p><p>delay(200);</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-25T00:14:44Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11431#p11431</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11429#p11429" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>liman324 пишет:</cite><blockquote><div class="quotebox"><blockquote><p>Добрый день! Я снова к вам с просьбой. Можете, пожалуйста,внести поправку в коде так, чтобы при включении часов, перед тем как высветится время, включался перебор цифр.</p></blockquote></div><p>Добавил код в setup не уверен что будет работать:</p><div class="codebox"><pre><code>#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 &lt;WiFi.h&gt;
#include &lt;NTPClient.h&gt;         // http://rcl-radio.ru/wp-content/uploads/2019/11/ntpclientmaster.zip
#include &lt;WiFiUdp.h&gt;
#include &lt;WiFiClient.h&gt;
#include &lt;WebServer.h&gt;
#include &lt;ESPmDNS.h&gt;
#include &lt;EEPROM.h&gt;
#include &quot;esp_system.h&quot;

#ifndef APSSID
#define APSSID &quot;ESPap&quot;
#define APPSK  &quot;12345678&quot;
#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, &quot;pool.ntp.org&quot;, 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(&amp;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&gt;5){i=0;}
    portEXIT_CRITICAL_ISR(&amp;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(&quot;AP IP address: &quot;);
  Serial.println(myIP);
  server.on(&quot;/&quot;, handleRoot);
  server.on(&quot;/ok&quot;, handleOk);
  server.begin();
  Serial.println(&quot;HTTP server started&quot;);  
  //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 &gt; 150){brignes=150;} 
  if(brignes_low &gt; 150){brignes_low=150;} 
  if(len_pass &gt; 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 &lt; len_ssid; i++) buf_ssid[i] = char(EEPROM.read(i));
  buf_ssid[len_ssid] = &#039;\x0&#039;;
  const char *ssid  = (const char*)buf_ssid;
 for(byte i = 0; i &lt; len_pass; i++) buf_pass[i] = char(EEPROM.read(i + 32));
  const char *pass  = (const char*)buf_pass;
  buf_pass[len_pass] = &#039;\x0&#039;;
  delay(2000);
  Serial.print(&quot;SSID: &quot;);Serial.print(ssid);Serial.print(&quot;   &quot;);Serial.print(&quot;Password: &quot;);Serial.println(pass);
  /////// connection       
  WiFi.begin(ssid, pass);
 while (WiFi.status() != WL_CONNECTED){delay (10);Serial.print (&quot;.&quot;);digitalWrite(15,HIGH);}
  Serial.println();Serial.print(&quot;Connected to &quot;);Serial.println(ssid);Serial.print(&quot;IP address: &quot;);Serial.println(WiFi.localIP());
  server.begin();
  server.on(&quot;/&quot;, web);
  server.on(&quot;/reset&quot;, web0);    
  //delay(1000);
}
  ///////// TIMER 3 /////////////////////
  timer = timerBegin(3, 8000, true);
  timerAttachInterrupt(timer, &amp;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);  

 for(int cikk=0;cikk&lt;=9;cikk++){

switch(cikk){
    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;
}

  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;
 delay(200);
}    
}

void loop(){
  if (millis() - lastTimeButtonStateChanged &gt; 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&lt;500){digitalWrite(DP,LOW);}else{digitalWrite(DP,HIGH);}
  if(millis()-times2&gt;999){times2=millis();}
  delay(100);
  server.handleClient();
 if(digitalRead(23)==HIGH){
/////////////// times ////////////////////////////
  if(millis()-times&gt;=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(&quot;:&quot;);Serial.print(mm/10);Serial.print(mm%10);Serial.print(&quot;:&quot;);Serial.print(ss/10);Serial.println(ss%10);
///// brightness  

   if(hh&gt;=0&amp;&amp;hh&lt;=end_night||hh&gt;=start_night){ledcWrite(2, 255-brignes_low); }else {ledcWrite(2, 255-brignes);}
}
  sum = hh*10000+mm*100+ss;
///////// ///////////////
 switch(annti){
 // case 1: if(ss&lt;10){anti();}break;
 // case 2: if((mm==15||mm==45)&amp;&amp;ss&lt;10){anti();}break;
 // case 3: if((mm==15||mm==30||mm==45)&amp;&amp;ss&lt;10){anti();}break;
 case 1: if(ss==59){ms=0;}
         if(ss&lt;10&amp;&amp;ms&lt;=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)&amp;&amp;ss&lt;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 = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;
   //style
          webPage += &quot;&lt;head&gt;&lt;style&gt;.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}&quot;;
          webPage += &quot;#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}&quot;;
          webPage += &quot;#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}&quot;;
          webPage += &quot;#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          webPage += &quot;#menu1 a:hover{color:#fff; background:#555;}&quot;;
          webPage += &quot;#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          webPage += &quot;&lt;/style&gt;&lt;/head&gt;&quot;;
    /////////////   
          webPage += &quot;&lt;TABLE class=&#039;tab1&#039; align=&#039;center&#039; width=&#039;470&#039; BORDER=&#039;1&#039; cellspacing=&#039;0&#039; cellpadding=&#039;5&#039;&gt;&quot;;
          webPage +=&quot;&lt;td colspan=&#039;2&#039;&gt;&lt;h1&gt;&lt;center&gt;ESP32&lt;br&gt;Страница настройки Интернет часов&lt;/h1&gt;&quot;;
          webPage +=&quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;center&gt;&lt;big&gt;Текущее время: &quot;;         
          webPage += hh/10;webPage += hh%10; webPage +=&quot;:&quot;;webPage +=mm/10;
          webPage += mm%10; webPage +=&quot;:&quot;;webPage +=ss/10;webPage += ss%10;
          webPage += &quot;&lt;/center&gt;&quot;;
          webPage += &quot;&lt;form method=&#039;POST&#039; action=&#039;reset&#039; &gt;&quot;;
          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;input name=&#039;time_utc&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Временной сдвиг UTC (30 мин)&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(201);
          webPage += &quot; (&quot;;webPage += utc*0.5;webPage += &quot; ч.)&quot;;
          webPage += &quot;&lt;tr&gt;&lt;td&gt;&lt;input name=&#039;brignes&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Яркость день 80-120&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(200);
          webPage += &quot;&lt;td&gt;&lt;input name=&#039;brignes_low&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Яркость ночь 80-120&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(202);
          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;center&gt; Время работы ночного режима подсветки &lt;tr&gt;&quot;;
          webPage += &quot;&lt;tr&gt;&lt;td&gt; Начало (18-23 ч) &lt;input name=&#039;start_night&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt;&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(203);
          webPage += &quot;&lt;td&gt; Конец: (1-12 ч) &lt;input name=&#039;end_night&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt;&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(204); 
          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;input name=&#039;annti&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Антиотравление катодов индикаторов&quot;;
          webPage += &quot;&lt;center&gt;&lt;br&gt;&lt;small&gt;1 - каждую минуту, 2 - один раз в пять минут, 3 - отключено. Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(205);
          

          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;center&gt;&lt;br&gt;&lt;input type=SUBMIT value=&#039;Сохранить настройки&#039;&gt;&quot;;
          webPage += &quot;&lt;/form&gt;&quot;;
          webPage += &quot;&lt;center&gt;&lt;br&gt;Заполните все ячейки формы, незаполненная ячейка формы не изменит ранее установленный параметр&quot;;
         
          server.send(200, &quot;text/html&quot;, webPage);
          timerAlarmWrite(timer, 35, true);
          timerAlarmEnable(timer); 
      
}

void sumbit(){ 
     if (server.args() &gt; 0 ) {
   for ( uint8_t i = 0; i &lt; server.args(); i++ ) {
     if (server.argName(i) == &quot;brignes&quot;){brignes = server.arg(i).toInt();}
     if (server.argName(i) == &quot;time_utc&quot;){utc = server.arg(i).toInt();}
     if (server.argName(i) == &quot;brignes_low&quot;){brignes_low = server.arg(i).toInt();}
     if (server.argName(i) == &quot;start_night&quot;){start_night = server.arg(i).toInt();}
     if (server.argName(i) == &quot;end_night&quot;){end_night = server.arg(i).toInt();}
     if (server.argName(i) == &quot;annti&quot;){annti = server.arg(i).toInt();}
     
  }
    Serial.println(&quot;Save&quot;);
    if(brignes &gt; 150){brignes=150;} if(brignes &lt; 0){brignes=0;}
    if(brignes_low &gt; 150){brignes_low=150;} if(brignes_low &lt; 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&gt;=0&amp;&amp;hh&lt;=6||hh&gt;=23){ledcWrite(2, 255-brignes_low);}else {ledcWrite(2, 255-brignes);}
}}  

void handleRoot() { 
   timerAlarmWrite(timer, 35, false);
   delay(300);
   String str = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;
   //style
          str += &quot;&lt;head&gt;&lt;style&gt;.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}&quot;;
          str += &quot;#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}&quot;;
          str += &quot;#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}&quot;;
          str += &quot;#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          str += &quot;#menu1 a:hover{color:#fff; background:#555;}&quot;;
          str += &quot;#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          str += &quot;&lt;/style&gt;&lt;/head&gt;&quot;;
   ////////////       
          str += &quot;&lt;TABLE class=&#039;tab1&#039; align=&#039;center&#039; width=&#039;470&#039; BORDER=&#039;1&#039; cellspacing=&#039;0&#039; cellpadding=&#039;10&#039;&gt;&quot;;
          str +=&quot;&lt;td&gt;&lt;h1&gt;&lt;center&gt;ESP32&lt;br&gt;Авторизация&lt;/h1&gt;&quot;;
          str += &quot;&lt;form method=&#039;POST&#039; action=&#039;ok&#039;&gt;&quot;;
          str += &quot;&lt;tr&gt;&lt;td&gt;&lt;input name=&#039;ssid&#039;  autocomplete=&#039;off&#039;&gt;&lt;big&gt; Имя Wi-Fi сети&quot;;
          str += &quot;&lt;tr&gt;&lt;td&gt;&lt;input name=&#039;pswd&#039;  autocomplete=&#039;off&#039;&gt;&lt;big&gt; Пароль&quot;;
          str += &quot;&lt;tr&gt;&lt;td&gt;&lt;center&gt;&lt;input type=SUBMIT value=&#039;Сохранить настройки&#039;&gt;&quot;;
          str += &quot;&lt;/form&gt;&quot;;
          server.send ( 200, &quot;text/html&quot;, 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 = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;;
  str += &quot;&lt;body&gt;&quot;;
 
  EEPROM.begin(512);
 
  ssid_ap = server.arg(0);
  pass_ap = server.arg(1);

  if(ssid_ap != &quot;&quot;){
    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 &lt; ssid_ap.length(); i++)
    EEPROM.write(i, buf[i]); 
    pass_ap.getBytes(buf, pass_ap.length() + 1);
    for(byte i = 0; i &lt; 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 (&quot;.&quot;);}
 ///////////////////////////////////////////////////////////////////////////  
    str +=&quot;&lt;big&gt;&lt;center&gt;Конфигурация сохранена в память&lt;br&gt;&quot;;
    str +=&quot;&lt;big&gt;&lt;center&gt;Уберите перемычку с D23 и перезагрузите ESP32&lt;/p&gt;&lt;br&gt;&quot;;
    str +=&quot;&lt;big&gt;&lt;b&gt;&lt;center&gt;&quot;;
    str += WiFi.localIP().toString();
    str +=&quot;&lt;/b&gt;&lt;hr&gt;&quot;;
    str +=&quot;&lt;a href=\&quot;/\&quot;&gt;Return&lt;/a&gt; to settings page&lt;/br&gt;&quot;;
  }
  else {
    str += &quot;&lt;big&gt;&lt;center&gt;No WIFI Net&lt;/br&gt;\
   &lt;a href=\&quot;/\&quot;&gt;Return&lt;/a&gt; to settings page&lt;/br&gt;&quot;;
  }
  str += &quot;&lt;/body&gt;&lt;/html&gt;&quot;;
  server.send ( 200, &quot;text/html&quot;, str );
  timerAlarmWrite(timer, 35, true);
  timerAlarmEnable(timer); 
}


void web0() { 
   timerAlarmWrite(timer, 35, false);
   delay(300);
   String str0 = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;
          str0 += &quot;&lt;center&gt;&lt;b&gt;&lt;big&gt;Настройки сохранены.&lt;br&gt; Для возврата на предыдущую страницу перейдите по &lt;a href=&#039;./&#039;&gt;ссылке&lt;/a&gt;&quot;;
   server.send (200, &quot;text/html&quot;, str0);
   sumbit();
   timerAlarmWrite(timer, 35, true);
   timerAlarmEnable(timer); 
} 

void anti(){
    if(millis()-times1&gt;50){ms++; times1=millis();}
//if(ss==59){ms=0;}
//if(ss&lt;10&amp;&amp;ms&lt;=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;}
}</code></pre></div></blockquote></div><p>Я думаю что в этом абзаце нужно внести корректировку, не привязанную ко времени, вот только какую...</p><div class="codebox"><pre><code> switch(annti){
 // case 1: if(ss&lt;10){anti();}break;
 // case 2: if((mm==15||mm==45)&amp;&amp;ss&lt;10){anti();}break;
 // case 3: if((mm==15||mm==30||mm==45)&amp;&amp;ss&lt;10){anti();}break;
 case 1: if(ss==59){ms=0;}
         if(ss&lt;10&amp;&amp;ms&lt;=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)&amp;&amp;ss&lt;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;
  
   }</code></pre></div>]]></content>
			<author>
				<name><![CDATA[MORO-1986]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1198</uri>
			</author>
			<updated>2025-02-24T15:53:41Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11429#p11429</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11428#p11428" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>liman324 пишет:</cite><blockquote><div class="quotebox"><blockquote><p>Добрый день! Я снова к вам с просьбой. Можете, пожалуйста,внести поправку в коде так, чтобы при включении часов, перед тем как высветится время, включался перебор цифр.</p></blockquote></div><p>Добавил код в setup не уверен что будет работать:</p><div class="codebox"><pre><code>#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 &lt;WiFi.h&gt;
#include &lt;NTPClient.h&gt;         // http://rcl-radio.ru/wp-content/uploads/2019/11/ntpclientmaster.zip
#include &lt;WiFiUdp.h&gt;
#include &lt;WiFiClient.h&gt;
#include &lt;WebServer.h&gt;
#include &lt;ESPmDNS.h&gt;
#include &lt;EEPROM.h&gt;
#include &quot;esp_system.h&quot;

#ifndef APSSID
#define APSSID &quot;ESPap&quot;
#define APPSK  &quot;12345678&quot;
#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, &quot;pool.ntp.org&quot;, 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(&amp;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&gt;5){i=0;}
    portEXIT_CRITICAL_ISR(&amp;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(&quot;AP IP address: &quot;);
  Serial.println(myIP);
  server.on(&quot;/&quot;, handleRoot);
  server.on(&quot;/ok&quot;, handleOk);
  server.begin();
  Serial.println(&quot;HTTP server started&quot;);  
  //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 &gt; 150){brignes=150;} 
  if(brignes_low &gt; 150){brignes_low=150;} 
  if(len_pass &gt; 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 &lt; len_ssid; i++) buf_ssid[i] = char(EEPROM.read(i));
  buf_ssid[len_ssid] = &#039;\x0&#039;;
  const char *ssid  = (const char*)buf_ssid;
 for(byte i = 0; i &lt; len_pass; i++) buf_pass[i] = char(EEPROM.read(i + 32));
  const char *pass  = (const char*)buf_pass;
  buf_pass[len_pass] = &#039;\x0&#039;;
  delay(2000);
  Serial.print(&quot;SSID: &quot;);Serial.print(ssid);Serial.print(&quot;   &quot;);Serial.print(&quot;Password: &quot;);Serial.println(pass);
  /////// connection       
  WiFi.begin(ssid, pass);
 while (WiFi.status() != WL_CONNECTED){delay (10);Serial.print (&quot;.&quot;);digitalWrite(15,HIGH);}
  Serial.println();Serial.print(&quot;Connected to &quot;);Serial.println(ssid);Serial.print(&quot;IP address: &quot;);Serial.println(WiFi.localIP());
  server.begin();
  server.on(&quot;/&quot;, web);
  server.on(&quot;/reset&quot;, web0);    
  //delay(1000);
}
  ///////// TIMER 3 /////////////////////
  timer = timerBegin(3, 8000, true);
  timerAttachInterrupt(timer, &amp;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);  

 for(int cikk=0;cikk&lt;=9;cikk++){

switch(cikk){
    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;
}

  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;
 delay(200);
}    
}

void loop(){
  if (millis() - lastTimeButtonStateChanged &gt; 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&lt;500){digitalWrite(DP,LOW);}else{digitalWrite(DP,HIGH);}
  if(millis()-times2&gt;999){times2=millis();}
  delay(100);
  server.handleClient();
 if(digitalRead(23)==HIGH){
/////////////// times ////////////////////////////
  if(millis()-times&gt;=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(&quot;:&quot;);Serial.print(mm/10);Serial.print(mm%10);Serial.print(&quot;:&quot;);Serial.print(ss/10);Serial.println(ss%10);
///// brightness  

   if(hh&gt;=0&amp;&amp;hh&lt;=end_night||hh&gt;=start_night){ledcWrite(2, 255-brignes_low); }else {ledcWrite(2, 255-brignes);}
}
  sum = hh*10000+mm*100+ss;
///////// ///////////////
 switch(annti){
 // case 1: if(ss&lt;10){anti();}break;
 // case 2: if((mm==15||mm==45)&amp;&amp;ss&lt;10){anti();}break;
 // case 3: if((mm==15||mm==30||mm==45)&amp;&amp;ss&lt;10){anti();}break;
 case 1: if(ss==59){ms=0;}
         if(ss&lt;10&amp;&amp;ms&lt;=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)&amp;&amp;ss&lt;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 = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;
   //style
          webPage += &quot;&lt;head&gt;&lt;style&gt;.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}&quot;;
          webPage += &quot;#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}&quot;;
          webPage += &quot;#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}&quot;;
          webPage += &quot;#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          webPage += &quot;#menu1 a:hover{color:#fff; background:#555;}&quot;;
          webPage += &quot;#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          webPage += &quot;&lt;/style&gt;&lt;/head&gt;&quot;;
    /////////////   
          webPage += &quot;&lt;TABLE class=&#039;tab1&#039; align=&#039;center&#039; width=&#039;470&#039; BORDER=&#039;1&#039; cellspacing=&#039;0&#039; cellpadding=&#039;5&#039;&gt;&quot;;
          webPage +=&quot;&lt;td colspan=&#039;2&#039;&gt;&lt;h1&gt;&lt;center&gt;ESP32&lt;br&gt;Страница настройки Интернет часов&lt;/h1&gt;&quot;;
          webPage +=&quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;center&gt;&lt;big&gt;Текущее время: &quot;;         
          webPage += hh/10;webPage += hh%10; webPage +=&quot;:&quot;;webPage +=mm/10;
          webPage += mm%10; webPage +=&quot;:&quot;;webPage +=ss/10;webPage += ss%10;
          webPage += &quot;&lt;/center&gt;&quot;;
          webPage += &quot;&lt;form method=&#039;POST&#039; action=&#039;reset&#039; &gt;&quot;;
          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;input name=&#039;time_utc&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Временной сдвиг UTC (30 мин)&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(201);
          webPage += &quot; (&quot;;webPage += utc*0.5;webPage += &quot; ч.)&quot;;
          webPage += &quot;&lt;tr&gt;&lt;td&gt;&lt;input name=&#039;brignes&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Яркость день 80-120&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(200);
          webPage += &quot;&lt;td&gt;&lt;input name=&#039;brignes_low&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Яркость ночь 80-120&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(202);
          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;center&gt; Время работы ночного режима подсветки &lt;tr&gt;&quot;;
          webPage += &quot;&lt;tr&gt;&lt;td&gt; Начало (18-23 ч) &lt;input name=&#039;start_night&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt;&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(203);
          webPage += &quot;&lt;td&gt; Конец: (1-12 ч) &lt;input name=&#039;end_night&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt;&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(204); 
          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;input name=&#039;annti&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Антиотравление катодов индикаторов&quot;;
          webPage += &quot;&lt;center&gt;&lt;br&gt;&lt;small&gt;1 - каждую минуту, 2 - один раз в пять минут, 3 - отключено. Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(205);
          

          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;center&gt;&lt;br&gt;&lt;input type=SUBMIT value=&#039;Сохранить настройки&#039;&gt;&quot;;
          webPage += &quot;&lt;/form&gt;&quot;;
          webPage += &quot;&lt;center&gt;&lt;br&gt;Заполните все ячейки формы, незаполненная ячейка формы не изменит ранее установленный параметр&quot;;
         
          server.send(200, &quot;text/html&quot;, webPage);
          timerAlarmWrite(timer, 35, true);
          timerAlarmEnable(timer); 
      
}

void sumbit(){ 
     if (server.args() &gt; 0 ) {
   for ( uint8_t i = 0; i &lt; server.args(); i++ ) {
     if (server.argName(i) == &quot;brignes&quot;){brignes = server.arg(i).toInt();}
     if (server.argName(i) == &quot;time_utc&quot;){utc = server.arg(i).toInt();}
     if (server.argName(i) == &quot;brignes_low&quot;){brignes_low = server.arg(i).toInt();}
     if (server.argName(i) == &quot;start_night&quot;){start_night = server.arg(i).toInt();}
     if (server.argName(i) == &quot;end_night&quot;){end_night = server.arg(i).toInt();}
     if (server.argName(i) == &quot;annti&quot;){annti = server.arg(i).toInt();}
     
  }
    Serial.println(&quot;Save&quot;);
    if(brignes &gt; 150){brignes=150;} if(brignes &lt; 0){brignes=0;}
    if(brignes_low &gt; 150){brignes_low=150;} if(brignes_low &lt; 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&gt;=0&amp;&amp;hh&lt;=6||hh&gt;=23){ledcWrite(2, 255-brignes_low);}else {ledcWrite(2, 255-brignes);}
}}  

void handleRoot() { 
   timerAlarmWrite(timer, 35, false);
   delay(300);
   String str = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;
   //style
          str += &quot;&lt;head&gt;&lt;style&gt;.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}&quot;;
          str += &quot;#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}&quot;;
          str += &quot;#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}&quot;;
          str += &quot;#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          str += &quot;#menu1 a:hover{color:#fff; background:#555;}&quot;;
          str += &quot;#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          str += &quot;&lt;/style&gt;&lt;/head&gt;&quot;;
   ////////////       
          str += &quot;&lt;TABLE class=&#039;tab1&#039; align=&#039;center&#039; width=&#039;470&#039; BORDER=&#039;1&#039; cellspacing=&#039;0&#039; cellpadding=&#039;10&#039;&gt;&quot;;
          str +=&quot;&lt;td&gt;&lt;h1&gt;&lt;center&gt;ESP32&lt;br&gt;Авторизация&lt;/h1&gt;&quot;;
          str += &quot;&lt;form method=&#039;POST&#039; action=&#039;ok&#039;&gt;&quot;;
          str += &quot;&lt;tr&gt;&lt;td&gt;&lt;input name=&#039;ssid&#039;  autocomplete=&#039;off&#039;&gt;&lt;big&gt; Имя Wi-Fi сети&quot;;
          str += &quot;&lt;tr&gt;&lt;td&gt;&lt;input name=&#039;pswd&#039;  autocomplete=&#039;off&#039;&gt;&lt;big&gt; Пароль&quot;;
          str += &quot;&lt;tr&gt;&lt;td&gt;&lt;center&gt;&lt;input type=SUBMIT value=&#039;Сохранить настройки&#039;&gt;&quot;;
          str += &quot;&lt;/form&gt;&quot;;
          server.send ( 200, &quot;text/html&quot;, 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 = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;;
  str += &quot;&lt;body&gt;&quot;;
 
  EEPROM.begin(512);
 
  ssid_ap = server.arg(0);
  pass_ap = server.arg(1);

  if(ssid_ap != &quot;&quot;){
    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 &lt; ssid_ap.length(); i++)
    EEPROM.write(i, buf[i]); 
    pass_ap.getBytes(buf, pass_ap.length() + 1);
    for(byte i = 0; i &lt; 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 (&quot;.&quot;);}
 ///////////////////////////////////////////////////////////////////////////  
    str +=&quot;&lt;big&gt;&lt;center&gt;Конфигурация сохранена в память&lt;br&gt;&quot;;
    str +=&quot;&lt;big&gt;&lt;center&gt;Уберите перемычку с D23 и перезагрузите ESP32&lt;/p&gt;&lt;br&gt;&quot;;
    str +=&quot;&lt;big&gt;&lt;b&gt;&lt;center&gt;&quot;;
    str += WiFi.localIP().toString();
    str +=&quot;&lt;/b&gt;&lt;hr&gt;&quot;;
    str +=&quot;&lt;a href=\&quot;/\&quot;&gt;Return&lt;/a&gt; to settings page&lt;/br&gt;&quot;;
  }
  else {
    str += &quot;&lt;big&gt;&lt;center&gt;No WIFI Net&lt;/br&gt;\
   &lt;a href=\&quot;/\&quot;&gt;Return&lt;/a&gt; to settings page&lt;/br&gt;&quot;;
  }
  str += &quot;&lt;/body&gt;&lt;/html&gt;&quot;;
  server.send ( 200, &quot;text/html&quot;, str );
  timerAlarmWrite(timer, 35, true);
  timerAlarmEnable(timer); 
}


void web0() { 
   timerAlarmWrite(timer, 35, false);
   delay(300);
   String str0 = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;
          str0 += &quot;&lt;center&gt;&lt;b&gt;&lt;big&gt;Настройки сохранены.&lt;br&gt; Для возврата на предыдущую страницу перейдите по &lt;a href=&#039;./&#039;&gt;ссылке&lt;/a&gt;&quot;;
   server.send (200, &quot;text/html&quot;, str0);
   sumbit();
   timerAlarmWrite(timer, 35, true);
   timerAlarmEnable(timer); 
} 

void anti(){
    if(millis()-times1&gt;50){ms++; times1=millis();}
//if(ss==59){ms=0;}
//if(ss&lt;10&amp;&amp;ms&lt;=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;}
}</code></pre></div></blockquote></div><p>Да, что-то не хочет работать...</p>]]></content>
			<author>
				<name><![CDATA[MORO-1986]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1198</uri>
			</author>
			<updated>2025-02-24T14:09:50Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11428#p11428</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11427#p11427" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>И еще такой вопрос, использую режим день-ночь, и заметил что немного не совпадают установленные значения. к примеру, дневной режим у меня стоит на включение в 9-00, а включается он только в 10-00, т.е. разница с настройками 1 час.<br />Заранее спасибо.</p></blockquote></div><p>Возможно что то в этом коде не то:</p><p>if(hh&gt;=0&amp;&amp;hh&lt;=end_night||hh&gt;=start_night){ledcWrite(2, 255-brignes_low); }else {ledcWrite(2, 255-brignes);}</p><p>может исправить на </p><p>if(hh&gt;=0&amp;&amp;hh&lt;end_night||hh&gt;=start_night){ledcWrite(2, 255-brignes_low); }else {ledcWrite(2, 255-brignes);}</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-24T13:35:16Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11427#p11427</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11426#p11426" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Добрый день! Я снова к вам с просьбой. Можете, пожалуйста,внести поправку в коде так, чтобы при включении часов, перед тем как высветится время, включался перебор цифр.</p></blockquote></div><p>Добавил код в setup не уверен что будет работать:</p><div class="codebox"><pre><code>#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 &lt;WiFi.h&gt;
#include &lt;NTPClient.h&gt;         // http://rcl-radio.ru/wp-content/uploads/2019/11/ntpclientmaster.zip
#include &lt;WiFiUdp.h&gt;
#include &lt;WiFiClient.h&gt;
#include &lt;WebServer.h&gt;
#include &lt;ESPmDNS.h&gt;
#include &lt;EEPROM.h&gt;
#include &quot;esp_system.h&quot;

#ifndef APSSID
#define APSSID &quot;ESPap&quot;
#define APPSK  &quot;12345678&quot;
#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, &quot;pool.ntp.org&quot;, 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(&amp;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&gt;5){i=0;}
    portEXIT_CRITICAL_ISR(&amp;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(&quot;AP IP address: &quot;);
  Serial.println(myIP);
  server.on(&quot;/&quot;, handleRoot);
  server.on(&quot;/ok&quot;, handleOk);
  server.begin();
  Serial.println(&quot;HTTP server started&quot;);  
  //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 &gt; 150){brignes=150;} 
  if(brignes_low &gt; 150){brignes_low=150;} 
  if(len_pass &gt; 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 &lt; len_ssid; i++) buf_ssid[i] = char(EEPROM.read(i));
  buf_ssid[len_ssid] = &#039;\x0&#039;;
  const char *ssid  = (const char*)buf_ssid;
 for(byte i = 0; i &lt; len_pass; i++) buf_pass[i] = char(EEPROM.read(i + 32));
  const char *pass  = (const char*)buf_pass;
  buf_pass[len_pass] = &#039;\x0&#039;;
  delay(2000);
  Serial.print(&quot;SSID: &quot;);Serial.print(ssid);Serial.print(&quot;   &quot;);Serial.print(&quot;Password: &quot;);Serial.println(pass);
  /////// connection       
  WiFi.begin(ssid, pass);
 while (WiFi.status() != WL_CONNECTED){delay (10);Serial.print (&quot;.&quot;);digitalWrite(15,HIGH);}
  Serial.println();Serial.print(&quot;Connected to &quot;);Serial.println(ssid);Serial.print(&quot;IP address: &quot;);Serial.println(WiFi.localIP());
  server.begin();
  server.on(&quot;/&quot;, web);
  server.on(&quot;/reset&quot;, web0);    
  //delay(1000);
}
  ///////// TIMER 3 /////////////////////
  timer = timerBegin(3, 8000, true);
  timerAttachInterrupt(timer, &amp;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);  

 for(int cikk=0;cikk&lt;=9;cikk++){

switch(cikk){
    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;
}

  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;
 delay(200);
}    
}

void loop(){
  if (millis() - lastTimeButtonStateChanged &gt; 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&lt;500){digitalWrite(DP,LOW);}else{digitalWrite(DP,HIGH);}
  if(millis()-times2&gt;999){times2=millis();}
  delay(100);
  server.handleClient();
 if(digitalRead(23)==HIGH){
/////////////// times ////////////////////////////
  if(millis()-times&gt;=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(&quot;:&quot;);Serial.print(mm/10);Serial.print(mm%10);Serial.print(&quot;:&quot;);Serial.print(ss/10);Serial.println(ss%10);
///// brightness  

   if(hh&gt;=0&amp;&amp;hh&lt;=end_night||hh&gt;=start_night){ledcWrite(2, 255-brignes_low); }else {ledcWrite(2, 255-brignes);}
}
  sum = hh*10000+mm*100+ss;
///////// ///////////////
 switch(annti){
 // case 1: if(ss&lt;10){anti();}break;
 // case 2: if((mm==15||mm==45)&amp;&amp;ss&lt;10){anti();}break;
 // case 3: if((mm==15||mm==30||mm==45)&amp;&amp;ss&lt;10){anti();}break;
 case 1: if(ss==59){ms=0;}
         if(ss&lt;10&amp;&amp;ms&lt;=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)&amp;&amp;ss&lt;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 = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;
   //style
          webPage += &quot;&lt;head&gt;&lt;style&gt;.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}&quot;;
          webPage += &quot;#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}&quot;;
          webPage += &quot;#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}&quot;;
          webPage += &quot;#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          webPage += &quot;#menu1 a:hover{color:#fff; background:#555;}&quot;;
          webPage += &quot;#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          webPage += &quot;&lt;/style&gt;&lt;/head&gt;&quot;;
    /////////////   
          webPage += &quot;&lt;TABLE class=&#039;tab1&#039; align=&#039;center&#039; width=&#039;470&#039; BORDER=&#039;1&#039; cellspacing=&#039;0&#039; cellpadding=&#039;5&#039;&gt;&quot;;
          webPage +=&quot;&lt;td colspan=&#039;2&#039;&gt;&lt;h1&gt;&lt;center&gt;ESP32&lt;br&gt;Страница настройки Интернет часов&lt;/h1&gt;&quot;;
          webPage +=&quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;center&gt;&lt;big&gt;Текущее время: &quot;;         
          webPage += hh/10;webPage += hh%10; webPage +=&quot;:&quot;;webPage +=mm/10;
          webPage += mm%10; webPage +=&quot;:&quot;;webPage +=ss/10;webPage += ss%10;
          webPage += &quot;&lt;/center&gt;&quot;;
          webPage += &quot;&lt;form method=&#039;POST&#039; action=&#039;reset&#039; &gt;&quot;;
          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;input name=&#039;time_utc&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Временной сдвиг UTC (30 мин)&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(201);
          webPage += &quot; (&quot;;webPage += utc*0.5;webPage += &quot; ч.)&quot;;
          webPage += &quot;&lt;tr&gt;&lt;td&gt;&lt;input name=&#039;brignes&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Яркость день 80-120&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(200);
          webPage += &quot;&lt;td&gt;&lt;input name=&#039;brignes_low&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Яркость ночь 80-120&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(202);
          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;center&gt; Время работы ночного режима подсветки &lt;tr&gt;&quot;;
          webPage += &quot;&lt;tr&gt;&lt;td&gt; Начало (18-23 ч) &lt;input name=&#039;start_night&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt;&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(203);
          webPage += &quot;&lt;td&gt; Конец: (1-12 ч) &lt;input name=&#039;end_night&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt;&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(204); 
          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;input name=&#039;annti&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Антиотравление катодов индикаторов&quot;;
          webPage += &quot;&lt;center&gt;&lt;br&gt;&lt;small&gt;1 - каждую минуту, 2 - один раз в пять минут, 3 - отключено. Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(205);
          

          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;center&gt;&lt;br&gt;&lt;input type=SUBMIT value=&#039;Сохранить настройки&#039;&gt;&quot;;
          webPage += &quot;&lt;/form&gt;&quot;;
          webPage += &quot;&lt;center&gt;&lt;br&gt;Заполните все ячейки формы, незаполненная ячейка формы не изменит ранее установленный параметр&quot;;
         
          server.send(200, &quot;text/html&quot;, webPage);
          timerAlarmWrite(timer, 35, true);
          timerAlarmEnable(timer); 
      
}

void sumbit(){ 
     if (server.args() &gt; 0 ) {
   for ( uint8_t i = 0; i &lt; server.args(); i++ ) {
     if (server.argName(i) == &quot;brignes&quot;){brignes = server.arg(i).toInt();}
     if (server.argName(i) == &quot;time_utc&quot;){utc = server.arg(i).toInt();}
     if (server.argName(i) == &quot;brignes_low&quot;){brignes_low = server.arg(i).toInt();}
     if (server.argName(i) == &quot;start_night&quot;){start_night = server.arg(i).toInt();}
     if (server.argName(i) == &quot;end_night&quot;){end_night = server.arg(i).toInt();}
     if (server.argName(i) == &quot;annti&quot;){annti = server.arg(i).toInt();}
     
  }
    Serial.println(&quot;Save&quot;);
    if(brignes &gt; 150){brignes=150;} if(brignes &lt; 0){brignes=0;}
    if(brignes_low &gt; 150){brignes_low=150;} if(brignes_low &lt; 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&gt;=0&amp;&amp;hh&lt;=6||hh&gt;=23){ledcWrite(2, 255-brignes_low);}else {ledcWrite(2, 255-brignes);}
}}  

void handleRoot() { 
   timerAlarmWrite(timer, 35, false);
   delay(300);
   String str = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;
   //style
          str += &quot;&lt;head&gt;&lt;style&gt;.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}&quot;;
          str += &quot;#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}&quot;;
          str += &quot;#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}&quot;;
          str += &quot;#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          str += &quot;#menu1 a:hover{color:#fff; background:#555;}&quot;;
          str += &quot;#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          str += &quot;&lt;/style&gt;&lt;/head&gt;&quot;;
   ////////////       
          str += &quot;&lt;TABLE class=&#039;tab1&#039; align=&#039;center&#039; width=&#039;470&#039; BORDER=&#039;1&#039; cellspacing=&#039;0&#039; cellpadding=&#039;10&#039;&gt;&quot;;
          str +=&quot;&lt;td&gt;&lt;h1&gt;&lt;center&gt;ESP32&lt;br&gt;Авторизация&lt;/h1&gt;&quot;;
          str += &quot;&lt;form method=&#039;POST&#039; action=&#039;ok&#039;&gt;&quot;;
          str += &quot;&lt;tr&gt;&lt;td&gt;&lt;input name=&#039;ssid&#039;  autocomplete=&#039;off&#039;&gt;&lt;big&gt; Имя Wi-Fi сети&quot;;
          str += &quot;&lt;tr&gt;&lt;td&gt;&lt;input name=&#039;pswd&#039;  autocomplete=&#039;off&#039;&gt;&lt;big&gt; Пароль&quot;;
          str += &quot;&lt;tr&gt;&lt;td&gt;&lt;center&gt;&lt;input type=SUBMIT value=&#039;Сохранить настройки&#039;&gt;&quot;;
          str += &quot;&lt;/form&gt;&quot;;
          server.send ( 200, &quot;text/html&quot;, 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 = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;;
  str += &quot;&lt;body&gt;&quot;;
 
  EEPROM.begin(512);
 
  ssid_ap = server.arg(0);
  pass_ap = server.arg(1);

  if(ssid_ap != &quot;&quot;){
    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 &lt; ssid_ap.length(); i++)
    EEPROM.write(i, buf[i]); 
    pass_ap.getBytes(buf, pass_ap.length() + 1);
    for(byte i = 0; i &lt; 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 (&quot;.&quot;);}
 ///////////////////////////////////////////////////////////////////////////  
    str +=&quot;&lt;big&gt;&lt;center&gt;Конфигурация сохранена в память&lt;br&gt;&quot;;
    str +=&quot;&lt;big&gt;&lt;center&gt;Уберите перемычку с D23 и перезагрузите ESP32&lt;/p&gt;&lt;br&gt;&quot;;
    str +=&quot;&lt;big&gt;&lt;b&gt;&lt;center&gt;&quot;;
    str += WiFi.localIP().toString();
    str +=&quot;&lt;/b&gt;&lt;hr&gt;&quot;;
    str +=&quot;&lt;a href=\&quot;/\&quot;&gt;Return&lt;/a&gt; to settings page&lt;/br&gt;&quot;;
  }
  else {
    str += &quot;&lt;big&gt;&lt;center&gt;No WIFI Net&lt;/br&gt;\
   &lt;a href=\&quot;/\&quot;&gt;Return&lt;/a&gt; to settings page&lt;/br&gt;&quot;;
  }
  str += &quot;&lt;/body&gt;&lt;/html&gt;&quot;;
  server.send ( 200, &quot;text/html&quot;, str );
  timerAlarmWrite(timer, 35, true);
  timerAlarmEnable(timer); 
}


void web0() { 
   timerAlarmWrite(timer, 35, false);
   delay(300);
   String str0 = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;
          str0 += &quot;&lt;center&gt;&lt;b&gt;&lt;big&gt;Настройки сохранены.&lt;br&gt; Для возврата на предыдущую страницу перейдите по &lt;a href=&#039;./&#039;&gt;ссылке&lt;/a&gt;&quot;;
   server.send (200, &quot;text/html&quot;, str0);
   sumbit();
   timerAlarmWrite(timer, 35, true);
   timerAlarmEnable(timer); 
} 

void anti(){
    if(millis()-times1&gt;50){ms++; times1=millis();}
//if(ss==59){ms=0;}
//if(ss&lt;10&amp;&amp;ms&lt;=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;}
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-24T13:32:11Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11426#p11426</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11425#p11425" />
			<content type="html"><![CDATA[<p>Добрый день! Я снова к вам с просьбой. Можете, пожалуйста,внести поправку в коде так, чтобы при подаче питания на часы, перед тем как высветится время, включался перебор цифр. <br />И еще такой вопрос, использую режим день-ночь, и заметил что немного не совпадают установленные значения. к примеру, дневной режим у меня стоит на включение в 9-00, а включается он только в 10-00, т.е. разница с настройками 1 час.<br />Заранее спасибо.</p><div class="codebox"><pre><code>#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 &lt;WiFi.h&gt;
#include &lt;NTPClient.h&gt;         // http://rcl-radio.ru/wp-content/uploads/2019/11/ntpclientmaster.zip
#include &lt;WiFiUdp.h&gt;
#include &lt;WiFiClient.h&gt;
#include &lt;WebServer.h&gt;
#include &lt;ESPmDNS.h&gt;
#include &lt;EEPROM.h&gt;
#include &quot;esp_system.h&quot;

#ifndef APSSID
#define APSSID &quot;ESPap&quot;
#define APPSK  &quot;12345678&quot;
#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, &quot;pool.ntp.org&quot;, 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(&amp;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&gt;5){i=0;}
    portEXIT_CRITICAL_ISR(&amp;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(&quot;AP IP address: &quot;);
  Serial.println(myIP);
  server.on(&quot;/&quot;, handleRoot);
  server.on(&quot;/ok&quot;, handleOk);
  server.begin();
  Serial.println(&quot;HTTP server started&quot;);  
  //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 &gt; 150){brignes=150;} 
  if(brignes_low &gt; 150){brignes_low=150;} 
  if(len_pass &gt; 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 &lt; len_ssid; i++) buf_ssid[i] = char(EEPROM.read(i));
  buf_ssid[len_ssid] = &#039;\x0&#039;;
  const char *ssid  = (const char*)buf_ssid;
 for(byte i = 0; i &lt; len_pass; i++) buf_pass[i] = char(EEPROM.read(i + 32));
  const char *pass  = (const char*)buf_pass;
  buf_pass[len_pass] = &#039;\x0&#039;;
  delay(2000);
  Serial.print(&quot;SSID: &quot;);Serial.print(ssid);Serial.print(&quot;   &quot;);Serial.print(&quot;Password: &quot;);Serial.println(pass);
  /////// connection       
  WiFi.begin(ssid, pass);
 while (WiFi.status() != WL_CONNECTED){delay (10);Serial.print (&quot;.&quot;);digitalWrite(15,HIGH);}
  Serial.println();Serial.print(&quot;Connected to &quot;);Serial.println(ssid);Serial.print(&quot;IP address: &quot;);Serial.println(WiFi.localIP());
  server.begin();
  server.on(&quot;/&quot;, web);
  server.on(&quot;/reset&quot;, web0);    
  //delay(1000);
}
  ///////// TIMER 3 /////////////////////
  timer = timerBegin(3, 8000, true);
  timerAttachInterrupt(timer, &amp;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 &gt; 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&lt;500){digitalWrite(DP,LOW);}else{digitalWrite(DP,HIGH);}
  if(millis()-times2&gt;999){times2=millis();}
  delay(100);
  server.handleClient();
 if(digitalRead(23)==HIGH){
/////////////// times ////////////////////////////
  if(millis()-times&gt;=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(&quot;:&quot;);Serial.print(mm/10);Serial.print(mm%10);Serial.print(&quot;:&quot;);Serial.print(ss/10);Serial.println(ss%10);
///// brightness  

   if(hh&gt;=0&amp;&amp;hh&lt;=end_night||hh&gt;=start_night){ledcWrite(2, 255-brignes_low); }else {ledcWrite(2, 255-brignes);}
}
  sum = hh*10000+mm*100+ss;
///////// ///////////////
 switch(annti){
 // case 1: if(ss&lt;10){anti();}break;
 // case 2: if((mm==15||mm==45)&amp;&amp;ss&lt;10){anti();}break;
 // case 3: if((mm==15||mm==30||mm==45)&amp;&amp;ss&lt;10){anti();}break;
 case 1: if(ss==59){ms=0;}
         if(ss&lt;10&amp;&amp;ms&lt;=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)&amp;&amp;ss&lt;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 = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;
   //style
          webPage += &quot;&lt;head&gt;&lt;style&gt;.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}&quot;;
          webPage += &quot;#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}&quot;;
          webPage += &quot;#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}&quot;;
          webPage += &quot;#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          webPage += &quot;#menu1 a:hover{color:#fff; background:#555;}&quot;;
          webPage += &quot;#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          webPage += &quot;&lt;/style&gt;&lt;/head&gt;&quot;;
    /////////////   
          webPage += &quot;&lt;TABLE class=&#039;tab1&#039; align=&#039;center&#039; width=&#039;470&#039; BORDER=&#039;1&#039; cellspacing=&#039;0&#039; cellpadding=&#039;5&#039;&gt;&quot;;
          webPage +=&quot;&lt;td colspan=&#039;2&#039;&gt;&lt;h1&gt;&lt;center&gt;ESP32&lt;br&gt;Страница настройки Интернет часов&lt;/h1&gt;&quot;;
          webPage +=&quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;center&gt;&lt;big&gt;Текущее время: &quot;;         
          webPage += hh/10;webPage += hh%10; webPage +=&quot;:&quot;;webPage +=mm/10;
          webPage += mm%10; webPage +=&quot;:&quot;;webPage +=ss/10;webPage += ss%10;
          webPage += &quot;&lt;/center&gt;&quot;;
          webPage += &quot;&lt;form method=&#039;POST&#039; action=&#039;reset&#039; &gt;&quot;;
          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;input name=&#039;time_utc&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Временной сдвиг UTC (30 мин)&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(201);
          webPage += &quot; (&quot;;webPage += utc*0.5;webPage += &quot; ч.)&quot;;
          webPage += &quot;&lt;tr&gt;&lt;td&gt;&lt;input name=&#039;brignes&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Яркость день 80-120&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(200);
          webPage += &quot;&lt;td&gt;&lt;input name=&#039;brignes_low&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Яркость ночь 80-120&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(202);
          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;center&gt; Время работы ночного режима подсветки &lt;tr&gt;&quot;;
          webPage += &quot;&lt;tr&gt;&lt;td&gt; Начало (18-23 ч) &lt;input name=&#039;start_night&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt;&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(203);
          webPage += &quot;&lt;td&gt; Конец: (1-12 ч) &lt;input name=&#039;end_night&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt;&quot;;
          webPage += &quot;&lt;br&gt;&lt;small&gt;Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(204); 
          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;input name=&#039;annti&#039;  autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt; Антиотравление катодов индикаторов&quot;;
          webPage += &quot;&lt;center&gt;&lt;br&gt;&lt;small&gt;1 - каждую минуту, 2 - один раз в пять минут, 3 - отключено. Установлено: &quot;;EEPROM.begin(512);webPage += EEPROM.read(205);
          

          webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&lt;center&gt;&lt;br&gt;&lt;input type=SUBMIT value=&#039;Сохранить настройки&#039;&gt;&quot;;
          webPage += &quot;&lt;/form&gt;&quot;;
          webPage += &quot;&lt;center&gt;&lt;br&gt;Заполните все ячейки формы, незаполненная ячейка формы не изменит ранее установленный параметр&quot;;
         
          server.send(200, &quot;text/html&quot;, webPage);
          timerAlarmWrite(timer, 35, true);
          timerAlarmEnable(timer); 
      
}

void sumbit(){ 
     if (server.args() &gt; 0 ) {
   for ( uint8_t i = 0; i &lt; server.args(); i++ ) {
     if (server.argName(i) == &quot;brignes&quot;){brignes = server.arg(i).toInt();}
     if (server.argName(i) == &quot;time_utc&quot;){utc = server.arg(i).toInt();}
     if (server.argName(i) == &quot;brignes_low&quot;){brignes_low = server.arg(i).toInt();}
     if (server.argName(i) == &quot;start_night&quot;){start_night = server.arg(i).toInt();}
     if (server.argName(i) == &quot;end_night&quot;){end_night = server.arg(i).toInt();}
     if (server.argName(i) == &quot;annti&quot;){annti = server.arg(i).toInt();}
     
  }
    Serial.println(&quot;Save&quot;);
    if(brignes &gt; 150){brignes=150;} if(brignes &lt; 0){brignes=0;}
    if(brignes_low &gt; 150){brignes_low=150;} if(brignes_low &lt; 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&gt;=0&amp;&amp;hh&lt;=6||hh&gt;=23){ledcWrite(2, 255-brignes_low);}else {ledcWrite(2, 255-brignes);}
}}  

void handleRoot() { 
   timerAlarmWrite(timer, 35, false);
   delay(300);
   String str = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;
   //style
          str += &quot;&lt;head&gt;&lt;style&gt;.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}&quot;;
          str += &quot;#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}&quot;;
          str += &quot;#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}&quot;;
          str += &quot;#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          str += &quot;#menu1 a:hover{color:#fff; background:#555;}&quot;;
          str += &quot;#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
          str += &quot;&lt;/style&gt;&lt;/head&gt;&quot;;
   ////////////       
          str += &quot;&lt;TABLE class=&#039;tab1&#039; align=&#039;center&#039; width=&#039;470&#039; BORDER=&#039;1&#039; cellspacing=&#039;0&#039; cellpadding=&#039;10&#039;&gt;&quot;;
          str +=&quot;&lt;td&gt;&lt;h1&gt;&lt;center&gt;ESP32&lt;br&gt;Авторизация&lt;/h1&gt;&quot;;
          str += &quot;&lt;form method=&#039;POST&#039; action=&#039;ok&#039;&gt;&quot;;
          str += &quot;&lt;tr&gt;&lt;td&gt;&lt;input name=&#039;ssid&#039;  autocomplete=&#039;off&#039;&gt;&lt;big&gt; Имя Wi-Fi сети&quot;;
          str += &quot;&lt;tr&gt;&lt;td&gt;&lt;input name=&#039;pswd&#039;  autocomplete=&#039;off&#039;&gt;&lt;big&gt; Пароль&quot;;
          str += &quot;&lt;tr&gt;&lt;td&gt;&lt;center&gt;&lt;input type=SUBMIT value=&#039;Сохранить настройки&#039;&gt;&quot;;
          str += &quot;&lt;/form&gt;&quot;;
          server.send ( 200, &quot;text/html&quot;, 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 = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;;
  str += &quot;&lt;body&gt;&quot;;
 
  EEPROM.begin(512);
 
  ssid_ap = server.arg(0);
  pass_ap = server.arg(1);

  if(ssid_ap != &quot;&quot;){
    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 &lt; ssid_ap.length(); i++)
    EEPROM.write(i, buf[i]); 
    pass_ap.getBytes(buf, pass_ap.length() + 1);
    for(byte i = 0; i &lt; 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 (&quot;.&quot;);}
 ///////////////////////////////////////////////////////////////////////////  
    str +=&quot;&lt;big&gt;&lt;center&gt;Конфигурация сохранена в память&lt;br&gt;&quot;;
    str +=&quot;&lt;big&gt;&lt;center&gt;Уберите перемычку с D23 и перезагрузите ESP32&lt;/p&gt;&lt;br&gt;&quot;;
    str +=&quot;&lt;big&gt;&lt;b&gt;&lt;center&gt;&quot;;
    str += WiFi.localIP().toString();
    str +=&quot;&lt;/b&gt;&lt;hr&gt;&quot;;
    str +=&quot;&lt;a href=\&quot;/\&quot;&gt;Return&lt;/a&gt; to settings page&lt;/br&gt;&quot;;
  }
  else {
    str += &quot;&lt;big&gt;&lt;center&gt;No WIFI Net&lt;/br&gt;\
   &lt;a href=\&quot;/\&quot;&gt;Return&lt;/a&gt; to settings page&lt;/br&gt;&quot;;
  }
  str += &quot;&lt;/body&gt;&lt;/html&gt;&quot;;
  server.send ( 200, &quot;text/html&quot;, str );
  timerAlarmWrite(timer, 35, true);
  timerAlarmEnable(timer); 
}


void web0() { 
   timerAlarmWrite(timer, 35, false);
   delay(300);
   String str0 = &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;
          str0 += &quot;&lt;center&gt;&lt;b&gt;&lt;big&gt;Настройки сохранены.&lt;br&gt; Для возврата на предыдущую страницу перейдите по &lt;a href=&#039;./&#039;&gt;ссылке&lt;/a&gt;&quot;;
   server.send (200, &quot;text/html&quot;, str0);
   sumbit();
   timerAlarmWrite(timer, 35, true);
   timerAlarmEnable(timer); 
} 

void anti(){
    if(millis()-times1&gt;50){ms++; times1=millis();}
//if(ss==59){ms=0;}
//if(ss&lt;10&amp;&amp;ms&lt;=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;}
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[MORO-1986]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1198</uri>
			</author>
			<updated>2025-02-24T13:21:15Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11425#p11425</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11423#p11423" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Для авторизации в сети Wi-Fi переводится в режим точки доступа с фиксированным IP адресом — 192.168.4.1 , для перевода ESP32 в режим точки доступа необходимо на пин D23 подать GND (нажать фиксированную кнопку AT/STA) и нажать кнопку RESET (или отключить и снова включить питание).</p></blockquote></div><p>Других вариантов не вижу, должно работать.</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-24T13:13:21Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11423#p11423</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11421#p11421" />
			<content type="html"><![CDATA[<p>Здравствуйте! Спаял часики (доработка 3) все работает, спасибо автору. Возник вопрос точка доступа создается только один раз при первоначальной настройки? Просто решил подключить к другой сети и не смог, точка доступа не создается(D23 на землю садил, перегружал). Прошивать заново? И еще проявляется паразитная засветка немного, ставить стабилитроны как на схеме выше или есть поправленный код?</p>]]></content>
			<author>
				<name><![CDATA[andrey1042]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=3317</uri>
			</author>
			<updated>2025-02-24T09:45:33Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11421#p11421</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11350#p11350" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>MORO-1986 пишет:</cite><blockquote><p>Есть еще один странный глюк, который проявляеться не всегда.<br /><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2025/01/872d47e944934098f0503566fa489087.jpg" alt="http://forum.rcl-radio.ru/uploads/images/2025/01/872d47e944934098f0503566fa489087.jpg" /></span></p></blockquote></div><p>Вроде и это победил. <br />Сделал как вы советовали ранее:<br />Если имеются проблемы, то перенесите этот код в начало setup()</p><p>///////// PWM IRF840 //////////////////<br />&nbsp; ledcSetup(2, 25000, 8); // 25000 kHz / 8 bit / cannel 2<br />&nbsp; ledcAttachPin(15, 2);&nbsp; &nbsp;// D15 / cannel 2<br />&nbsp; ledcWrite(2, 255-brignes);</p>]]></content>
			<author>
				<name><![CDATA[MORO-1986]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1198</uri>
			</author>
			<updated>2025-02-04T11:45:55Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11350#p11350</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11349#p11349" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>liman324 пишет:</cite><blockquote><p>Да, подойдет.</p></blockquote></div><p>День добрый.<br />А вот такой модуль подойдет?</p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2025/02/3a2f62a66124c99bd5278bbcbd874d35.png" alt="http://forum.rcl-radio.ru/uploads/images/2025/02/3a2f62a66124c99bd5278bbcbd874d35.png" /></span></p>]]></content>
			<author>
				<name><![CDATA[MORO-1986]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1198</uri>
			</author>
			<updated>2025-02-04T10:27:12Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11349#p11349</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11324#p11324" />
			<content type="html"><![CDATA[<p>Есть еще один странный глюк, который проявляеться не всегда.<br />При включении, до того как часы подхватят wi-fi, на несколько секунд включается повышающий преобразователь, с эффектом как на фото. Что это может быть? Помехи какие-нибудь на него там действуют? Ведь вряд-ли это в коде дело, такой эффект есть не всегда.</p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2025/01/6db5da25b2b997453e9cc17b52a9a1fc.jpg" alt="http://forum.rcl-radio.ru/uploads/images/2025/01/6db5da25b2b997453e9cc17b52a9a1fc.jpg" /></span> <br /><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2025/01/872d47e944934098f0503566fa489087.jpg" alt="http://forum.rcl-radio.ru/uploads/images/2025/01/872d47e944934098f0503566fa489087.jpg" /></span> <br /><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2025/01/160b01440220192080d4dc46681ed4f1.jpg" alt="http://forum.rcl-radio.ru/uploads/images/2025/01/160b01440220192080d4dc46681ed4f1.jpg" /></span></p>]]></content>
			<author>
				<name><![CDATA[MORO-1986]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1198</uri>
			</author>
			<updated>2025-01-31T12:31:54Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11324#p11324</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11322#p11322" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>liman324 пишет:</cite><blockquote><p>У меня нет возможности провести полное тестирование, но тестовый скетч работает правильно<br /></p><div class="codebox"><pre><code>long ms,stop_ms,sum,times1,ss,times0;


void setup(){
  Serial.begin(9600);
  }

void loop(){
if(millis()-times1&gt;50){ms++; times1=millis();}
if(ss==59){ms=0;}
if(ms&lt;=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;}
Serial.println(sum);}


if(millis()-times0&gt;1000){times0=millis();ss++;if(ss&gt;59){ss=0;}} // отсчет секунд

}</code></pre></div></blockquote></div><br /><p>Все победил))<br />Скетч поправил, сделал себе выбор перебора каждую минуту или каждые пять минут. А чтобы засветы убрать допаял стабилитроны BZV55-C75 по прикрепленной схеме. Лампы стоят ИН-8.</p><br /><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2025/01/b2b86370d648b46b7f66b839abfbaebf.jpg" alt="http://forum.rcl-radio.ru/uploads/images/2025/01/b2b86370d648b46b7f66b839abfbaebf.jpg" /></span></p>]]></content>
			<author>
				<name><![CDATA[MORO-1986]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1198</uri>
			</author>
			<updated>2025-01-31T12:21:23Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11322#p11322</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11217#p11217" />
			<content type="html"><![CDATA[<p>У меня нет возможности провести полное тестирование, но тестовый скетч работает правильно<br /></p><div class="codebox"><pre><code>long ms,stop_ms,sum,times1,ss,times0;


void setup(){
  Serial.begin(9600);
  }

void loop(){
if(millis()-times1&gt;50){ms++; times1=millis();}
if(ss==59){ms=0;}
if(ms&lt;=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;}
Serial.println(sum);}


if(millis()-times0&gt;1000){times0=millis();ss++;if(ss&gt;59){ss=0;}} // отсчет секунд

}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2024-12-28T18:47:53Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11217#p11217</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11216#p11216" />
			<content type="html"><![CDATA[<p>Должен перебирать один раз каждую минуту</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2024-12-28T18:44:51Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11216#p11216</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11215#p11215" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>liman324 пишет:</cite><blockquote><p>if(millis()-times1&gt;50){ms++; times1=millis();}<br />if(ss==59){ms=0;}<br />if(ss&lt;10&amp;&amp;ms&lt;=9){<br />switch(ms){<br />&nbsp; &nbsp; case 0: sum=000000;break;<br />&nbsp; &nbsp; case 1: sum=111111;break;<br />&nbsp; &nbsp; case 2: sum=222222;break;<br />&nbsp; &nbsp; case 3: sum=333333;break;<br />&nbsp; &nbsp; case 4: sum=444444;break;<br />&nbsp; &nbsp; case 5: sum=555555;break;<br />&nbsp; &nbsp; case 6: sum=666666;break;<br />&nbsp; &nbsp; case 7: sum=777777;break;<br />&nbsp; &nbsp; case 8: sum=888888;break;<br />&nbsp; &nbsp; case 9: sum=999999;break;}<br />}</p></blockquote></div><p>Ругается на скобки в конце. Если ставлю двойные, то код компилируется, но все равно после загрузки только один раз переберет цифры и все.</p>]]></content>
			<author>
				<name><![CDATA[MORO-1986]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1198</uri>
			</author>
			<updated>2024-12-28T18:37:13Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11215#p11215</id>
		</entry>
</feed>
