Вывод данных ESP8266

iconini13ya
Offline
Зарегистрирован: 04.04.2021

Добрый день, уважаемые форумчане ! Опыта имею немного и обратился сюда за советом более опытных людей. 
Суть вопроса проста - есть ESP8266, которая общается с Aruino Uno по Serial порту. Система на подобие охранной с оповещением по смс и по интернету. На ESP8266 поднят Web сервер. Arduino Uno выступает в качестве базы для датчиков (подключенными к ней через радио канал) и некой SD карты (eeprom Uno). Eeprom хранит номера телефонов пользователей и список датчиков, которые необходимо выводить на WEB сервере. Вопрос - как лучше выводить информацию без "затупов" со стороны Serial. Что я имею ввиду - Когда я перехожу на страницу /phoneSettings - ESP отправляет запрос на Uno, для того, чтобы она залезла в EEPROM и прочитала заветные номера телефонов и отправила их назад для отображения в WEB интерфейсе, но на это уходит достаточно много времени и сидеть - ждать, пока ESP получит ответ от Uno и подгрузит сайт с данными - долго и иногда вообще не получается, не говоря уже о том, что в будущем мне надо будет выводить список датчиков, которых может быть достаточно много и формирование ответа на запрос может занять большое кол-во времени. Код прикладываю ниже. P.s не пугайтесь длинны кода базы - там еще есть общение по радио каналу и с модулем sim800l. Заранее извиняюсь за такой огрызок, но вдруг некоторые люди будут грешить на методы написания и взятия с EEPROM.
 

Скетч базы

// ЭТО СКЕТЧ ПРИЁМНИКА (БАЗА)!!!
//--------------------- НАСТРОЙКИ ----------------------
#define CH_NUM 0x60   // номер канала, должен совпадать с передатчиком (датчик)

// УРОВЕНЬ МОЩНОСТИ ПЕРЕДАТЧИКА
#define SIG_POWER RF24_PA_MAX

// СКОРОСТЬ ОБМЕНА ДАННЫМИ
// должна быть одинакова на приёмнике и передатчике!
#define SIG_SPEED RF24_1MBPS
//--------------------- НАСТРОЙКИ ----------------------

//--------------------- БИБЛИОТЕКИ ---------------------
#include "nRF24L01.h"            // библиотеки для радио модуля
#include "RF24.h"
RF24 radio(9, 10);              // создать радио модуль на пинах 9 и 10
#include "SoftwareSerial.h"     //библиотека для создания сериал порта на любом пине
SoftwareSerial SIM800(4,5);     //создать сериал порт для прослушки на пинах 2,3
SoftwareSerial WIFI(2,3); //TX желтый RX зеленый
//--------------------- БИБЛИОТЕКИ ---------------------

//--------------------- ПЕРЕМЕННЫЕ ----------------------
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};     //возможные номера труб
byte callbackData[3];                                                           // массив принятых данных (id от кого, type тип датчика, data что передал)
byte Data[4];                                                                   //массив отправляемых данных (id кому , type кому , id новый , type новый)
byte pipeNo;                                                                    //Байтовая переменная хранения номера трубы для отправки
struct Sensor {                                                                 //Переменная типа struct для хранения данных о датчике
  byte id;
  byte type;
  byte data;
};
Sensor cashDataToSend;                                                          // кешевая переменная для отправки данных
String _response = "";                                                          // Переменная для хранения ответа модуля sim800L
String data;
String additionalInfo;
String command;
//--------------------- ПЕРЕМЕННЫЕ ----------------------

void setup() {
  WIFI.begin(9600);
  Serial.begin(9600);    //открываем порт для связи с ПК
  radioSetup();          //ф-я настройки радио модуля
  simSetup();            //ф-я настройки модуля sim800L
  WIFI.listen();

//  sendSMS("+79520534351","Hi");

//  writePhoneNumber(1,"+79520534351");
  
//  for(int i =0; i<50; i++){
////    writeNewSensorSettings(0,1,mySensor);
////    clearSensorById(i);
////    delay(200);
//   Serial.print("Info "); Serial.println(eeprom_read_byte(i));
//   delay(5);
//  }
//
//  deletePhoneNumber(1);
//  delay(100);
//  Serial.println(getPhoneNumber(1));

//    writePhoneNumber(1,"+79520534351");

}


