From 5983a241ccf8d1d8916a1757c12326f744fd20cc Mon Sep 17 00:00:00 2001
From: shurik
Date: Mon, 25 May 2026 15:43:03 +0300
Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?=
=?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?=
=?UTF-8?q?ESP32Wroom=5F1sec=C2=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ESP32Wroom_1sec/ESP32Wroom_1sec.ino | 395 ++++++++++++++++++++++++++++
1 file changed, 395 insertions(+)
create mode 100644 ESP32Wroom_1sec/ESP32Wroom_1sec.ino
diff --git a/ESP32Wroom_1sec/ESP32Wroom_1sec.ino b/ESP32Wroom_1sec/ESP32Wroom_1sec.ino
new file mode 100644
index 0000000..7a37316
--- /dev/null
+++ b/ESP32Wroom_1sec/ESP32Wroom_1sec.ino
@@ -0,0 +1,395 @@
+//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
+ firststart = false;
+ 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);
+ }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;
+ 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);
+ 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);
+ }
+ 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;
+ str += "\
+
\
+ \
+ ";
+ 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 += "