#php #mysql #arduino #nodemcu #arduino-c
#php #mysql #arduino #nodemcu #arduino-c
Вопрос:
У меня есть код для Arduino Nano и NodeMCU ESP8266. Оба работают правильно и выдают результат, но результат не то, что я хочу.
Код NodeMCU, который получает данные из базы данных и отправляет их в Arduino:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
#include <SoftwareSerial.h>
#include <ArduinoJson.h>
SoftwareSerial s(D6, D5);
int Led_OnBoard = 2; // Initialize the Led_OnBoard
const char* ssid = "ssid"; // Your wifi Name
const char* password = "password"; // Your wifi Password
const char *host = "pc/server IP"; //Your pc or server (database) IP, example : 192.168.0.0 , if you are a windows os user, open cmd, then type ipconfig then look at IPv4 Address.
void setup() {
delay(1000);
pinMode(Led_OnBoard, OUTPUT); // Initialize the Led_OnBoard pin as an output
Serial.begin(115200);
WiFi.mode(WIFI_OFF); //Prevents reconnection issue (taking too long to connect)
delay(1000);
WiFi.mode(WIFI_STA); //This line hides the viewing of ESP as wifi hotspot
WiFi.begin(ssid, password); //Connect to your WiFi router
Serial.println("");
Serial.print("Connecting");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(Led_OnBoard, LOW);
delay(250);
Serial.print(".");
digitalWrite(Led_OnBoard, HIGH);
delay(250);
}
digitalWrite(Led_OnBoard, HIGH);
//If connection successful show IP address in serial monitor
Serial.println("");
Serial.println("Connected to Network/SSID");
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //IP address assigned to your ESP
s.begin(115200);
}
void loop() {
HTTPClient http; //Declare object of class HTTPClient
http.begin("http://pc/server IP/Nodemcu_db_record_view/GetValue.php");
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int httpCode = http.GET(); //Get the request
String payload = http.getString(); //Get the response payload
Serial.println(httpCode); //Print HTTP return code
Serial.println(payload);
http.end(); //Close connection
StaticJsonBuffer<1000> jsonBuffer;
JsonObjectamp; root = jsonBuffer.createObject();
root["data1"] = payload;
if (s.available() >= 0)
{
root.printTo(s);
}
}
Код Arduino, который получает данные из NodeMCU:
#include <SoftwareSerial.h>
SoftwareSerial s(5,6);
#include <ArduinoJson.h>
void setup() {
// Initialize Serial port
Serial.begin(115200);
s.begin(115200);
while (!Serial) continue;
}
void loop() {
StaticJsonBuffer<1000> jsonBuffer;
JsonObjectamp; root = jsonBuffer.parseObject(s);
if (root == JsonObject::invalid())
return;
int data1=root["data1"];
Serial.println(data1);
}
PHP-код, который запрашивает базу данных при ее вызове из NodeMCU:
<?php
$server="localhost";
$username="root";//THE DEFAULT USERNAME OF THE DATABASE
$password="";
$dbname="automation";
$con=mysqli_connect($server,$username,$password,$dbname) or die("unable to connect");
$sql="SELECT ButtonState FROM project WHERE Date = '2020-10-14'";
$result=mysqli_query($con,$sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo $row["ButtonState"];
}
}
?>
Выше все, что я написал, и это работает. Он выдает непрерывный вывод, но мне нужно только 1 значение на последовательном мониторе.
Спасибо за помощь, так как я новичок в мире Arduino. Я слишком много пытался и искал, но не могу решить эту проблему.
Редактировать Другая проблема заключается в том, что когда данные в столбце базы данных равны 1, то вывод на последовательный монитор иногда меняется, но если данные в столбце базы данных равны 0, они остаются постоянными. Посмотрите на вывод на картинках.
Ответ №1:
Проблема в том, что ваш код в loop
функции repeated incessantly
. Итак, вы должны add a variable on the top of your program
и установите для него значение true при выполнении вашего кода.
Попробуйте этот пример кода:
// add a variable on the top
bool printed = false;
void loop() {
// only execute if the variable is false
if (printed == false) {
StaticJsonBuffer<1000> jsonBuffer;
JsonObjectamp; root = jsonBuffer.parseObject(s);
if (root == JsonObject::invalid())
return;
int data1 = root["data1"];
Serial.println(data1);
// set the variable to true so that it is not executed twice
printed = true;
}
}
Комментарии:
1. спасибо за ваш ответ, и он работает. У меня есть еще один вопрос относительно приведенного выше кода. Почему последовательный монитор показывает 0 после серии 1, когда из столбца базы данных поступает 1, и если я меняю столбец на 0, тогда он всегда равен 0. Также я отредактировал вопрос и добавил изображения вывода, чтобы прояснить вопрос в этом комментарии.