Guten Abend!
Ich finde 1000fach Hilfestellungen zum Thema, leider komme dennoch nicht weiter, und frage nun um Rat.
Von einem ESP8266 ESP01-S sende ich eine empfangene JSON-Kette über TX und empfange diese am Arduino über SoftwareSerial.
Problem ist, das die Verarbeitung am Arduino nicht richtig funktioniert. Ein rohes Serial.write(ESPserial.read()); laboriert tadellos, sobald ich die Daten verarbeiten möchte, jedoch folgendes Szenario: das Programm verarbeitet die Daten teilweise fehlerlos, dann "hängt" es teilweise recht lange und tut gar nichts (gibt weder am Seriellen Monitor etwas aus, noch reagieren die BuiltIn LEDs, wie im Code angewiesen, und hin und wieder gibt parseObject einen Fehler aus (JSON Parsing failed).
Ich bin mir relativ sicher, dass ich Fehler darin begehe, wie ich die Daten Seriell empfange bzw. diese verarbeite.
Von der Hardware betrachtet würde ich behaupten, für mich Laien, das alles in Ordnung ist (Indikator hier, das Serial.write() mir eben den korrekten Empfang bestätigt, solange wie das Programm nichts anderes zu tun bekommt).
Vielen Dank für Tipps und Hilfe / und Kritikpunkte.
Programm auf dem ESP-01S:
// http://arduino.esp8266.com/stable/package_esp8266com_index.json
// Node MCU 1.0 ESP 12E Module
// ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
// WIFI
const char* ssid = "XXX";
const char* password = "XXX";
// JSON
#include <ArduinoJson.h>
// Programm Variables
int PIXEL_DATA_SIZE = 7;
int requestperiod = 5000;
// Stuff
unsigned long time_now = 0;
void setup()
{
//Serial.begin(115200);
Serial.begin(9600);
//Serial.println();
//Serial.print("Verbinde zu ");
//Serial.println(ssid); // Kontrollelement im seriellen Monitor
WiFi.mode(WIFI_STA);
WiFi.begin(ssid,password); // Die WLAN Verbindung wird mit der oben definierten SSID und dem zugehörigen Passwort hergestellt
while (WiFi.status() != WL_CONNECTED) // Solange noch keine WLAN-Verbindung besteht....
{
delay(500);
//Serial.print("."); // ... sollen Punkte ausgegeben werden. Die Punkte dienen als Kontrollelement.
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on
digitalWrite(LED_BUILTIN, LOW); // turn the LED off
}
//Serial.println(" ");
//Serial.println("WiFi verbunden"); // Kontrollelement im seriellen Monitor
}
void loop() {
if(millis() > time_now + requestperiod)
{
time_now = millis();
getStatus();
}
}
void getStatus() {
HTTPClient http;
http.begin("http://192.168.2.106:80/arduino/XXX");
int httpCode = http.GET();
if (httpCode > 0) {
//Serial.print("Request OK ");
//Serial.println(millis());
String response = http.getString();
http.end();
Serial.println(response);
delay(10);
const size_t bufferSize = JSON_OBJECT_SIZE(PIXEL_DATA_SIZE) + 40;
DynamicJsonBuffer jsonBuffer(bufferSize);
JsonObject& root = jsonBuffer.parseObject(response);
requestperiod = root["requestperiod"];
}
http.end();
}
Programm auf dem Arduino:
// Basic serial communication with ESP8266
// Uses serial monitor for communication with ESP8266
//
// Pins
// Arduino pin 2 (RX) to ESP8266 TX
// Arduino pin 3 to voltage divider then to ESP8266 RX
// Connect GND from the Arduiono to GND on the ESP8266
// Pull ESP8266 CH_PD HIGH
//
// JSON
// ArduinoJson - Version: 5.13.2
#include <ArduinoJson.h>
#include <ArduinoJson.hpp>
int whitePIN = 11;
// Programm Variables
int PIXEL_DATA_SIZE = 7;
int PIXELdelay;
int PIXELwhite0;
int PIXELred0;
int PIXELgreen0;
int PIXELblue0;
int PIXELmode = 1;
#include <SoftwareSerial.h>
SoftwareSerial ESPserial(2, 3); // RX | TX
void setup()
{
Serial.begin(9600); // communication with the host computer
// Start the software serial for communication with the ESP8266
ESPserial.begin(9600);
pinMode(whitePIN, OUTPUT);
}
void loop()
{
//analogWrite(whitePIN, PIXELwhite0);
//Serial.print("white: ");
//Serial.println(PIXELwhite0);
// listen for communication from the ESP8266
while ( ESPserial.available() == 0 ) {
Serial.println("available loop");
}
String json;
//strcpy(json, ESPserial.readString());
json = ESPserial.readString();
Serial.println(json);
const size_t bufferSize = JSON_OBJECT_SIZE(PIXEL_DATA_SIZE) + 40;
DynamicJsonBuffer jsonBuffer(bufferSize);
JsonObject& root = jsonBuffer.parseObject( json );
/*
PIXELmode = root["pixelmode"];
PIXELdelay = root["delay"];
PIXELwhite0 = root["white0"];
PIXELred0 = root["red0"];
PIXELgreen0 = root["green0"];
PIXELblue0 = root["blue0"];
*/
if (!root.success()) {
for (int i=0; i <= 3; i++) {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on
digitalWrite(LED_BUILTIN, LOW); // turn the LED off
}
Serial.println("JSON Parsing failed");
//delay(5000);
} else {
//Serial.println(json);
PIXELwhite0 = root["white0"];
analogWrite(whitePIN,PIXELwhite0);
}
}