Arduino uno wifi r3+esp8266 - отправка API

Делаю небольшой проект с уведомлением о пропадении напряжения в сети

Плата используется такая:

Датчики информацию считывают, но почему-то не работает отправка запроса на API

Как проверить реагирует ли ESP8266 на команды? В режиме монитора порта смотрю, там нижеприведенный вывод, но я так понимаю что это arduino uno отправляет команды, а результата их выполнения нет.
И еще такой вопрос к знатокам, которые знакомы с данной платой: При каком расположении перемычек будет взаимодействие arduino и esp на борту этой платы?

сейчас пробую в режиме on 1-4; 1-2 тоже пробовал

Мой sketch:

// https://robotchip.ru/izmerenie-peremennogo-napryazheniya-s-pomoshchyu-zmpt101b-i-arduino/ - модуль напряжения
// http://sagis.ru/blog/?p=53 - Плата часов и карта памяти
// https://microkontroller.ru/arduino-projects/logger-dannyh-temperatury-vlazhnosti-na-sd-kartu-i-kompyuter-s-pomoshhyu-arduino/ - логгирование с датчика температуры с использованием даты и времени
// https://robotchip.ru/obzor-chasov-realnogo-vremeni-ds1307/ - плата времени
// https://geekelectronics.org/arduino/dht22-podklyuchenie-k-arduino.html - DHT22 подключение
// https://github.com/Abdurraziq/ZMPT101B-arduino/blob/master/examples/simple_usage/simple_usage.ino - библиотека модуля напряжения

//https://wokwi.com/projects/380351279022927873 - working project
// https://github.com/wizand0/DC_Monitor_UNO

#include "DHT.h"
#include <EEPROM.h>
#include <Wire.h>                           // Подключаем библиотеку Wire                           
#include <TimeLib.h>                        // Подключаем библиотеку TimeLib
#include <DS1307RTC.h>    
#include <ZMPT101B.h>
#define SENSITIVITY 500.0f
#include "EmonLib.h"
//EnergyMonitor emon1;

//API keys https://thingspeak.com/channels/2322125/api_keys
// https://fil-tec.ru/page/arduino-uno-esp8266-wifi-get-thingspeak

String ssid ="MGTS_GPON_923A";
String password="5Y3KX67Q";
String API = "H20C8OAJ7KXGE3SS";   
String HOST = "flask-bot-xabor.amvera.io";
String PORT = "80";
// строки, которые пригодятся для тестирования в мониторе порта
// AT+CWJAP="Keenetic-0138","*********"
// AT+CIPSTART=0,"TCP","api.thingspeak.com",80
// AT+CIPSEND=0,90
// GET /update?api_key=***************&field1=1&field2=1&field3=1&field4=0&field5=0&field6=0
boolean found = false;
boolean sendnook = false;
int valSensor = 1;

String fields;
String curRSSI="";
int crssi=0;



ZMPT101B voltageSensor(A0, 50.0);

#define DHTPIN 4 // Тот самый номер пина, о котором упоминалось выше
// Одна из следующих строк закоментирована. Снимите комментарий, если подключаете датчик DHT11 к arduino
DHT dht(DHTPIN, DHT22); //Инициация датчика
//DHT dht(DHTPIN, DHT11);

void setup() {
  //Serial.begin(9600);
  Serial.begin(115200);
  //Проверка на наличие ошибки по питанию в энергонезависимой памяти

  dht.begin();

  voltageSensor.setSensitivity(SENSITIVITY);
}


void reset() 
{
  sendC("AT+RST", 5, "OK");    
  delay(1000);
}
void connectWifi() 
{

  sendC("AT+CWMODE=3", 100, "OK");
  while(!found) sendC("AT+CWJAP=\"" + ssid + "\",\"" + password + "\"", 4000, "OK");
  
  Serial.println("ATE0"); // не знаю что это, но так работает лучше
}


float supplyVoltage = 0.00;
float t = 0.00;
int h = 0;


void loop() {

  //emon1.calcVI(20,100);
  //supplyVoltage  = emon1.Vrms;
  //Serial.print(emon1.Vrms);
  //Serial.println(supplyVoltage);

  h = dht.readHumidity(); //Измеряем влажность
  t = dht.readTemperature(); //Измеряем температуру
  int supplyVoltage = voltageSensor.getRmsVoltage();
  

  // Комменты ниже убрать после подключения датчиков
//  if (isnan(h) || isnan(t)) {  // Проверка. Если не удается считать показания, выводится «Ошибка считывания», и программа завершает работу
//    Serial.println(supplyVoltage);
//    Serial.println(h);
//    Serial.println(t);
//
//    //Serial.write(t);
//
//    Serial.println("Ошибка считывания");
//    delay(10000);
//    return;
//  }
  //Убирать до сюда


  tmElements_t tm;                          
 
  if (RTC.read(tm)) {
    if (tm.Second % 20 == 0) { //вывод в консоль и отпарвка API каждые 30 секунд
      Serial.print("Time");
      Serial.print("|");
      print2digits(tm.Hour);
      Serial.write(':');
      print2digits(tm.Minute);
      Serial.write(':');
      print2digits(tm.Second);
      Serial.print("|");
      Serial.print("Date");
      Serial.print("|");
      Serial.print(tm.Day);
      Serial.write('.');
      Serial.print(tm.Month);
      Serial.write('.');
      Serial.print(tmYearToCalendar(tm.Year));
      Serial.print("|");
      Serial.print("H:");
      //Serial.print("|");
      Serial.print(h);
      Serial.print("|");
      Serial.print("T:");
      //Serial.print("|");
      Serial.print(t);
      Serial.print("|");
      Serial.print("U:");
      Serial.println(supplyVoltage);
      httppost();
      getRSSI();
    }
    //if (supplyVoltage == 0) { //если условие по времени не выполнено, но напряжение пропало, то отправка в API
    //  httppost();
    //  getRSSI();
    //}
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }


  //httppost();
  //getRSSI();


}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}