void loop() {
  
 if(radio.available()){
  Serial.println("Что-то пришло ,читаю");
  radio.read(&callbackData, sizeof(callbackData));
 if(callbackData[0]==0 && callbackData[1]!= 0){
    registerNewSensor();
 }else if (callbackData[2]!=0){
  Serial.println("Аларм");
  makeCall("+79520534351");
  }   
}

 if(WIFI.available()){
  Serial.println("Есть инфа с wifi");
  data = WIFI.readString();
  Serial.println(data);
  if(data.substring(data.indexOf(' ')+1)!=""){
    additionalInfo = data.substring(data.indexOf(' ')+1,data.length());
    }
  data.remove(data.indexOf(' '));
  command = data; 
  if(command == "addMainPhoneNumber"){
    Serial.println("Команда на добавление главного номера телефона");
    writePhoneNumber(1,additionalInfo);
    }
    
  if(command == "deleteMainPhoneNumber"){
    Serial.println("Команда на удаление главного номера телефона");
    deletePhoneNumber(1);
    }

    if(command == "deleteAdditionalPhoneNumber"){
    Serial.println("Команда на удаление второго номера телефона");
    deletePhoneNumber(2);
    }
    
  if(command == "getTelephone"){
  String s;
  s= s + getPhoneNumber(1);
  s = s + " ";
  s = s + getPhoneNumber(2);
  WIFI.print(s);
  }
    
 }


}

void radioSetup() {                        // настройка радио модуля
  radio.begin();                           // активировать модуль
  radio.setAutoAck(1);                     // режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);                 // (время между попыткой достучаться, число попыток)
  radio.setPayloadSize(32);                // размер пакета, байт
  radio.openReadingPipe(1, address[0]);    // хотим слушать трубу 0
  radio.openWritingPipe(address[1]);       // хотим писать на трубу по первому адресу
  radio.setChannel(CH_NUM);                // выбираем канал
  radio.setPALevel(SIG_POWER);             // задаем уровень мощности передатчика
  radio.setDataRate(SIG_SPEED);            // задаем скорость обмена
                                           // должна быть одинакова на приёмнике и передатчике!
                                           // при самой низкой скорости имеем самую высокую чувствительность и дальность!! (логично)
  radio.powerUp();                         // начать работу
  radio.startListening();                  // начинаем слушать эфир, мы приёмный модуль
} 

void simSetup(){
  SIM800.begin(9600);                      //Скорость порта для связи Arduino с GSM модемом    
  delay(100);
  sendATCommand("AT", true);               //Настраиваем Sim модуль для общения (скорость)
  sendATCommand("AT+CMGF=1", true);        //Включаем функцию отправки сообщений
  }

void makeCall(String phone)                      //ф-я звонка
{
  SIM800.listen();
  sendATCommand("ATD"+phone+";", false);
  WIFI.listen();
}  

void sendSMS(String phone, String message)                      //ф-я отправки sms 
{
  SIM800.listen();
  sendATCommand("AT+CMGS=\"" + phone + "\"", true);             // Переходим в режим ввода текстового сообщения
  sendATCommand(message + "\r\n" + (String)((char)26), true);   // После текста отправляем перенос строки и Ctrl+Z
  WIFI.listen();
}

void registerNewSensor(){
    Serial.println("Новенький");
    radio.stopListening();
    Serial.println("Перестал читать");
    writeNewSensorSettings(callbackData[1],callbackData[2],cashDataToSend);
    Data[0]= callbackData[0];
    Data[1]= callbackData[1];
    Data[2]= cashDataToSend.id;
    Data[3]= cashDataToSend.type;
    Serial.print("Новый id"); Serial.println(Data[2]);
    Serial.print("Новый type"); Serial.println( Data[3]);
    if (waitRadioResponse()){
          Serial.println("Отправил, удачная регистрация");  
          radio.startListening();
          Serial.println("Начинаю слушать");
      }else{
          clearSensorById(Data[2]);
          Serial.println("Нет ответа, освободил id");  
          radio.startListening();
          Serial.println("Начинаю слушать");
        }
  }

bool waitRadioResponse(){
  bool _resp=false;
  long _timeout = millis() + 2000;                                             // Переменная для отслеживания таймаута (10 секунд)
  while (!_resp &&  millis() < _timeout)  {
    _resp = radio.write(Data, sizeof(Data));
    };                                                                         // Ждем ответа или выжидаем таймаут в 2 секунды
  if (_resp) {                                                     // Если есть, что считывать...
    return true;                                                               // ... считываем и запоминаем
  }
  else {                                                                       // Если пришел таймаут, то...
    return false;                                                              // ... оповещаем об этом и...
  }  
}

bool isItFreeCell(int num) {                    //ф-я проверки клетки eeprom на пустоту
  Serial.print("isItFreeCell() <-"); Serial.println(num) ;
  byte cash = eeprom_read_byte((uint8_t*)num);
  Serial.print("Что находится в ячейке num"); Serial.println(cash) ;
  delay(15);
  Serial.print(cash); Serial.print(" = "); Serial.print(cash); Serial.println(" ?") ;
  if (cash == 255) {
    Serial.println(" Да") ;
    return true;
  }
  else {
    Serial.println(" Нет") ;
    return false;
  }
}

void clearSensorById(int id) {                  //ф-я очистки клеток памяти eeprom от сенсора по его id
  for (int i = 10; i < 1000; i= i + 3) 
  {
    if (eeprom_read_byte((uint8_t*)i) == id) 
    {
      delay(10);
      eeprom_write_byte((byte*)i, 255);
      delay(10);
      eeprom_write_byte((byte*)i + 1, 255);
      delay(10);
      eeprom_write_byte((byte*)i + 2, 255);
      delay(10);
      break;
    }
  }
}

