| Ваш IP: 3.239.7.207 | Online(23) - гости: 13, боты: 10 | Загрузка сервера: 3.31 ::::::::::::

Большие часы на RGB светодиодной ленте WS2811 (ESP8266) — часть 2

Ранее в статье https://rcl-radio.ru/?p=91626 был рассмотрен пример создания больших часов на светодиодной RGB ленте на на основе чипа WS2811 (SM16703) под управлением wi-fi модуля NodeMcu v3 с чипом ESP8266 (ESP-12e). В этой статье будет рассмотрен пример доработки часов, добавлен веб-интерфейс настройки и авторизации в сети в Wi-Fi сети.

Перед настройкой интернет часов выполните следующие пункты:

  • Ознакомьтесь с первой частью проекта — https://rcl-radio.ru/?p=91626
  • Настройка Arduino IDE для работы с модулем NodeMcu v3 — https://rcl-radio.ru/?p=48790
  • Загрузите в ESP8266 скетч расположенный в конце статьи.

В предыдущем примере параметры Вашей Wi-Fi сети необходимо было указывать в скетче, в новом примере предусмотрена Веб-страница для ввода параметров Вашей Wi-Fi сети. Для этого ESP8266 переводится в режим точки доступа с фиксированным IP адресом — 192.168.4.1 , для перевода ESP8266 в режим точки доступа необходимо на пин D1 подать GND (поставить перемычку) и нажать кнопку RESET.

Далее необходимо подключится к точке доступа ESPap, ввести пароль — 12345678.

Далее в браузере в адресной строке указать адрес дочки доступа http://192.168.4.1

Укажите имя  и пароль Вашей Wi-Fi сети.

После нажатия на кнопку «Сохранить настройки» , в энергонезависимую память будут сохранены параметры Вашей Wi-Fi сети, после чего появится сообщение:

Удалите перемычку, отключитесь от сети ESPap, подключитесь к Вашей сети Интернет по указанному на странице адресу http://192.168.1.65 (пример).

В браузере в адресной строке укажите IP адрес 192.168.1.65 (пример)

В открывшейся веб-странице Вы можете задать уровень яркости сегментов часов, установить время смещения от времени UTC, установить отдельно цвет свечения сегментов и двоеточия с запятой. После нажатия кнопки «Сохранить настройки», все параметры будут записаны в энергонезависимую память.

Для загрузки скетча Вам дополнительно понадобятся следующие библиотеки:

#include <NTPClient.h>
#include <ESP8266WiFi.h> 
#include <WiFiUdp.h> 
#include <Wire.h> 
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <Adafruit_NeoPixel.h>
#include <EEPROM.h>
#ifndef APSSID
#define APSSID "ESPap"
#define APPSK  "12345678"
#endif
const char *ssid = APSSID;
const char *password = APPSK;
 ESP8266WebServer server(80);
 WiFiUDP ntpUDP;
 Adafruit_NeoPixel strip = Adafruit_NeoPixel(45, D6, NEO_GRB + NEO_KHZ400);//  трек, D6  
 NTPClient timeClient(ntpUDP, "pool.ntp.org", 0,3600123);
 String date_time,date;
 unsigned long times,times1;
 int ss,mm,hh,dd,mon,yer;
 int hear10,hear0,min10,min0,sec10,sec0;
 int hhh,ss_old;
 int brignes,utc;
 int r,g,b,cv,cv1;
 byte len_ssid, len_pass;
 
 
 
