Данные, полученные ардуино от модуля ESP8266 01 не являются полными

Я отправляю некоторые данные из модуля ESP8266 01 в Arduino. Но данные, полученные Arduino, не являются полными.

Ниже приведены изображения выходных данных модуля ESP8266 01 и Arduino.

ESP8266 01 output Data received by Arduino

Вот код модуля ESP8266 01:-

#include <ESP8266WiFi.h>
#include<String.h>

char c,e; //хранит байты, поступающие с сервера
int DEBUG = 0;

int co=0;                       //управление отправкой оповещения

const char* ssid     = "ssid";            //ваш SSID WIFI
const char* password = "password";       // пароль Wifi
//--------------------------------------------

const char* host = "api.thingspeak.com";

void setup() {
  //dht.begin();
    Serial.begin(115200);
    delay(10);
  // Мы начинаем с подключения к сети Wi-Fi

    if (DEBUG){
      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
  }

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    if (DEBUG){
      Serial.print(".");
    }
  }

    if (DEBUG){
      Serial.println("");
      Serial.println("WiFi connected");  
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
    }
}

int value = 0;

void loop() {
  delay(1000);
  ++value;

  if (DEBUG){
    Serial.print("connecting to ");
    Serial.println(host);
  }

  // Используйте класс WiFiClient для создания TCP-соединений
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }

  if (DEBUG){
    Serial.print("Requesting URL: ");
  }

//============================================================================================================
//                                Отправка управляющей информации в arduino последовательно
//============================================================================================================
  // This will send the request to the server
  client.print(String("GET ")  + "/channels/******/feeds.json?api_key=*****************&results=2 HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");         // получить информацию об управлении устройством
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }

  // Прочитайте все строки ответа с сервера и распечатайте их на последовательный
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);                         // received by arduino serially
  }
 //Serial.println("closing connection");
}

Вот код Arduino:-

    //This sketch in the implementation of home automation 
#include <SoftwareSerial.h>// import the serial library
#include<String.h>
//-----------------------------------------
//    pin definations
//-----------------------------------------
#define Light 2              // pin 2 to control light
#define fan 3                 // pin 3 to control fan
//------------------------------------------
//       variables
//------------------------------------------
char e;
int p=0,q=0;        //these variables prevent switching ON/OFF of already turned ON/OFF devices
int DEBUG = 1;

SoftwareSerial home_monitor(10, 11); // RX, TX

char control_data; // the data transmitted over Bluetooth

void setup() {
  // put your setup code here, to run once:
  home_monitor.begin(115200);
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (home_monitor.available()){
     control_data=home_monitor.read();   // getting control information from ESP8266 serially
     e=control_data;
     if (DEBUG){
      Serial.print(control_data);
     }
     //Serial.print(e);
 //============================================================================================================
 //                                        Device Control
 //============================================================================================================

 // Performing required operations based on the value of channel
    //-------------------------------------------------------------
    //                        LIGHT
    //-------------------------------------------------------------

    if(e=='0'&&p==0)         //Light ON            
    {
      if (DEBUG){
        Serial.println("Light ON");
      }
      digitalWrite(Light,LOW);
      p=1;
    }
     if(e=='1'&&p==1)        //Light off
    {
      if (DEBUG){
        Serial.println("Light OFF");
      }
      digitalWrite(Light,HIGH);
      p=0;
    }

    //-------------------------------------------------------------
    //                        Heater
    //-------------------------------------------------------------

    if(e=='2'&&q==0)
    {
      if (DEBUG){
        Serial.println("Fan ON");
      }
      digitalWrite(fan,LOW);
      q=1;
    }
    if(e=='3'&&q==1)
    {
      if (DEBUG){
        Serial.println("Fan OFF");
      }
      digitalWrite(fan,HIGH);
      q=0;
    }
  }
}

, 👍-1

Обсуждение

'Serial.begin(115200); на ESP8266 и Serial.begin(9600);` на Arduino. Попробуйте использовать равное значение битрейта., @AltAir


1 ответ


0

Вы используете client.print (), а Arduino использует home_monitor.read() для получения сообщения (если я правильно понял). Что я сделал в своем скетче, так это изменил home_monitor.read() на home_monitor.readStringUntil('\n').

Также перед тем, как ESP отправит сообщение через client.print (), рекомендуется запустить клиент.метод flush (), поэтому он ожидает, пока все исходящие символы в буфере не будут отправлены, перед отправкой следующего.

При использовании ESP вы должны знать о методе полезной доходности () (вызовите его в конце цикла). Это позволяет ESP завершить свои фоновые обязанности, прежде чем продолжить (не вызывая этот метод может привести к некоторым проблемам.

,