//ESP32 Wroover module #include #include #include WebServer server(80); //================= #include "driver/rtc_io.h" //================= #include #include // for store settings #include "AsyncStream.h" AsyncStream<4096> serial(&Serial, '~', 50); #define LOOPS_CNT_AFTER_INT2 15 #define MIN_READ_DATA_SIZE 79 uint16_t loops_cnt=0; const char *ap_id, *hipp; //#define ESP_READY_DURATION 10 //======== BTNS AND RTC VAR CONF =================== #define BUTTON_PIN_BITMASK 0x1000 //12 pin, wake up btn RTC_DATA_ATTR int firststart = true; //RTC_DATA_ATTR int firststart = false; int btnsList[] = {14, -1}; // config btn //========================================== void pisk(int n) { return; } const int PIN_CONF = 14; //2; const int PIN_READY = 16; //0; boolean conf = false; boolean wifi_started = false; boolean blink_mode = false; boolean wait_serial = true; uint32_t s_start=0; void setup() { Serial.begin(115200); //Serial.begin(57600); //Serial.begin(19200); //Serial.begin(9600); //Serial.begin(2400); while (!Serial) { delay(10); // will pause Zero, Leonardo, etc until serial console opens } pinMode(PIN_CONF, INPUT); pinMode(PIN_READY, OUTPUT); Serial.println("START"); // check config pin if ( digitalRead(PIN_CONF) == HIGH ) { // button pressed conf = true; Serial.println("Button pressed"); Serial.println("CONFIG MODE"); Serial.println("CM"); }else{ conf = false; //Serial.println("Button NOT pressed"); //Serial.println("WORK MODE"); Serial.println("WM"); } // Start AP/webserver or try connect to WiFi point if(conf){ // Режим SoftAP startWiFiServer(); Serial.println("startWiFiServer"); digitalWrite(PIN_READY, HIGH); delay(200); digitalWrite(PIN_READY, LOW); delay(200); digitalWrite(PIN_READY, HIGH); delay(200); digitalWrite(PIN_READY, LOW); delay(200); digitalWrite(PIN_READY, HIGH); // поятоянно горящий светодиод - признак режима конфигурации return; } if(firststart){ // read world time Serial.println("Start wifi "+String(millis())); wifi_started = startWiFiClient(); // time reading by firststart flag if(wifi_started){ Serial.println("wifi started "+String(millis())); digitalWrite(PIN_READY, HIGH); firststart = false; }else{ Serial.println("can not started WiFi"); blink_mode=true; } }else{ digitalWrite(PIN_READY, HIGH); } Serial.println("BGN"); // готов принимать данные s_start = millis(); loops_cnt=0; Serial.println("Start. "+String(millis())); } //const char* httpuri ="http://www.bannerhost.ru/cgi-bin/esp01"; const char* httpuri; // ="http://195.201.126.70:8080/sbadat"; void loop() { if(blink_mode){ digitalWrite(PIN_READY, HIGH); delay(200); digitalWrite(PIN_READY, LOW); delay(200); return; } if(conf){ // режим конфигурации server.handleClient(); }else{ if(firststart){ firststart = false; Serial.println("firststart"); Serial.println("goto sleep"); // sleep // уходим в сон //esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH); esp_sleep_enable_ext0_wakeup(GPIO_NUM_12,1); rtc_gpio_pullup_dis(GPIO_NUM_12); rtc_gpio_pulldown_en(GPIO_NUM_12); //Go to sleep now //Serial.println("Going to sleep now"); esp_deep_sleep_start(); Serial.println("This will never be printed"); return; } // режим приёма данных и отправки на сервер int sa_steps=0; //while(!serial.available()){ // sa_steps++; //} if (wait_serial) {wait_serial=false;Serial.println("wait serial");} if (serial.available()) { // если данные получены wait_serial=true; time_t sending_time = time(nullptr); if(!wifi_started){ Serial.println("Start wifi: "+String(millis())); wifi_started = startWiFiClient(); // time reading by firststart flag if(wifi_started){ Serial.println("wifi started: "+String(millis())); }else{ Serial.println("can not started WiFi"); blink_mode=true; return; } } uint32_t reading_time = millis() - s_start; int data_len = strlen(serial.buf); boolean get_last_loop_flag = false; if(serial.buf[0] == 'L') { get_last_loop_flag = true; Serial.println("get_last_loop_flag"); } Serial.println("data readed: "+String(millis())+", data size = "+String(data_len)); if(data_len < MIN_READ_DATA_SIZE){ Serial.println("data size too small!"); return; } digitalWrite(PIN_READY, LOW); // данные приняты для отправки // start WiFi client uint32_t wifi_start_time = millis(); Serial.println("start wifi"); if(wifi_started){ Serial.println("wifi started"); // send buf to host WiFiClient client; String ds = ap_id; //ds += ", uart time: "; //ds += String(reading_time); //ds += ", WiFi connection time: "; //ds += String(millis() - wifi_start_time); ds += ", data size: "; ds += String(data_len); ds += ", sending time: "; char fstr[32]; sprintf(fstr,"%lu", sending_time); ds += fstr; HTTPClient http; //Объявить объект класса HttpClient http.begin(client, httpuri); //Укажите адрес запроса http.addHeader("Content-Type", "text/plain"); //Укажите заголовок типа содержимого //http.addHeader("Title", ap_id); // так передадим ID датчика Serial.println("Send data:"); Serial.println(ds); Serial.println(serial.buf); http.addHeader("Title", ds); // так передадим ID датчика int httpCode = http.POST(serial.buf); //Отправьте запрос String payload = http.getString(); //Получите полезную нагрузку ответа Serial.println("HTTP answer:"); Serial.println(httpCode); //Распечатать код возврата HTTP Serial.println(payload); //Полезная нагрузка для ответа на запрос печати http.end(); //Закрыть соединение } digitalWrite(PIN_READY, HIGH); // NON STOP VERSION //loops_cnt++; Serial.println("loops_cnt = "+String(loops_cnt)); if((loops_cnt >= LOOPS_CNT_AFTER_INT2) || get_last_loop_flag){ loops_cnt=0; firststart = true; Serial.println("goto sleep"); stopWiFiClient(); delay(100); digitalWrite(PIN_READY, LOW); // засыпаем, пока на RST не моргнут LOW //ESP.deepSleep(0); // уходим в сон, пока не включится 12я кнопка //esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH); esp_sleep_enable_ext0_wakeup(GPIO_NUM_12,1); rtc_gpio_pullup_dis(GPIO_NUM_12); rtc_gpio_pulldown_en(GPIO_NUM_12); //Go to sleep now //Serial.println("Going to sleep now"); esp_deep_sleep_start(); Serial.println("This will never be printed"); } } } } void stopWiFiClient() { WiFi.disconnect(); Serial.println("WiFi disconnected"); } #define CONN_TRY_LIMIT 5 bool startWiFiClient() { blink_mode = false; //WiFi.forceSleepWake(); // try connect to WiFi point byte len_ssid, len_pass, len_id, len_hipp; EEPROM.begin(98); len_hipp = EEPROM.read(94); len_id = EEPROM.read(95); len_ssid = EEPROM.read(96); len_pass = EEPROM.read(97); if((len_ssid > 0) && (len_pass > 0) && (len_id > 0) && (len_hipp > 0) && ((len_id+len_ssid+len_pass+len_hipp)<=94)){ // Режим STATION WiFi.mode( WIFI_STA); unsigned char* buf = new unsigned char[100]; for(byte n = 0; n < len_ssid; n++) buf[n] = char(EEPROM.read(n)); buf[len_ssid] = '\x0'; const char *ssid = (const char*)buf; unsigned char *buf_pass = buf+len_ssid+1; for(byte n = 0; n < len_pass; n++) buf_pass[n] = char(EEPROM.read(n + len_ssid)); buf_pass[len_pass] = '\x0'; const char *pass = (const char*)buf_pass; unsigned char *buf_id = buf_pass+len_pass+1; for(byte n = 0; n < len_id; n++) buf_id[n] = char(EEPROM.read(n + len_ssid + len_pass)); buf_id[len_id] = '\x0'; ap_id = (const char *)buf_id; //Serial.print("Try connect to "); //Serial.println(ssid); //Serial.println(" / "); //Serial.println(pass); WiFi.begin(ssid, pass); // Wait for connection // read hipp unsigned char *buf_hipp = buf_id+len_id+1; for(byte n = 0; n < len_hipp; n++) buf_hipp[n] = char(EEPROM.read(n + len_ssid + len_pass + len_id)); buf_hipp[len_hipp] = '\x0'; hipp = (const char *)buf_hipp; httpuri = hipp; int try_cnt = 0; while ( WiFi.status() != WL_CONNECTED ) { try_cnt++; Serial.print("."); delay ( 100 ); } //Serial.println("Connected"); if(firststart){ // Получение мирового времени //Serial.print("Retrieving time: "); configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP time_t now = time(nullptr); while (now < 24 * 3600) { //Serial.print("."); digitalWrite(PIN_READY, HIGH); delay(20); digitalWrite(PIN_READY, LOW); delay(80); now = time(nullptr); //pisk(1); } //Serial.println(now); firststart = false; } return(true); } blink_mode = true; return(false); } void startWiFiServer() { const char *ssid_ap = "SmaptBedPoint"; WiFi.mode(WIFI_AP); WiFi.softAP(ssid_ap); delay(2000); IPAddress myIP = WiFi.softAPIP(); server.on("/", handleRoot); server.on("/ok", handleOk); server.begin(); //Serial.print("AP IP address: "); //Serial.println(myIP); //Serial.println("HTTP server started"); } //================================ // веб-сервер первичной настройки //================================ String html_header = "\ \ \ ESP32_NEW_BED Settings\ \ "; void handleRoot() { digitalWrite(PIN_READY, HIGH); String str = ""; str += html_header; // IntelNUC - http://192.168.0.108:8080/ // Doich - http://195.201.126.70:8080/sbadat str += "