void setup(){
  delay(1000);timeClient.begin();
  EEPROM.begin(512);
  len_ssid = EEPROM.read(96);
  len_pass = EEPROM.read(97);
 if(len_pass > 64) len_pass = 0;
 
  brignes = EEPROM.read(200);
  utc = EEPROM.read(201);
  cv = EEPROM.read(202);
  cv1 = EEPROM.read(203);
  if(brignes<10||brignes>255){brignes=10;}
  timeClient.setTimeOffset(utc*1800);
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(5,INPUT_PULLUP);// D1
 
 /// точка доступа
  if(digitalRead(5)==LOW){
  WiFi.softAP(ssid, password);
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.on("/", handleRoot);
  server.on("/ok", handleOk);
  server.begin();
  Serial.println("HTTP server started");  
  }
  else{
        // Режим STATION
      WiFi.mode( WIFI_STA);
      unsigned char* buf_ssid = new unsigned char[32];
      unsigned char* buf_pass = new unsigned char[64];
      for(byte i = 0; i < len_ssid; i++) buf_ssid[i] = char(EEPROM.read(i));
      buf_ssid[len_ssid] = '\x0';
      const char *ssid  = (const char*)buf_ssid;
      for(byte i = 0; i < len_pass; i++) buf_pass[i] = char(EEPROM.read(i + 32));
      const char *pass  = (const char*)buf_pass;
      buf_pass[len_pass] = '\x0';
      delay(2000);
      Serial.print("SSID: ");
      Serial.print(ssid);
      Serial.print("   ");
      Serial.print("Password: ");
      Serial.println(pass);
 
     WiFi.begin(ssid, pass);
      // Wait for connection
      while (WiFi.status() != WL_CONNECTED){delay (500);Serial.print (".");}
      Serial.println();
      Serial.print("Connected to ");
      Serial.println(ssid);
      Serial.print("IP address: ");
      Serial.println(WiFi.localIP());
      server.on("/", web);
      server.on("/reset", web0);
      server.begin();
      Serial.println(brignes);
      Serial.println(utc);
      Serial.println(cv);
      Serial.println(cv1);
    }
  strip.begin();
}
 