void writeNewSensorSettings(byte type, byte data, Sensor& CallbackData) { //ф-я записи нового датчика в память eeprom (дывается id)
  Sensor mySensor;
  mySensor.type = type;
  mySensor.data = data;
  for (int i = 10; i < 1000; i = i + 3) {
    Serial.print("i= "); Serial.println(i) ;
    if (isItFreeCell(i) == true) {
      delay(500);
      if (i==10){
         mySensor.id=1;
        }else {
         mySensor.id = eeprom_read_byte((uint8_t*)i-3)+1;           //Чтение из eeprom 
          }
      Serial.print("Старый id = "); Serial.println(mySensor.id);
        Serial.print("Новый id = "); Serial.println(eeprom_read_byte((uint8_t*)i-3)) ;
      eeprom_write_block((void*)&mySensor, (int*)i, sizeof(mySensor));
      eeprom_read_block((void*)&CallbackData, (int*)i, sizeof(CallbackData)); 
      break;
    }
  }
}

void readSensorSettingsById(int id,Sensor& callbackData){         //ф-я вывода данных о сенсое по id
    for (int i =10;i<1000;i= i+3){
       if (eeprom_read_byte((uint8_t*)i) == id) {
        eeprom_read_block((void*)&callbackData, (int*)i, sizeof(callbackData));
      }
    }
  }
  
void writePhoneNumber(int phoneType, String Phone){      //ф-я записи номеров телефона long поскольку int(16 бит) -32768 до 32767 и по этим причинам не подходит для номера телефона. phoneType - Главный номер =1, дополнительный номер телефона =2; phomeNumber должен быть вида +79.........
    Phone = Phone.substring(3);
    long phomeNumber = Phone.toInt();
    if(phoneType == 1){
      int n=0;
      for(int i=5;i>0;i--){
      delay(50);
      eeprom_write_byte(n, phomeNumber%100);
      delay(50);
      n++;
      phomeNumber/=100;
    }
      }else{
          int n=0;
          for(int i=5;i>0;i--){
            delay(50);
            eeprom_write_byte(n+5, phomeNumber%100);
            delay(50);
            n++;
            phomeNumber/=100;
            }
        }
  }

void deletePhoneNumber(int phoneType){      //ф-я удаления номеров телефона  phoneType - Главный номер =1, дополнительный номер телефона =2;
  if(phoneType == 1){
    for(int i=0;i<5;i++){
      delay(10);
      eeprom_write_byte(i, 0);
      delay(10);
      }
    }else {
        for(int i=5;i<10;i++){
          delay(10);
          eeprom_write_byte(i, 0);
          delay(10);
        }
      }
  }

String getPhoneNumber(int phoneType){      //ф-я получения основонго номеров телефона phoneType - Главный номер =1, дополнительный номер телефона =2;
  long readPhoneNumber=0;
  String phoneNumber;
  long mnozhitel=1;
  if(phoneType == 1){
    for(int i=0;i<5;i++){
      readPhoneNumber = mnozhitel * eeprom_read_byte(i)   + readPhoneNumber ;
      mnozhitel *= 100;
    }
    }else{
          for(int i=5;i<10;i++){
            readPhoneNumber = mnozhitel * eeprom_read_byte(i)   + readPhoneNumber ;
            mnozhitel *= 100;
          }   
      }
          if(readPhoneNumber < 1){
            phoneNumber = "";
            }
          else if(readPhoneNumber < 9999999){
            phoneNumber = "+7900";
            }else if (readPhoneNumber < 99999999){
              phoneNumber = "+790";
              }else{
                phoneNumber = "+79";
                }
          phoneNumber += readPhoneNumber; 
          return phoneNumber;
  }
  

  
String waitResponse() {                                           // Функция ожидания ответа и возврата полученного результата
  String _resp = "";                                              // Переменная для хранения результата
  long _timeout = millis() + 10000;                               // Переменная для отслеживания таймаута (10 секунд)
  while (!SIM800.available() &&  millis() < _timeout)  {};        // Ждем ответа или выжидаем таймаут в 10 секунд
  if (SIM800.available()) {                                       // Если есть, что считывать...
    _resp = SIM800.readString();                                  // ... считываем и запоминаем
  }
  else {                                                          // Если пришел таймаут, то...
    Serial.println("Timeout...");                                 // ... оповещаем об этом и...
  }
  return _resp;                                                   // ... возвращаем результат. Пусто, если проблема
}

