diff --git a/ESP32Wroom_1sec_NONSTOP/ESP32Wroom_1sec_NONSTOP.ino b/ESP32Wroom_1sec_NONSTOP/ESP32Wroom_1sec_NONSTOP.ino new file mode 100644 index 0000000..792964c --- /dev/null +++ b/ESP32Wroom_1sec_NONSTOP/ESP32Wroom_1sec_NONSTOP.ino @@ -0,0 +1,403 @@ +//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 ); +}