void loop(){
  server.handleClient();
 
  if(digitalRead(5)==HIGH){
  //// Time //////////////////////////////////////////
  if(millis()-times>=1000){times=millis();
   while(!timeClient.update()){timeClient.forceUpdate();}
   hh = timeClient.getHours();
   mm = timeClient.getMinutes();
   ss = timeClient.getSeconds();
  date_time = timeClient.getFormattedDate();
  int index_date = date_time.indexOf("T");
  date = date_time.substring(0, index_date);
  char charBufVar[11];date.toCharArray(charBufVar, 11);
   dd = int(charBufVar[0]-'0')*10+int(charBufVar[1]-'0');
   mon = int(charBufVar[3]-'0')*10+int(charBufVar[4]-'0');
   yer = int(charBufVar[8]-'0')*10+int(charBufVar[9]-'0');
  }
  Serial.print(hh/10);Serial.print(hh%10);Serial.print(":");Serial.print(mm/10);Serial.print(mm%10);Serial.print(":");Serial.print(ss/10);Serial.println(ss%10);
  //// ws2812 /////////////////////////////////////////
 
 if(ss>10&&ss<15){hear10=dd/10;hear0=dd%10;min10=mon/10;min0=mon%10;sec10=yer/10;sec0=yer%10;hhh=1;}
  else{hear10=hh/10;hear0=hh%10;min10=mm/10;min0=mm%10;sec10=ss/10;sec0=ss%10;hhh=0;}
 
 
  switch(hear10){   
    case 0: ws(0,1);ws(1,1);ws(2,1);ws(3,1);ws(4,1);ws(5,1);ws(6,0);break;
    case 1: ws(0,0);ws(1,1);ws(2,1);ws(3,0);ws(4,0);ws(5,0);ws(6,0);break;
    case 2: ws(0,1);ws(1,2);ws(2,0);ws(3,1);ws(4,1);ws(5,0);ws(6,1);break;
    case 3: ws(0,1);ws(1,1);ws(2,1);ws(3,1);ws(4,0);ws(5,0);ws(6,1);break;
    case 4: ws(0,0);ws(1,1);ws(2,1);ws(3,0);ws(4,0);ws(5,1);ws(6,1);break;
    case 5: ws(0,1);ws(1,0);ws(2,1);ws(3,1);ws(4,0);ws(5,1);ws(6,1);break;
    case 6: ws(0,1);ws(1,0);ws(2,1);ws(3,1);ws(4,1);ws(5,1);ws(6,1);break;
    case 7: ws(0,1);ws(1,1);ws(2,1);ws(3,0);ws(4,0);ws(5,0);ws(6,0);break;
    case 8: ws(0,1);ws(1,1);ws(2,1);ws(3,1);ws(4,1);ws(5,1);ws(6,1);break;
    case 9: ws(0,1);ws(1,1);ws(2,1);ws(3,1);ws(4,0);ws(5,1);ws(6,1);break;
   case 10: ws(0,0);ws(1,0);ws(2,0);ws(3,0);ws(4,0);ws(5,0);ws(6,0);break;// " "
   case 11: ws(0,0);ws(1,0);ws(2,0);ws(3,1);ws(4,1);ws(5,1);ws(6,1);break;// "t"
   case 12: ws(0,1);ws(1,1);ws(2,0);ws(3,0);ws(4,1);ws(5,1);ws(6,1);break;// "P"
   case 13: ws(0,0);ws(1,1);ws(2,1);ws(3,0);ws(4,1);ws(5,1);ws(6,1);break;// "H"
   case 14: ws(0,1);ws(1,0);ws(2,0);ws(3,1);ws(4,1);ws(5,1);ws(6,1);break;// "C"
   case 15: ws(0,1);ws(1,1);ws(2,0);ws(3,0);ws(4,0);ws(5,1);ws(6,1);break;// градус
    }
   switch(hear0){   
    case 0: ws(7,1);ws(8,1);ws(9,1);ws(10,1);ws(11,1);ws(12,1);ws(13,0);break;
    case 1: ws(7,0);ws(8,1);ws(9,1);ws(10,0);ws(11,0);ws(12,0);ws(13,0);break;
    case 2: ws(7,1);ws(8,2);ws(9,0);ws(10,1);ws(11,1);ws(12,0);ws(13,1);break;
    case 3: ws(7,1);ws(8,1);ws(9,1);ws(10,1);ws(11,0);ws(12,0);ws(13,1);break;
    case 4: ws(7,0);ws(8,1);ws(9,1);ws(10,0);ws(11,0);ws(12,1);ws(13,1);break;
    case 5: ws(7,1);ws(8,0);ws(9,1);ws(10,1);ws(11,0);ws(12,1);ws(13,1);break;
    case 6: ws(7,1);ws(8,0);ws(9,1);ws(10,1);ws(11,1);ws(12,1);ws(13,1);break;
    case 7: ws(7,1);ws(8,1);ws(9,1);ws(10,0);ws(11,0);ws(12,0);ws(13,0);break;
    case 8: ws(7,1);ws(8,1);ws(9,1);ws(10,1);ws(11,1);ws(12,1);ws(13,1);break;
    case 9: ws(7,1);ws(8,1);ws(9,1);ws(10,1);ws(11,0);ws(12,1);ws(13,1);break;
   case 10: ws(7,0);ws(8,0);ws(9,0);ws(10,0);ws(11,0);ws(12,0);ws(13,0);break;// " "
   case 11: ws(7,0);ws(8,0);ws(9,0);ws(10,1);ws(11,1);ws(12,1);ws(13,1);break;// "t"
   case 12: ws(7,1);ws(8,1);ws(9,0);ws(10,0);ws(11,1);ws(12,1);ws(13,1);break;// "P"
   case 13: ws(7,0);ws(8,1);ws(9,1);ws(10,0);ws(11,1);ws(12,1);ws(13,1);break;// "H"
   case 14: ws(7,1);ws(8,0);ws(9,0);ws(10,1);ws(11,1);ws(12,1);ws(13,1);break;// "C"
   case 15: ws(7,1);ws(8,1);ws(9,0);ws(10,0);ws(11,0);ws(12,1);ws(13,1);break;// градус   
    } 
 
/// двоеточие и запятая
   if(hhh==0){
   if(ss!=ss_old){times1=millis();}  
   if(millis()-times1<500){ws1(14,1);ws1(15,1);ws1(30,1); digitalWrite(2, HIGH);}
   else{ws1(14,0);ws1(15,0);ws1(30,0); digitalWrite(2, LOW);}
   ss_old=ss;}
 
   if(hhh==1){ws1(14,1);ws1(15,0);ws1(30,1); digitalWrite(2, LOW);}
 
   switch(min10){   
    case 0: ws(16,1);ws(17,1);ws(18,1);ws(19,1);ws(20,1);ws(21,1);ws(22,0);break;
    case 1: ws(16,0);ws(17,1);ws(18,1);ws(19,0);ws(20,0);ws(21,0);ws(22,0);break;    
    case 2: ws(16,1);ws(17,2);ws(18,0);ws(19,1);ws(20,1);ws(21,0);ws(22,1);break;
    case 3: ws(16,1);ws(17,1);ws(18,1);ws(19,1);ws(20,0);ws(21,0);ws(22,1);break;
    case 4: ws(16,0);ws(17,1);ws(18,1);ws(19,0);ws(20,0);ws(21,1);ws(22,1);break;
    case 5: ws(16,1);ws(17,0);ws(18,1);ws(19,1);ws(20,0);ws(21,1);ws(22,1);break;
    case 6: ws(16,1);ws(17,0);ws(18,1);ws(19,1);ws(20,1);ws(21,1);ws(22,1);break;
    case 7: ws(16,1);ws(17,1);ws(18,1);ws(19,0);ws(20,0);ws(21,0);ws(22,0);break;
    case 8: ws(16,1);ws(17,1);ws(18,1);ws(19,1);ws(20,1);ws(21,1);ws(22,1);break;
    case 9: ws(16,1);ws(17,1);ws(18,1);ws(19,1);ws(20,0);ws(21,1);ws(22,1);break;
   case 10: ws(16,0);ws(17,0);ws(18,0);ws(19,0);ws(20,0);ws(21,0);ws(22,0);break;// " " 
   case 11: ws(16,0);ws(17,0);ws(18,0);ws(19,1);ws(20,1);ws(21,1);ws(22,1);break;// "t" 
   case 12: ws(16,1);ws(17,1);ws(18,0);ws(19,0);ws(20,1);ws(21,1);ws(22,1);break;// "P"
   case 13: ws(16,0);ws(17,1);ws(18,1);ws(19,0);ws(20,1);ws(21,1);ws(22,1);break;// "H"
   case 14: ws(16,1);ws(17,0);ws(18,0);ws(19,1);ws(20,1);ws(21,1);ws(22,1);break;// "C"
   case 15: ws(16,1);ws(17,1);ws(18,0);ws(19,0);ws(20,0);ws(21,1);ws(22,1);break;// градус  
    }
   switch(min0){   
    case 0: ws(23,1);ws(24,1);ws(25,1);ws(26,1);ws(27,1);ws(28,1);ws(29,0);break;
    case 1: ws(23,0);ws(24,1);ws(25,1);ws(26,0);ws(27,0);ws(28,0);ws(29,0);break;
    case 2: ws(23,1);ws(24,2);ws(25,0);ws(26,1);ws(27,1);ws(28,0);ws(29,1);break;
    case 3: ws(23,1);ws(24,1);ws(25,1);ws(26,1);ws(27,0);ws(28,0);ws(29,1);break;
    case 4: ws(23,0);ws(24,1);ws(25,1);ws(26,0);ws(27,0);ws(28,1);ws(29,1);break;
    case 5: ws(23,1);ws(24,0);ws(25,1);ws(26,1);ws(27,0);ws(28,1);ws(29,1);break;
    case 6: ws(23,1);ws(24,0);ws(25,1);ws(26,1);ws(27,1);ws(28,1);ws(29,1);break;
    case 7: ws(23,1);ws(24,1);ws(25,1);ws(26,0);ws(27,0);ws(28,0);ws(29,0);break;
    case 8: ws(23,1);ws(24,1);ws(25,1);ws(26,1);ws(27,1);ws(28,1);ws(29,1);break;
    case 9: ws(23,1);ws(24,1);ws(25,1);ws(26,1);ws(27,0);ws(28,1);ws(29,1);break;
   case 10: ws(23,0);ws(24,0);ws(25,0);ws(26,0);ws(27,0);ws(28,0);ws(29,0);break;// " " 
   case 11: ws(23,0);ws(24,0);ws(25,0);ws(26,1);ws(27,1);ws(28,1);ws(29,1);break;// "t" 
   case 12: ws(23,1);ws(24,1);ws(25,0);ws(26,0);ws(27,1);ws(28,1);ws(29,1);break;// "P"
   case 13: ws(23,0);ws(24,1);ws(25,1);ws(26,0);ws(27,1);ws(28,1);ws(29,1);break;// "H"
   case 14: ws(23,1);ws(24,0);ws(25,0);ws(26,1);ws(27,1);ws(28,1);ws(29,1);break;// "C"
   case 15: ws(23,1);ws(24,1);ws(25,0);ws(26,0);ws(27,0);ws(28,1);ws(29,1);break;// градус  
    } 
 
 
 
   switch(sec10){   
    case 0: ws(31,1);ws(32,1);ws(33,1);ws(34,1);ws(35,1);ws(36,1);ws(37,0);break;
    case 1: ws(31,0);ws(32,1);ws(33,1);ws(34,0);ws(35,0);ws(36,0);ws(37,0);break;
    case 2: ws(31,1);ws(32,2);ws(33,0);ws(34,1);ws(35,1);ws(36,0);ws(37,1);break;
    case 3: ws(31,1);ws(32,1);ws(33,1);ws(34,1);ws(35,0);ws(36,0);ws(37,1);break;
    case 4: ws(31,0);ws(32,1);ws(33,1);ws(34,0);ws(35,0);ws(36,1);ws(37,1);break;
    case 5: ws(31,1);ws(32,0);ws(33,1);ws(34,1);ws(35,0);ws(36,1);ws(37,1);break;
    case 6: ws(31,1);ws(32,0);ws(33,1);ws(34,1);ws(35,1);ws(36,1);ws(37,1);break;
    case 7: ws(31,1);ws(32,1);ws(33,1);ws(34,0);ws(35,0);ws(36,0);ws(37,0);break;
    case 8: ws(31,1);ws(32,1);ws(33,1);ws(34,1);ws(35,1);ws(36,1);ws(37,1);break;
    case 9: ws(31,1);ws(32,1);ws(33,1);ws(34,1);ws(35,0);ws(36,1);ws(37,1);break;
   case 10: ws(31,0);ws(32,0);ws(33,0);ws(34,0);ws(35,0);ws(36,0);ws(37,0);break;// " " 
   case 11: ws(31,0);ws(32,0);ws(33,0);ws(34,1);ws(35,1);ws(36,1);ws(37,1);break;// "t" 
   case 12: ws(31,1);ws(32,1);ws(33,0);ws(34,0);ws(35,1);ws(36,1);ws(37,1);break;// "P"
   case 13: ws(31,0);ws(32,1);ws(33,1);ws(34,0);ws(35,1);ws(36,1);ws(37,1);break;// "H"
   case 14: ws(31,1);ws(32,0);ws(33,0);ws(34,1);ws(35,1);ws(36,1);ws(37,1);break;// "C"
   case 15: ws(31,1);ws(32,1);ws(33,0);ws(34,0);ws(35,0);ws(36,1);ws(37,1);break;// градус    
    }
   switch(sec0){   
    case 0: ws(38,1);ws(39,1);ws(40,1);ws(41,1);ws(42,1);ws(43,1);ws(44,0);break;
    case 1: ws(38,0);ws(39,1);ws(40,1);ws(41,0);ws(42,0);ws(43,0);ws(44,0);break;
    case 2: ws(38,1);ws(39,2);ws(40,0);ws(41,1);ws(42,1);ws(43,0);ws(44,1);break;
    case 3: ws(38,1);ws(39,1);ws(40,1);ws(41,1);ws(42,0);ws(43,0);ws(44,1);break;
    case 4: ws(38,0);ws(39,1);ws(40,1);ws(41,0);ws(42,0);ws(43,1);ws(44,1);break;
    case 5: ws(38,1);ws(39,0);ws(40,1);ws(41,1);ws(42,0);ws(43,1);ws(44,1);break;
    case 6: ws(38,1);ws(39,0);ws(40,1);ws(41,1);ws(42,1);ws(43,1);ws(44,1);break;
    case 7: ws(38,1);ws(39,1);ws(40,1);ws(41,0);ws(42,0);ws(43,0);ws(44,0);break;
    case 8: ws(38,1);ws(39,1);ws(40,1);ws(41,1);ws(42,1);ws(43,1);ws(44,1);break;
    case 9: ws(38,1);ws(39,1);ws(40,1);ws(41,1);ws(42,0);ws(43,1);ws(44,1);break;
   case 10: ws(38,0);ws(39,0);ws(40,0);ws(41,0);ws(42,0);ws(43,0);ws(44,0);break;// " " 
   case 11: ws(38,0);ws(39,0);ws(40,0);ws(41,1);ws(42,1);ws(43,1);ws(44,1);break;// "t" 
   case 12: ws(38,1);ws(39,1);ws(40,0);ws(41,0);ws(42,1);ws(43,1);ws(44,1);break;// "P"
   case 13: ws(38,0);ws(39,1);ws(40,1);ws(41,0);ws(42,1);ws(43,1);ws(44,1);break;// "H"
   case 14: ws(38,1);ws(39,0);ws(40,0);ws(41,1);ws(42,1);ws(43,1);ws(44,1);break;// "C"
   case 15: ws(38,1);ws(39,1);ws(40,0);ws(41,0);ws(42,0);ws(43,1);ws(44,1);break;// градус    
    } 
  strip.show();
  }
  delay(100);
  }
 
