//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 += "\
\
\
";
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 += "