Отправить данные из Arduino в ESP8266 с помощью JSON и отобразить эти данные на веб-сервере? - PullRequest
0 голосов
/ 29 февраля 2020

Я отправляю данные о влажности с датчика (DHT11), подключенного к Arduino Uno, на NodeMCU (ESP8266). Я посылаю эти данные через библиотеку Arduino JSON, и она работает отлично. Таким образом, NodeMCU может без проблем десериализовать объект JSON, прочитать его и отправить его WebServer.

То, что я хочу сделать: иметь автоматическое c refre sh веб-сервера, чтобы я мог непрерывно просматривать эти данные без ручного обновления sh страницы каждый раз

Я следовал Этот учебник YouTube для следующего кода и

Ниже приведен код NodeMCU в IDE Arduino:

/*------------------------------------------------------------------------------
  06/25/2019
  Author: Makerbro
  Platforms: ESP8266
  Language: C++/Arduino
  File: esp8266_firmware.ino
  ------------------------------------------------------------------------------
  Description:
  Code for YouTube video demonstrating how to communicate between an Arduino UNO
  and an ESP8266.
  https://youtu.be/6-RXqFS_UtU

  Do you like my videos? You can support the channel:
  https://patreon.com/acrobotic
  https://paypal.me/acrobotic
  ------------------------------------------------------------------------------
  Please consider buying products from ACROBOTIC to help fund future
  Open-Source projects like this! We'll always put our best effort in every
  project, and release all our design files and code for you to use.

  https://acrobotic.com/
  https://amazon.com/acrobotic
  ------------------------------------------------------------------------------
  License:
  Please see attached LICENSE.txt file for details.
  ------------------------------------------------------------------------------*/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h>

#ifndef STASSID
#define STASSID "********"
#define STAPSK  "********"
#endif

ESP8266WebServer server(80);
const char* ssid = STASSID;
const char* password = STAPSK;



void setup()
{
  WiFi.begin(ssid, password);
  Serial.begin(9600);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println("");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  server.on("/", handleIndex);
  server.begin();
}

void loop()
{
  server.handleClient();
}

void handleIndex()
{
  // Send a JSON-formatted request with key "type" and value "request"
  // then parse the JSON-formatted response with keys "gas" and "distance"
  DynamicJsonDocument doc(1024);
  float Humidity = 0;
  // Sending the request
  doc["type"] = "request";
  serializeJson(doc, Serial);
  // Reading the response
  boolean messageReady = false;
  String message = "";
  while (messageReady == false) { // blocking but that's ok
    if (Serial.available()) {
      message = Serial.readString();
      messageReady = true;
    }
  }
  // Attempt to deserialize the JSON-formatted message
  DeserializationError error = deserializeJson(doc, message);
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.c_str());
    return;
  }
  Humidity = doc["Humidity"];
  // Prepare the data for serving it over HTTP
  String output = "Humidity: " + String(Humidity);
  // Serve the data as plain text, for example
  server.send(200, "text/plain", output);
}

Я нашел способ автоматически ссылаться на sh WebServer каждую x секунду в Этот замечательный учебник , и он отлично работает, но только для простых программ (например, я вижу страницу refre sh в автомате * 1043). * и отображать различные целые числа).

Но когда я пытаюсь отправить данные JSON в новом коде, где я также хочу обновить sh в автоматическом режиме c на странице скажем, каждые 5 секунд десериализация JSON возвращает мне ошибку: Неверный ввод несколько раз.

Так что из-за этой ошибки выдается несколько раз, я думаю, что часть autorefre sh WebServer работает, , но по какой-то причине часть JSON конфликтует с autorefre sh часть WebServer .

Это последний код, который не работает:

//http://www.martyncurrey.com/esp8266-and-the-arduino-ide-part-8-auto-update-webpage/
/*
 * Sketch: ESP8266_Part8_01_AutoUpdate_HTML
 * Intended to be run on an ESP8266
 */

String header = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";

String html_1 = R"=====(
<!DOCTYPE html>
<html>
 <head>
 <meta name='viewport' content='width=device-width, initial-scale=1.0'/>
 <meta charset='utf-8'>
 <meta http-equiv='refresh' content='5'>
 <style>
   body {font-size:100%;}
   #main {display: table; margin: auto;  padding: 0 10px 0 10px; }
   h2 {text-align:center; }
   p { text-align:center; }
 </style>
   <title>Auto Update Example Using HTML</title>
 </head>

 <body>
   <div id='main'>
     <h2>Auto Update Example Using HTML</h2>
     <div id='count'>
       <p>Count = %Humidity%</p>
     </div>
   </div>
 </body>
</html>
)=====";

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h>

// change these values to match your network
char ssid[] = "*********";       //  your network SSID (name)
char pass[] = "********";          //  your network password

WiFiServer server(80);

String tmpString = "";
unsigned int count = 0;

void setup()
{
    Serial.begin(9600);
    Serial.println();
    Serial.println("Serial started at 115200");
    Serial.println();

    // Connect to a WiFi network
    Serial.print(F("Connecting to "));  Serial.println(ssid);
    WiFi.begin(ssid, pass);

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

    Serial.println("");
    Serial.println(F("[CONNECTED]"));
    Serial.print("[IP ");             
    Serial.print(WiFi.localIP());
    Serial.println("]");

    // start a server
    server.begin();
    Serial.println("Server started");

} // void setup()

void loop()
{

// Send a JSON-formatted request with key "type" and value "request"
  // then parse the JSON-formatted response with keys "gas" and "distance"
  DynamicJsonDocument doc(1024);
  float Humidity = 0;
  // Sending the request
  doc["type"] = "request";
  serializeJson(doc, Serial);
  // Reading the response
  boolean messageReady = false;
  String message = "";
  while (messageReady == false) { // blocking but that's ok
    if (Serial.available()) {
      message = Serial.readString();
      messageReady = true;
    }
  }
  // Attempt to deserialize the JSON-formatted message
  DeserializationError error = deserializeJson(doc, message);
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.c_str());
    return;
  }

  Humidity = doc["Humidity"];
  Serial.print("Humidity = ");
  Serial.println(Humidity);

delay(2000);

  Serial.println("Entering the Client part");
    // Check if a client has connected
    WiFiClient client = server.available();
    if (!client)  {  return;  }




  // Prepare the data for serving it over HTTP


    tmpString = html_1;
    tmpString.replace("%Humidity%", String(Humidity) );

    client.flush();
    client.print( header );
    client.print( tmpString ); 




    delay(100);


  // The client will actually be disconnected when the function returns and 'client' object is destroyed
} // void loop()

Может ли кто-нибудь увидеть этот конфликт в этих двух частях код?

Как я могу это исправить?

Любые предложения приветствуются.

...