Все ПРИ возврате команд терпят неудачу

Я пытаюсь отправить данные с датчика на ThingSpeak, но команды AT всегда возвращают сбой. Они иногда работают и посылают данные. Но в большинстве случаев они возвращаются.

Мои Связи:

ESP Arduino
Gnd Gnd
Vcc, ChPD/Ru 3.3 в
Rx 2
Tx 3

Мой код:

#include <SoftwareSerial.h>

#include "DHT.h"

#define DHTPIN 10
#define DHTTYPE DHT11

#define RX 2
#define TX 3

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>

#define SensorPin 0          // аналоговый выход pH-метра подключен к аналогу Arduino

#define ONE_WIRE_BUS 8

LiquidCrystal_I2C lcd(0x27, 16, 2);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DHT dht(DHTPIN, DHTTYPE);
float phValue;

String AP = "Mukadam";       // AP NAME
String PASS = "28oct1997"; // AP PASSWORD
String API = "ZIGGVWBPU0BJ9A0I";   // Write API KEY
String HOST = "api.thingspeak.com";
String PORT = "80";

String f1 = "field1";
String f2 = "field2";
String f3 = "field3";
String f4 = "field4";

int countTrueCommand;
int countTimeCommand; 

boolean found = false; 

int valSensor = 1;

SoftwareSerial esp8266(RX,TX); 

float Celcius=0;
float Fahrenheit=0;

float b;

int buf[10],temp;

unsigned long int avgValue;

void setup() 
{
  lcd.begin();
  lcd.backlight();
  Serial.begin(9600);
  dht.begin();
  pinMode(13,OUTPUT);

  sensors.begin();

  lcd.print("WT:");

  esp8266.begin(115200);

  sendCommand("AT",3,"OK\r\n\r\n");
  sendCommand("AT+CWMODE=1",5,"OK");
  sendCommand("AT+CWJAP=\""+ AP +"\",\""+ PASS +"\"",20,"OK");
}

void loop() 
{
  sensors.requestTemperatures(); 
  Celcius=sensors.getTempCByIndex(0);
  Fahrenheit=sensors.toFahrenheit(Celcius);

  Serial.print("C:");
  Serial.print(Celcius);

  lcd.setCursor(3,0);

  lcd.print(Celcius);

  String getData = "GET /update?api_key="+ API +"&"+ f1 +"="+String(Celcius);

  sendCommand("AT+CIPMUX=1",5,"OK");
  sendCommand("AT+CIPSTART=0,\"TCP\",\""+ HOST +"\","+ PORT,15,"OK");
  sendCommand("AT+CIPSEND=0," +String(getData.length()+4),4,">");

  esp8266.println(getData);

  delay(1500);countTrueCommand++;

  sendCommand("AT+CIPCLOSE=0",5,"OK");

  
  for(int i=0;i<10;i++)       //Get 10 sample value from the sensor for smooth the value
  { 
    buf[i]=analogRead(SensorPin);
    delay(100);
  }

  for(int i=0;i<9;i++)        //sort the analog from small to large
  {
    for(int j=i+1;j<10;j++)
    {
      if(buf[i]>buf[j])
      {
        temp=buf[i];
        buf[i]=buf[j];
        buf[j]=temp;
      }
    }
  }

  avgValue=0;

  for(int i=2;i<8;i++)                      //take the average value of 6 center sample
    avgValue+=buf[i];

  float phValue=(float)avgValue*5.0/1024/6; //convert the analog into millivolt
  phValue=3.5*phValue;                      //convert the millivolt into pH value

  digitalWrite(13, HIGH);       
  delay(1000);
  digitalWrite(13, LOW);

  lcd.setCursor(9,0);
  lcd.print("pH:");
  lcd.setCursor(12,0);
  lcd.print(phValue);


  getData = "GET /update?api_key="+ API +"&"+ f2 +"="+String(phValue);
  sendCommand("AT+CIPMUX=1",5,"OK");
  sendCommand("AT+CIPSTART=0,\"TCP\",\""+ HOST +"\","+ PORT,15,"OK");
  sendCommand("AT+CIPSEND=0," +String(getData.length()+4),4,">");

  esp8266.println(getData);delay(1500);countTrueCommand++;

  sendCommand("AT+CIPCLOSE=0",5,"OK");

  lcd.setCursor(12,0);
  lcd.print(phValue);

  float h = dht.readHumidity();

  lcd.setCursor(0,1);
  lcd.print("H:");
  lcd.setCursor(2,1);
  lcd.print(h);
 
  float t = dht.readTemperature();

  lcd.setCursor(8,1);
  lcd.print("AT:");
  lcd.setCursor(11,1);
  lcd.print(t); 
  lcd.setCursor(12,0);
  lcd.print(phValue);
}


void sendCommand(String command, int maxTime, char readReplay[]) {
  Serial.print(countTrueCommand);
  Serial.print(". at command => ");
  Serial.print(command);
  Serial.print(" ");

  while(countTimeCommand < (maxTime*1))
  {
    esp8266.println(command);//at+cipsend

    if(esp8266.find(readReplay))//ok
    {
      found = true;
      break;
    }
  
    countTimeCommand++;
  }
  
  if(found == true)
  {
    Serial.println("OYI");
    countTrueCommand++;
    countTimeCommand = 0;
  }
  
  if(found == false)
  {
    Serial.println("Fail");

    countTrueCommand = 0;
    countTimeCommand = 0;
  }
  
  found = false;
}

А вот последовательный выход монитора:

, 👍1

Обсуждение

иногда работай "и всегда терпи неудачу" - это противоречивые утверждения ... у вас не может быть и того, и другого .... как происходит сбой команд? .... какие ошибки вы получаете? .... работает ли какая-либо конкретная команда чаще?, @jsotola

Программное обеспечение ненадежно на скорости 115200 бод. используйте 9600 бод. вы также должны изменить скорость передачи данных в прошивке AT, @Juraj

@jsotola всегда терпит неудачу, так как в нем всегда происходит сбой, и иногда работа означает, что всего 1 день или 2 он отправит данные, @Artic Avenger

Я довольно новичок в использовании esp8266, как изменить скорость обновления прошивки?, @Artic Avenger

Это answer (мой) описывает, как изменить скорость передачи данных ESP при включении., @JRobert

напишите и запустите скетч, который отправляет "AT+UART_DEF=9600,8,1,0,0" со скоростью 115200 бод. вам нужно запустить его только один раз. esp запоминает скорость передачи данных в бодах. или вы можете использовать этот https://github.com/jandrassy/WiFiEspAT/blob/master/examples/Tools/ChangeATBaudRate/ChangeATBaudRate.ino, @Juraj

@Juraj Может предоставить мне изменения, которые я должен внести в свой скетч. Как я уже упоминал, я новичок в esp и меня смущают инструкции и учебные пособия в Интернете, @Artic Avenger