void httppost () 
{
  int iserror = 1; // предполагаем что будет ошибка
  found = false; // флаг успешной отправки на шаге итерации
  
  fields = "&field1=" + String(h)+"&field2=" + String(t)+"&field3=" + String(supplyVoltage);
  String data = "GET /update?api_key=" + API + "&" + fields  + "\r\n"; 

  sendC("AT+CIPSTATUS", 2000, "OK");
  

  sendC("AT+CIPMUX=1", 2000, "OK");
  if (found)
  {  
      sendC("AT+CIPSTART=0,\"TCP\",\"" + HOST + "\"," + PORT, 2000, "OK");
      if (found) 
      {

         sendC("AT+CIPSEND=0," + String(data.length()+2), 2000, ">");
         if (found) 
         {
       
            Serial.println(data);
            sendnook = false;
            delay(2000);
          }
         else Serial.println("AT+CIPCLOSE"); 
      }  
  }
  sendC("AT+CIPMUX=0", 100, "OK");

  
  //lastConnectionTime = millis();

}
void getRSSI()
{
  char c1;
  String val = "";
  int i;
  curRSSI = "";
  Serial.print("AT+CWLAP=\"" + ssid + "\"\r\n");
  delay(500);
  if (Serial.available()) 
  {
    while (Serial.available() > 0) 
    {      
       c1 = (char)Serial.read(); val = val + c1; delay(2);
    }  
    int pos = val.indexOf(ssid);
    pos = pos+ssid.length()+3;
    curRSSI = val.substring(pos, pos+2);
    
    Serial.println(curRSSI);
    crssi = curRSSI.toInt();
     
  }  
}
void sendC(String command, int maxTime, char readReplay[])
{
  found = false;  
 
  Serial.println(command);
  delay(maxTime);

}


//void time(long timeNow)
//{
// int days = timeNow / day ;  /
// int hours = (timeNow % day) / hour;  
// int minutes = ((timeNow % day) % hour) / minute ;  
// int seconds = (((timeNow % day) % hour) % minute) / second;
//}

Вывод в мониторе (Где H - влажность; T - температура и U - напряжение:

08:04:45.936 -> Time|08:04:40|Date|5.11.2023|H:44|T:29.00|U:2
08:04:45.936 -> AT+CIPSTATUS
08:04:47.937 -> AT+CIPMUX=1
08:04:49.926 -> AT+CIPMUX=0
08:04:50.018 -> AT+CWLAP="MGTS_GPON_923A"
08:05:05.942 -> Time|08:05:00|Date|5.11.2023|H:43|T:29.00|U:2
08:05:05.942 -> AT+CIPSTATUS
08:05:07.951 -> AT+CIPMUX=1
08:05:09.956 -> AT+CIPMUX=0
08:05:10.048 -> AT+CWLAP="MGTS_GPON_923A"

ничёнепонял в коде но было интересно, кто тебя пробуждать будет, при обрыве питания?
Нечто подобное делал для телеграмм бота, с отработкой по превышению температуры или обрыву питания, питать точку доступа и девайс от UPC
ЗЫ на ESP8266 mini

Пока питания нет arduino запитывается от UPC на двух аккумуляторах. Т.е., по сути, напряжение датчик напряжения замеряет напрямую из розетки, а ардуинка запитывается через UPC.

Но проблема не в этом. Датчики отрабатывают как надо и напряжеине меряют и при его пропадении срабатывает логика, что нужно отправить ошибку по API

Проблема в отправке на API. Может быть нужно какие-нибудь пины замкнуть между esp и arduino?

режим 1, MCU + WIFI обмен между по сериал, на стороне ESP парсим данные и отправляем по WIFI, ИМХО, у меня такой платы не было
а в ESP ты что залил?

В ESP ничего. так понял, что при командах AT esp работает на уровне прошивки. Если бы использовались какие-нибудь библиотеки типа WIFININA, наверно, нужно было бы заливать

То-есть, в ESP имеется прошивка отвечающая на AT команды?
Ну тогда да, режим 1
Включи режим USB + ESP и покидай ему AT команды, отвечает?

Как узнать какая там прошивка?

Включи режим USB + ESP и покидай ему AT команды, отвечает?

А на том столбе, где провода 220 шли и провода интернета были. То есть никакого уведомления не придёт )))

Я это в кому, что для подобных вещей надо GSM-модем использовать.

нет. интернет не пропадает ))))

нет, вообще не реагирует на команды (Отправлял ему AT - должен был ответить “ОК”)

Значит проблема в esp - буду копать как его прошить

на форуме esp8266.ru посмотреть

Использовать ЕСП8266 лишь как модем с АТ-командами под управлением ардуино - как-то несколько странно - это же контроллер куда более мощный чем Уно. Почему не исполнять код прямо на нем, тем более что он поддерживается Ардуино ИДЕ

Заказал отдельный модуль ESP, чтобы сделать все полностью только на нем, тем более что он компактнее. Пока жду, изучаю что есть. Тем более, что esp после прошивки пока понимает часть команд.
Например список сетей показывает, но при команде подключиться к определенной выдает ERROR

я бы смотрел в сторону странички на доступном сайте с записью в базу данных