void ws(int ind, bool datt){
  if(cv==1){r=brignes;g=0;b=0;}
  if(cv==2){r=0;g=brignes;b=0;}
  if(cv==3){r=0;g=0;b=brignes;}
  if(cv==0){r=brignes;g=brignes;b=brignes;}
  if(datt==1){strip.setPixelColor(ind, strip.Color(r, g, b));}
  if(datt==0){strip.setPixelColor(ind, strip.Color(0, 0, 0));}
  }
void ws1(int ind, bool datt){
  if(cv1==1){r=brignes;g=0;b=0;}
  if(cv1==2){r=0;g=brignes;b=0;}
  if(cv1==3){r=0;g=0;b=brignes;}
  if(cv1==0){r=brignes;g=brignes;b=brignes;}
  if(datt==1){strip.setPixelColor(ind, strip.Color(r, g, b));}
  if(datt==0){strip.setPixelColor(ind, strip.Color(0, 0, 0));}
  }  
 
void web(){ 
   String webPage = "<meta charset='utf-8'><meta name='viewport' content='width=480, user-scalable=no' />";
   //style
          webPage += "<head><style>.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}";
          webPage += "#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}";
          webPage += "#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}";
          webPage += "#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}";
          webPage += "#menu1 a:hover{color:#fff; background:#555;}";
          webPage += "#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}";
          webPage += "</style></head>";
    /////////////   
          webPage += "<TABLE class='tab1' align='center' width='470' BORDER='1' cellspacing='0' cellpadding='10'>";
          webPage +="<td><h1><center>ESP8266<br>Страница настройки Интернет часов</h1>";
          webPage +="<tr><td><center><big>Текущее время: ";
          webPage += hh/10;webPage += hh%10; webPage +=":";webPage +=mm/10;
          webPage += mm%10; webPage +=":";webPage +=ss/10;webPage += ss%10;
          webPage += "</center>";
          webPage += "<form method='POST' action='reset' >";
          webPage += "<tr><td><input name='brignes'  autocomplete='off' maxlength='3' size='1'> Яркость 10...255 ";
          webPage += "<br>Установлено: ";webPage += brignes;
          webPage += "<tr><td><input name='time_utc'  autocomplete='off' maxlength='3' size='1'> Временной сдвиг UTC (30 мин)";
          webPage += "<br>Установлено: ";webPage += utc;
          webPage += " (";webPage += utc*0.5;webPage += " ч.)";
 
          webPage += "<tr><td><input name='cv'  autocomplete='off' maxlength='3' size='1'> Цвет цифр 0...3";
          webPage += "<br>0 - белый, 1 - красный, 2 - зеленый, 3 - синий";
          webPage += "<br>Установлено: ";webPage += cv;
 
          webPage += "<tr><td><input name='cv1'  autocomplete='off' maxlength='3' size='1'> Цвет двоеточия и запятой 0...3";
          webPage += "<br>0 - белый, 1 - красный, 2 - зеленый, 3 - синий";
          webPage += "<br>Установлено: ";webPage += cv1;
 
          webPage += "<tr><td><center><input type=SUBMIT value='Сохранить настройки'>";
          webPage += "</form>";
          webPage += "<center><br>Заполните все ячейки формы, незаполненная ячейка формы будет сохранена как 0";
   server.send(200, "text/html", webPage);//sumbit();
}
 
