Я отправляю данные о влажности с датчика (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()
Может ли кто-нибудь увидеть этот конфликт в этих двух частях код?
Как я могу это исправить?
Любые предложения приветствуются.