String sendATCommand(String cmd, bool waiting) {
  String _resp = "";                            // Переменная для хранения результата
  Serial.println(cmd);                          // Дублируем команду в монитор порта
  SIM800.println(cmd);                          // Отправляем команду модулю
  if (waiting) {                                // Если необходимо дождаться ответа...
    _resp = waitResponse();                     // ... ждем, когда будет передан ответ
    if (_resp.startsWith(cmd)) {  // Убираем из ответа дублирующуюся команду
      _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
    }
    Serial.println(_resp);                      // Дублируем ответ в монитор порта
  }
  return _resp;                                 // Возвращаем результат. Пусто, если проблема
}

Скетч EPS8266

#import "index.h"
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
 
/* Put your SSID & Password */
const char* ssid = "MyArduino";  // Enter SSID here

 
ESP8266WebServer server(80);
 
void setup() {
  Serial.begin(9600);
  delay(100);
 
  Serial.println("Connecting to ");

 

  WiFi.softAP(ssid);
 

//  Serial.print("Got IP: ");  Serial.println(WiFi.localIP());
 
  server.begin();
  Serial.println("HTTP server started");

  server.on("/", handleRoot);
  server.on("/phoneSettings", handlePhone);
  server.on("/deleteMainPhone", deleteMainPhone);
  server.on("/deleteAdditionalPhone", deleteAdditionalPhone);
//  server.on("/mainPhoneNumber", !!!!);
//  server.on("/additionalPhoneNumber", !!!!!!);
}
void loop() {
  server.handleClient();
}

void handleRoot() {
  String s = MAIN_page;
  server.send(200, "text/html", s);
}

void handlePhone(){
  String s = PHONE_page;
  String data;
  Serial.print("getTelephone");
  long _timeout = millis() + 4000; 
  while(Serial.available() && millis() < _timeout){
    data = Serial.readString();
    } 
    if (data != 0){
     String additionalPhone = data.substring(data.indexOf(' ')+1,data.length());
     data.remove(data.indexOf(' '));
     String mainPhone = data;
     s.replace("@@P1@@", mainPhone);
     s.replace("@@P2@@", additionalPhone);
     server.send(200, "text/html", s);   
      } 
      else {
        server.send(200, "text/plain", "Oops, an error, please, refresh the page");   
        }
  }

 void deleteMainPhone(){
  Serial.print("deleteMainPhoneNumber");
  long _timeout = millis() + 4000; 
  while(millis() < _timeout){} 
  handlePhone();
  }

 void deleteAdditionalPhone(){
  Serial.print("deleteAdditionalPhoneNumber");
  long _timeout = millis() + 4000; 
  while(millis() < _timeout){} 
  handlePhone();
  }

 

iconini13ya
Offline
Зарегистрирован: 04.04.2021

Ах, да, кто меня помнит (вдруг) по раньше созданным темам - устройство подсобралось и выглядит уже вот так :D 

sadman41
Offline
Зарегистрирован: 19.10.2016

В ESP тоже есть EEPROM...

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
В ESP тоже есть EEPROM...

Согласен, но памяти там по сравнению с Uno - маловато. Да и костыль в виде - появился новый датчик - пришел на Uno, зарегался, получил id. Uno -отправлю ка я данны о датчике по serial к esp8266, чтобы она запихнула их в сой EEPROM - костыль - костылем. + У меня самая остойная версия ESP - еле-еле душа в теле на скетч места хватает, не говоря уже о запоминании телефонных номеров и кучи дачтиков с полями id type data 

iconini13ya
Offline
Зарегистрирован: 04.04.2021

Возможно есть еще какой-то способ крое запоминание данных в EEPROM ESP8266 ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Скомпилируй без использования SPIFF, подключи I2C eeprom... Да и странно, конечно, что в ESP не нашлось завалящего килобайта спейса и она была уной бита.

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
Скомпилируй без использования SPIFF, подключи I2C eeprom... Да и странно, конечно, что в ESP не нашлось завалящего килобайта спейса и она была уной бита.

А если подтереть SPIFF куда можно будет положить сам веб интерфейс? (Html файл)

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
Скомпилируй без использования SPIFF, подключи I2C eeprom... Да и странно, конечно, что в ESP не нашлось завалящего килобайта спейса и она была уной бита.

Возможно вы и правы. Сейчас я выделяю 2 Мегабайта для скетчей и 1 Мбайт для SPIFFS. Возможно все и поместится. Как думаете - лучше переделать систему ? И - как думаете - чтение из EEPROM и передача на веб интерфейс будет намного быстрее чем запрос на уно, чтение из EEPROM и передача обратно через Serial ? 

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
Скомпилируй без использования SPIFF, подключи I2C eeprom... Да и странно, конечно, что в ESP не нашлось завалящего килобайта спейса и она была уной бита.

И еще вопрос - я не использую FTP сервер и соответственно не пихаю на ESP лишние файлы (HTML) документ я использую в формате просто кода (есть переменная, в которой написан HTML код) Я беру эту переменную у index.h и использую для отображения (знаю, геморрой и костыль, но - как-то так). Соответсвтенно я думаю (подозреваю) что вообще не использую SPIFFS

sadman41
Offline
Зарегистрирован: 19.10.2016

