Загрузить файлы в «ESP32Wroom_1sec_NONSTOP»
This commit is contained in:
403
ESP32Wroom_1sec_NONSTOP/ESP32Wroom_1sec_NONSTOP.ino
Normal file
403
ESP32Wroom_1sec_NONSTOP/ESP32Wroom_1sec_NONSTOP.ino
Normal file
@@ -0,0 +1,403 @@
|
|||||||
|
//ESP32 Wroover module
|
||||||
|
#include <HTTPClient.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <WebServer.h>
|
||||||
|
WebServer server(80);
|
||||||
|
//=================
|
||||||
|
#include "driver/rtc_io.h"
|
||||||
|
//=================
|
||||||
|
#include <WiFiClient.h>
|
||||||
|
#include <EEPROM.h> // 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 = "<html>\
|
||||||
|
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
|
||||||
|
<head>\
|
||||||
|
<title>ESP32_NEW_BED Settings</title>\
|
||||||
|
<style>\
|
||||||
|
body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
|
||||||
|
</style>\
|
||||||
|
</head>";
|
||||||
|
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 += "<body><H3>\
|
||||||
|
<form method=\"POST\" action=\"ok\">\
|
||||||
|
<input name=\"ssid\" value=\"TP-Link_7C38\"> WIFI Net</br>\
|
||||||
|
<input name=\"pswd\" value=\"36929092\"> Password</br></br>\
|
||||||
|
<input name=\"id\"> Tablet ID</br></br>\
|
||||||
|
<input name=\"hipp\" value=\"http://activity206.li.ru/cgi-bin/radar.sh\"> HOST_IP:PORT</br></br>\
|
||||||
|
<input type=SUBMIT value=\"Save settings\">\
|
||||||
|
</form>\
|
||||||
|
</H3></body>\
|
||||||
|
</html>";
|
||||||
|
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 += "<body>";
|
||||||
|
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</br>\
|
||||||
|
The module is now restarting automatically for WiFi connection</p></br></br>"; //\
|
||||||
|
//<a href=\"/\">Return</a> to settings page</br>";
|
||||||
|
str += "WiFi SSID [" + ssid_ap +"], WiFi PASSWD [" + pass_ap +"], device ID [" + id_ap + "], Host IP and Port [" + hipp_ap + "]";
|
||||||
|
str += "</body></html>";
|
||||||
|
server.send ( 200, "text/html", str );
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(PIN_READY, LOW);
|
||||||
|
//ESP.restart();
|
||||||
|
}else{
|
||||||
|
str += "No WIFI Net</br>\
|
||||||
|
<a href=\"/\">Return</a> to settings page</br>";
|
||||||
|
str += "</body></html>";
|
||||||
|
server.send ( 200, "text/html", str );
|
||||||
|
pisk(7);
|
||||||
|
}
|
||||||
|
//str += "</body></html>";
|
||||||
|
//server.send ( 200, "text/html", str );
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user