void sumbit(){ 
    if (server.args() > 0 ) {
    for ( uint8_t i = 0; i < server.args(); i++ ) {
      if (server.argName(i) == "brignes"){brignes = server.arg(i).toInt();}
      if (server.argName(i) == "time_utc"){utc = server.arg(i).toInt();}
      if (server.argName(i) == "cv"){cv = server.arg(i).toInt();}
      if (server.argName(i) == "cv1"){cv1 = server.arg(i).toInt();}
      }
      Serial.println("Save");
      Serial.println(brignes);
      Serial.println(utc);
      Serial.println(cv);
      Serial.println(cv1);
      EEPROM.begin(512);
      EEPROM.write(200,brignes);
      EEPROM.write(201,utc);
      EEPROM.write(202,cv);
      EEPROM.write(203,cv1);
      EEPROM.commit();
      delay(1000);ESP.restart();
      }}
 
void handleRoot() { 
   String str = "<meta charset='utf-8'><meta name='viewport' content='width=480, user-scalable=no' />";
   //style
          str += "<head><style>.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}";
          str += "#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}";
          str += "#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}";
          str += "#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}";
          str += "#menu1 a:hover{color:#fff; background:#555;}";
          str += "#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}";
          str += "</style></head>";
   ////////////       
          str += "<TABLE class='tab1' align='center' width='470' BORDER='1' cellspacing='0' cellpadding='10'>";
          str +="<td><h1><center>ESP8266<br>Авторизация</h1>";
          str += "<form method='POST' action='ok'>";
          str += "<tr><td><input name='ssid'  autocomplete='off'><big> Имя Wi-Fi сети";
          str += "<tr><td><input name='pswd'  autocomplete='off'><big> Пароль";
          str += "<tr><td><center><input type=SUBMIT value='Сохранить настройки'>";
          str += "</form>";
server.send ( 200, "text/html", str );
}      
 