Я в RAW-переменную кладу и отдаю как обычный char[]
При этом в SPIFFS не пропадает незанятое место.

В экзампле s1 смотри: https://en.cppreference.com/w/cpp/language/string_literal

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
Я в RAW-переменную кладу и отдаю как обычный char[] При этом в SPIFFS не пропадает незанятое место. В экзампле s1 смотри: https://en.cppreference.com/w/cpp/language/string_literal

Примерно так ? 

iconini13ya
Offline
Зарегистрирован: 04.04.2021

Я беру вот эту супер здоровую переменную и вставляю просто ее на сайт (А там чисто целый здоровый HTML + CSS + JS код)

38 void handleRoot() {
39   String s = MAIN_page;
40   server.send(200, "text/html", s);
41 }

 

sadman41
Offline
Зарегистрирован: 19.10.2016

iconini13ya пишет:

И - как думаете - чтение из EEPROM и передача на веб интерфейс будет намного быстрее чем запрос на уно, чтение из EEPROM и передача обратно через Serial ? 


С вебом меньше геморроя будет, полагаю по скорости, может и незаметно на таких объёмах. Хотя, если через всякие блокирующие parseInt работаете, то потенциально ускорение может произойти.

sadman41
Offline
Зарегистрирован: 19.10.2016

iconini13ya пишет:

Я беру вот эту супер здоровую переменную и вставляю просто ее на сайт (А там чисто целый здоровый HTML + CSS + JS код)


Через String гнать необязательно, вроде. Я просто скармливаю char* вебсерверу. Неохота ноут открывать просто чтобы глянуть. Но Стринги я точно не использую. CSS отдельно отдаю, HTML с жабаскриптом кучкой.

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
iconini13ya пишет:

И - как думаете - чтение из EEPROM и передача на веб интерфейс будет намного быстрее чем запрос на уно, чтение из EEPROM и передача обратно через Serial ? 

С вебом меньше геморроя будет, полагаю по скорости, может и незаметно на таких объёмах. Хотя, если через всякие блокирующие parseInt работаете, то потенциально ускорение может произойти.

Нет, не работаю через parseInt. Все просто - когда перехожу по ссылке - есп кидает запрос, уно по названию запроса узнает что делать и собирает ответ из eeprom и кидает его обратно. 

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
iconini13ya пишет:

Я беру вот эту супер здоровую переменную и вставляю просто ее на сайт (А там чисто целый здоровый HTML + CSS + JS код)

Через String гнать необязательно, вроде. Я просто скармливаю char* вебсерверу. Неохота ноут открывать просто чтобы глянуть. Но Стринги я точно не использую. CSS отдельно отдаю, HTML с жабаскриптом кучкой.

Ну, я просто сваливаю в 1 файл и кидаю сразу одну большую переменную

sadman41
Offline
Зарегистрирован: 19.10.2016

Примерно вот так всё происходит:

const char textWebPageReboot[] = R"~~~~( 
<!DOCTYPE html>
<html>
<head>
<title>AccessPad BLE reboot</title>
<meta http-equiv="refresh" content="500000;URL=/">
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
</head>
<body>
<h1>Systew was rebooted in 5 sec</h1>
</body>
</html>
)~~~~";

...
static void handleWebConfigReboot() {
  WebConfigurator.send(200, "text/html", textWebPageReboot);
  delay(500);
  // Shutdown AP, turn off WiFi module
  WiFi.softAPdisconnect(true);
  ESP.restart();
}

....
  WebConfigurator.on("/reboot", handleWebConfigReboot);
....

 

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
Примерно вот так всё происходит:

const char textWebPageReboot[] = R"~~~~( 
<!DOCTYPE html>
<html>
<head>
<title>AccessPad BLE reboot</title>
<meta http-equiv="refresh" content="500000;URL=/">
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
</head>
<body>
<h1>Systew was rebooted in 5 sec</h1>
</body>
</html>
)~~~~";


...
static void handleWebConfigReboot() {
  WebConfigurator.send(200, "text/html", textWebPageReboot);
  delay(500);
  // Shutdown AP, turn off WiFi module
  WiFi.softAPdisconnect(true);
  ESP.restart();
}

....
  WebConfigurator.on("/reboot", handleWebConfigReboot);
....

 

Понял, спасибо 

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
Примерно вот так всё происходит:

const char textWebPageReboot[] = R"~~~~( 
<!DOCTYPE html>
<html>
<head>
<title>AccessPad BLE reboot</title>
<meta http-equiv="refresh" content="500000;URL=/">
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
</head>
<body>
<h1>Systew was rebooted in 5 sec</h1>
</body>
</html>
)~~~~";

...
static void handleWebConfigReboot() {
  WebConfigurator.send(200, "text/html", textWebPageReboot);
  delay(500);
  // Shutdown AP, turn off WiFi module
  WiFi.softAPdisconnect(true);
  ESP.restart();
}

....
  WebConfigurator.on("/reboot", handleWebConfigReboot);