\
\ WIFI Net
\ Password

\ Tablet ID

\ HOST_IP:PORT

\ \
\

\ "; server.send ( 200, "text/html", str ); } void handleOk(){ String ssid_ap, pass_ap, id_ap, hipp_ap; unsigned char* buf = new unsigned char[64]; String str = ""; str += html_header; str += ""; ssid_ap = server.arg(0); pass_ap = server.arg(1); id_ap = server.arg(2); hipp_ap = server.arg(3); if((ssid_ap != "") && ((id_ap.length() + ssid_ap.length() + pass_ap.length() + hipp_ap.length()) < 94)){ EEPROM.begin(98); EEPROM.write(94,hipp_ap.length()); EEPROM.write(95,id_ap.length()); EEPROM.write(96,ssid_ap.length()); EEPROM.write(97,pass_ap.length()); // store ssid_ap ssid_ap.getBytes(buf, ssid_ap.length() + 1); for(byte i = 0; i < ssid_ap.length(); i++) EEPROM.write(i, buf[i]); // store pass_ap pass_ap.getBytes(buf, pass_ap.length() + 1); int dlt = ssid_ap.length(); for(byte i = 0; i < pass_ap.length(); i++) EEPROM.write(i + dlt, buf[i]); // store id_ap id_ap.getBytes(buf, id_ap.length() + 1); dlt += pass_ap.length(); for(byte i = 0; i < id_ap.length(); i++) EEPROM.write(i + dlt, buf[i]); // store hipp_ap hipp_ap.getBytes(buf, hipp_ap.length() + 1); dlt += id_ap.length(); for(byte i = 0; i < hipp_ap.length(); i++) EEPROM.write(i + dlt, buf[i]); // end store EEPROM.commit(); EEPROM.end(); //Serial.println("Store to EEPROM WiFi SSID " + ssid_ap +", WiFi PASSWD " + pass_ap +", Tablet ID " + id_ap); str +="Configuration saved in FLASH
\ The module is now restarting automatically for WiFi connection



"; //\ //Return to settings page
"; str += "WiFi SSID [" + ssid_ap +"], WiFi PASSWD [" + pass_ap +"], device ID [" + id_ap + "], Host IP and Port [" + hipp_ap + "]"; str += ""; server.send ( 200, "text/html", str ); delay(1000); digitalWrite(PIN_READY, LOW); //ESP.restart(); }else{ str += "No WIFI Net
\ Return to settings page
"; str += ""; server.send ( 200, "text/html", str ); pisk(7); } //str += ""; //server.send ( 200, "text/html", str ); }