void handleOk(){
  String ssid_ap;
  String pass_ap;
  unsigned char* buf = new unsigned char[64];
 
  String str = "<meta charset='utf-8'><meta name='viewport' content='width=480, user-scalable=no' />";;
  str += "<body>";
 
  EEPROM.begin(512);
 
  ssid_ap = server.arg(0);
  pass_ap = server.arg(1);
 
  if(ssid_ap != ""){
    EEPROM.write(96,ssid_ap.length());
    EEPROM.write(97,pass_ap.length());
    ssid_ap.getBytes(buf, ssid_ap.length() + 1);
    for(byte i = 0; i < ssid_ap.length(); i++)
      EEPROM.write(i, buf[i]);
 
    pass_ap.getBytes(buf, pass_ap.length() + 1);
    for(byte i = 0; i < pass_ap.length(); i++)
      EEPROM.write(i + 32, buf[i]);
 
    EEPROM.commit();
    EEPROM.end();
/////////////////////////
    WiFi.begin(ssid_ap, pass_ap);
      // Wait for connection
      while (WiFi.status() != WL_CONNECTED){delay (500);}
 ///////////////////////////////////////////////////////////////////////////  
    str +="<big><center>Конфигурация сохранена в память<br>";
    str +="<big><center>Уберите перемычку с D1 и перезагрузите ESP8266</p><br>";
    str +="<big><b><center>";
    str += WiFi.localIP().toString();
    str +="</b><hr>";
    str +="<a href=\"/\">Return</a> to settings page</br>";
  }
  else {
    str += "<big><center>No WIFI Net</br>\
   <a href=\"/\">Return</a> to settings page</br>";
  }
  str += "</body></html>";
  server.send ( 200, "text/html", str );
}
 