....

 

И еще 1 вопросик - не хчоу создавать новую тему - как передать массив через Serial port? У меня в EEPROM, как я раньше описывал есть датчики (их id и type) . Выглядит это все примерно так 
1 -id
1 - type
2 -id
1 - type
3 - id 
4-type  
Итд. Вопрос - каак собрать это все в массив и пихнуть через сериал на ESP8266?

sadman41
Offline
Зарегистрирован: 19.10.2016

Тут вопрос больше в квалификации, а не способе. Я бы в бинарном пакете гнал. Но здесь много собак съесть надо, прежде чем жонглировать байтами начать.

Наверное Вам проще в plain text строке с разделителями гнать: префикс пакета - Id 1- type1 - ... - постфикс пакета. Передающая сторона просто print() делает. На принимающей
по префиксу начинаете разбор данных , по постфиксу заканчивает. Или после префикса количество пар данных передать и потом на него ориентироваться при приёме. Способов много.

b707
Offline
Зарегистрирован: 26.05.2017

iconini13ya пишет:

sadman41 пишет:
В ESP тоже есть EEPROM...

Согласен, но памяти там по сравнению с Uno - маловато.

Хммм ... неужели меньше 1к ?

iconini13ya
Offline
Зарегистрирован: 04.04.2021

b707 пишет:

iconini13ya пишет:

sadman41 пишет:
В ESP тоже есть EEPROM...

Согласен, но памяти там по сравнению с Uno - маловато.

Хммм ... неужели меньше 1к ?

Я если честно не знаю сколько там. Вроде когда лью -указываю 4МБ, пропускает 

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
Тут вопрос больше в квалификации, а не способе. Я бы в бинарном пакете гнал. Но здесь много собак съесть надо, прежде чем жонглировать байтами начать. Наверное Вам проще в plain text строке с разделителями гнать: префикс пакета - Id 1- type1 - ... - постфикс пакета. Передающая сторона просто print() делает. На принимающей по префиксу начинаете разбор данных , по постфиксу заканчивает. Или после префикса количество пар данных передать и потом на него ориентироваться при приёме. Способов много.

Не могли бы накидать код ? Я просто не совсем понял как именно передавать. Правильно ли я понял - Берем первый id и ставим его в конец - и пока читающая сторона не встретит этот "первый пакет" - она не прекращает читать ?

b707
Offline
Зарегистрирован: 26.05.2017

iconini13ya пишет:

Я если честно не знаю сколько там. Вроде когда лью -указываю 4МБ, пропускает 

просто вы пишете, что там "маловато по сравнению с Уно". У Уно 1 килобайт. А на ЕСП 4 МЕГАбайта. 

Вероятно я забыл что значит "маловато"...

 

Если вернутся к теме ветки - Садман вам намекал, что Уно тут вовсе не нужна, со своим ЕЕПРОМ в 1К. Все можно сделать на ЕСП. И не надо будет никакие массивы гонять по Сериал

sadman41
Offline
Зарегистрирован: 19.10.2016

iconini13ya пишет:

Не могли бы накидать код ? Я просто не совсем понял как именно передавать. Правильно ли я понял - Берем первый id и ставим его в конец - и пока читающая сторона не встретит этот "первый пакет" - она не прекращает читать ?


Накидывать мне не особо интересно, так как без отладки я не отдаю исходники, а для отладки всю эту хрень коммутировать мне лень.

Суть простая - передающая сторона просто накидывает через print префикс, разделитель, айди, разделитель, тип, разделитель... постфикс.
Принимающая ловит префикс, понимает, что дальше пойдут данные. После разделителя складывает символы в буфер. Поймала разделитель - в буфере получила ID. Сделала с им что-нить, читает дальше до разделителя. Поймала - в буфере тип. И т.д.

Но, если это просто для вывода на страницу, то Uno может гнать прямо фрагмент HTML, не так ли? ESP остаётся его принять и метнуть в браузер.

iconini13ya
Offline
Зарегистрирован: 04.04.2021

b707 пишет:

iconini13ya пишет:

Я если честно не знаю сколько там. Вроде когда лью -указываю 4МБ, пропускает 

просто вы пишете, что там "маловато по сравнению с Уно". У Уно 1 килобайт. А на ЕСП 4 МЕГАбайта. 

Вероятно я забыл что значит "маловато"...

 

Если вернутся к теме ветки - Садман вам намекал, что Уно тут вовсе не нужна, со своим ЕЕПРОМ в 1К. Все можно сделать на ЕСП. И не надо будет никакие массивы гонять по Сериал

Дело в том, что подключение датчиков происходит по радио каналу. Я не слышал чтобы ESP8266 умела в радио

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
iconini13ya пишет:

Не могли бы накидать код ? Я просто не совсем понял как именно передавать. Правильно ли я понял - Берем первый id и ставим его в конец - и пока читающая сторона не встретит этот "первый пакет" - она не прекращает читать ?

