Ранее в статье http://rcl-radio.ru/?p=91626 был рассмотрен пример создания больших часов на светодиодной RGB ленте на на основе чипа WS2811 (SM16703) под управлением wi-fi модуля NodeMcu v3 с чипом ESP8266 (ESP-12e). В этой статье будет рассмотрен пример доработки часов, добавлен веб-интерфейс настройки и авторизации в сети в Wi-Fi сети.
Перед настройкой интернет часов выполните следующие пункты:
- Ознакомьтесь с первой частью проекта — http://rcl-radio.ru/?p=91626
- Настройка Arduino IDE для работы с модулем NodeMcu v3 — http://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(); }
- Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=2716#p2716
- Доработка проекта — http://forum.rcl-radio.ru/viewtopic.php?pid=2910#p2910
Фото и видео
Фото и видео материалы представлены: Кириллом Никофоровым (сборка и отладка проекта)
На точках вместо WS2811(3 светика) можно использовать по одному WS2812 количество пикселей не изменится.