void web0() { 
   String str0 = "<meta charset='utf-8'><meta name='viewport' content='width=480, user-scalable=no' />";
          str0 += "<center><b><big>После перезагрузки ESP8266 (светодиод на плате начнет мигать) перейдите по <a href='./'>ссылке</a>";
          server.send (200, "text/html", str0);sumbit();
}

Фото и видео

Фото и видео материалы представлены: Кириллом Никофоровым (сборка и отладка проекта)

Добавить комментарий

Войти с помощью: 

Случайные статьи

  • Тестер транзисторов

    Тестер построен на базе ИМС 555, таймер 555 работает в астабильном режиме. Мультивибратор на IC1 генерирует последовательность импульсов для питания и управления тестируемыми транзисторами. Тестер сам определяет и сигнализирует о структуру транзистора и сигнализирует о его неисправности. Если транзистор исправен то тестер показывает свечением светодиодов его структуру, если транзистор неисправен …Подробнее...
  • Расчет резонансной частоты колебательного контура

    Расчет резонансной частоты колебательного контура

    Колебательный контур — электрическая цепь, содержащая катушку индуктивности, конденсатор и источник электрической энергии. При последовательном соединении элементов цепи колебательный контур называется последовательным, при параллельном − параллельным. Колебательный контур — простейшая система, в которой могут происходить свободные электромагнитные колебания. Резонансная частота контура определяется так называемой формулой Томсона: ƒ = 1/(2π√(LC)) При …Подробнее...
  • Простой стабилизированный источник питания 12В/3А

    Этот источник питания выдает напряжение 12В при токе нагрузки 3А. Трансформатор питания должен обеспечивать на вторичной обмотке напряжение не менее 18В и быть мощность. Не менее 50 Вт. Есть возможность получить другое выходное напряжение путем замены стабилитрона VD1 с другим напряжением стабилизации.Подробнее...
  • УМЗЧ на TDA2003

    УМЗЧ на TDA2003

    УМЗЧ на TDA2003   TDA2003: Напряжение питания 14,4В, минимальное 8В, максимальное 18В Выходное напряжение покоя 6,1…7,7В в зависимости от напряжения питания Ток покоя при напряжении питания +14,4В 50мА Выходная мощность на нагрузке 4 Ом при частоте 1 кГц 6Вт при КНИ 10% КНИ на частоте 1 кГц 0,15% при номинальной …Подробнее...
  • УМЗЧ класса D на TPA3122D2

    УМЗЧ класса D на TPA3122D2

    На ИМС TPA3122D2 можно собрать усилитель звуковой частоты класса D. Выходная мощность усилителя 15В (при напряжении питания 28В и сопротивлении нагрузки 8 Ом) на канал. Из-за высокого КПД микросхеме TPA3122D2 не нужен радиатор охлаждения. Так же микросхему TPA3122D2 можно использовать в мостовом соединении каналов. МикросхемаTPA3122D2 работает в диапазоне напряжений от 10 …Подробнее...