Накидывать мне не особо интересно, так как без отладки я не отдаю исходники, а для отладки всю эту хрень коммутировать мне лень. Суть простая - передающая сторона просто накидывает через print префикс, разделитель, айди, разделитель, тип, разделитель... постфикс. Принимающая ловит префикс, понимает, что дальше пойдут данные. После разделителя складывает символы в буфер. Поймала разделитель - в буфере получила ID. Сделала с им что-нить, читает дальше до разделителя. Поймала - в буфере тип. И т.д. Но, если это просто для вывода на страницу, то Uno может гнать прямо фрагмент HTML, не так ли? ESP остаётся его принять и метнуть в браузер.

Неплохо, я даже об этом не думал, спасибо

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

iconini13ya пишет:

Дело в том, что подключение датчиков происходит по радио каналу. Я не слышал чтобы ESP8266 умела в радио

Вот с этого момента меня прям сильно ваша беседа увлекла. Про какое такое "радио" вы говорите, которое умеет ардуина а ESP никак?

iconini13ya
Offline
Зарегистрирован: 04.04.2021

Rumata пишет:

iconini13ya пишет:

Дело в том, что подключение датчиков происходит по радио каналу. Я не слышал чтобы ESP8266 умела в радио

Вот с этого момента меня прям сильно ваша беседа увлекла. Про какое такое "радио" вы говорите, которое умеет ардуина а ESP никак?

Nrf24l01 и ESP8266. Я честно не знаю - но вроде ESP не умеет "болтать" с NRF

sadman41
Offline
Зарегистрирован: 19.10.2016

Просто надо взять ESP с количеством ног побольше, думаю.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

iconini13ya пишет:

Nrf24l01 и ESP8266. Я честно не знаю - но вроде ESP не умеет "болтать" с NRF

Esp разучился spi? 

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
Просто надо взять ESP с количеством ног побольше, думаю.

Возможно, я знаю что ESP вроде как в общем (с большим кол-вом ног) умеет в радио, но у меня не такая ( А мне нужно срочно т.к диплом :D

iconini13ya
Offline
Зарегистрирован: 04.04.2021

Rumata пишет:

iconini13ya пишет:

Nrf24l01 и ESP8266. Я честно не знаю - но вроде ESP не умеет "болтать" с NRF

Esp разучился spi? 

У меня "кастратик", посмотрите первое фото. Там ножек - только для реализации веб на сколько я понимаю. А именно - 1 ножка)

sadman41
Offline
Зарегистрирован: 19.10.2016

В мире не только Aliexpress ESP продаёт. В каком городе живёте?

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
В мире не только Aliexpress ESP продаёт. В каком городе живёте?

В Москве, но реализовывать "многоногую ESP" -  перековыривая готовый проект на 90% - не очень хочется ) 

sadman41
Offline
Зарегистрирован: 19.10.2016

Пока нет опыта - несколько раз будете не на 90%, а на все 146% перековыривать. Таков путь.

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
Пока нет опыта - несколько раз будете не на 90%, а на все 146% перековыривать. Таков путь.

Надеюсь такого не будет ) До сдачи проекта остался месяц :D

b707
Offline
Зарегистрирован: 26.05.2017

iconini13ya пишет:

Я не слышал чтобы ESP8266 умела в радио

А Уно умеет радио? Сама? Или через НРФ24?

ЕСП  точно так же как уно - подключаешь NRF24 и работаешь

iconini13ya
Offline
Зарегистрирован: 04.04.2021

sadman41 пишет:
Пока нет опыта - несколько раз будете не на 90%, а на все 146% перековыривать. Таков путь.

Я с вами полностью согласен, что было бы проще и лучше использовать сразу ESP8266 многоногую. Чтобы сразу с распаяным wifi и не тыкать себе в голову массивами через сериал ) Ну, на будущее буду знать ) 

iconini13ya
Offline
Зарегистрирован: 04.04.2021

b707 пишет:

iconini13ya пишет:

Я не слышал чтобы ESP8266 умела в радио

А Уно умеет радио? Сама? Или через НРФ24?

ЕСП  точно так же как уно - подключаешь NRF24 и работаешь

Прошу заметить - что я писал выше. У меня - кастратик одноногий, на котором реализовывается только web сервер. То, что вы пишете и ежу понятно ) Возможно я не так выразился 

b707
Offline
Зарегистрирован: 26.05.2017

iconini13ya пишет:

Надеюсь такого не будет ) До сдачи проекта остался месяц :D

будет-будет.

пока в этой ветке вы, простите, сплошную пургу несете... Так что я бы на скорую сдачу диплома не рассчитывал...

iconini13ya
Offline
Зарегистрирован: 04.04.2021

b707 пишет:

iconini13ya пишет:

Я не слышал чтобы ESP8266 умела в радио

А Уно умеет радио? Сама? Или через НРФ24?

ЕСП  точно так же как уно - подключаешь NRF24 и работаешь

Хотя, я смотрел что вроде бы как (не утверждаю) - ESP умеет даже в радио - если распаяны соответствующие ноги. 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

iconini13ya пишет:

sadman41 пишет:
В мире не только Aliexpress ESP продаёт. В каком городе живёте?

В Москве, но реализовывать "многоногую ESP" -  перековыривая готовый проект на 90% - не очень хочется ) 

Ооочень странная мотивация. Замените контроллер на полноценный и получИте ту-же самую ножку, плюс еще десяток. 8266 стоит около 220 рублей, есп32 стоит около 300. Не понимаю...

iconini13ya
Offline
Зарегистрирован: 04.04.2021

b707 пишет:

iconini13ya пишет:

Надеюсь такого не будет ) До сдачи проекта остался месяц :D

будет-будет.

пока в этой ветке вы, простите, сплошную пургу несете... Так что я бы на скорую сдачу диплома не рассчитывал...

Да тут осталось реализовать только проброс датчиков и все . Все остальное уже работает - оповещение по звонкам + автоподключение датчиков итд. Осталось только вопрос с web интерфейсом решить. 

b707
Offline
Зарегистрирован: 26.05.2017

iconini13ya пишет:

Я с вами полностью согласен, что было бы проще и лучше использовать сразу ESP8266 многоногую. Чтобы сразу с распаяным wifi и не тыкать себе в голову массивами через сериал ) Ну, на будущее буду знать ) 

а зачем проект переделывать при смене маленькой ЕСП на "многоногую"? Разве в коде что-то изменится?

Или вы вообще по нулям в этом... ?

b707
Offline
Зарегистрирован: 26.05.2017

iconini13ya пишет:

Хотя, я смотрел что вроде бы как (не утверждаю) - ESP умеет даже в радио - если распаяны соответствующие ноги. 

сам - не умеет.

 

iconini13ya
Offline
Зарегистрирован: 04.04.2021

Rumata пишет:

iconini13ya пишет:

sadman41 пишет:
В мире не только Aliexpress ESP продаёт. В каком городе живёте?

В Москве, но реализовывать "многоногую ESP" -  перековыривая готовый проект на 90% - не очень хочется ) 

Ооочень странная мотивация. Замените контроллер на полноценный и получИте ту-же самую ножку, плюс еще десяток. 8266 стоит около 220 рублей, есп32 стоит около 300. Не понимаю...

Тут дело в сроках. Я понимаю, что так лучше ) Но я уже все распаял и сделал ) вот - решил спросить совета, мне его дали ) А так - да, согласен с вами что эффективнее было бы использовать esp32, но сроки горят )

iconini13ya
Offline
Зарегистрирован: 04.04.2021

b707 пишет:

iconini13ya пишет:

Я с вами полностью согласен, что было бы проще и лучше использовать сразу ESP8266 многоногую. Чтобы сразу с распаяным wifi и не тыкать себе в голову массивами через сериал ) Ну, на будущее буду знать ) 

а зачем проект переделывать при смене маленькой ЕСП на "многоногую"? Разве в коде что-то изменится?

Или вы вообще по нулям в этом... ?

изменится то, что надо будет паяться , плату делать самому (тут то я использовал макетку которая к uno подходит) + еще пробрасывать код. + еще если честно я раньше с esp32 не работал и честно - не знаю какие проблемы могут возникнуть, так что - нет желания и времени. Проще уже допилить тут и сдать ) 

b707
Offline
Зарегистрирован: 26.05.2017

iconini13ya пишет:

Тут дело в сроках. Я понимаю, что так лучше ) Но я уже все распаял и сделал ) вот - решил спросить совета, мне его дали ) А так - да, согласен с вами что эффективнее было бы использовать esp32, но сроки горят )

пока поймете, что мы правы - времени останется еще меньше.

iconini13ya
Offline
Зарегистрирован: 04.04.2021

b707 пишет:

iconini13ya пишет:

Я с вами полностью согласен, что было бы проще и лучше использовать сразу ESP8266 многоногую. Чтобы сразу с распаяным wifi и не тыкать себе в голову массивами через сериал ) Ну, на будущее буду знать ) 

а зачем проект переделывать при смене маленькой ЕСП на "многоногую"? Разве в коде что-то изменится?

Или вы вообще по нулям в этом... ?

Главное - опыт получен, выводы сделаны ) В следующий раз буду оценивать риски и прикидывать функционал сразу, я в реализации еще плох как вы понимаете, о esp32 даже ни слуху ни духу. 

b707
Offline
Зарегистрирован: 26.05.2017

iconini13ya пишет:

еще если честно я раньше с esp32 не работал и честно - не знаю какие проблемы могут возникнуть

не надо вам есп32, он и правда другой. возьмите ту же самую ЕСП8266, что сейчас у вас - только на плате с многими выводами.

Код вообще переделывать не придется.

А перепаять - ну это смешно, дело одного вечера. С кодом передачи массива по сериал вы встрянете на неделю, думаю