Php 使用NodeMCU ESP8266将Arduino数据发送到mySQL数据库

Php 使用NodeMCU ESP8266将Arduino数据发送到mySQL数据库,php,c++,arduino,Php,C++,Arduino,请帮我输入密码。我有arduino代码,可以从mySql发送和获取数据。它运行良好,并将数据存储到数据库中。问题是,如果我打开按钮,值1存储在数据库中,但当我关闭按钮时,值0不存储在数据库中 这是我的arduino代码: //Arduino Code #include <SoftwareSerial.h> SoftwareSerial s(5,6);//Rx,Tx int buttonPinBulb = 11; int relay1 = 10; int buttonBulb; in

请帮我输入密码。我有arduino代码,可以从mySql发送和获取数据。它运行良好,并将数据存储到数据库中。问题是,如果我打开按钮,值1存储在数据库中,但当我关闭按钮时,值0不存储在数据库中

这是我的arduino代码:

//Arduino Code
#include <SoftwareSerial.h>

SoftwareSerial s(5,6);//Rx,Tx
int buttonPinBulb = 11;
int relay1 = 10;
int buttonBulb;
int currentStatus = LOW;
unsigned long lastMillis = 0;
const unsigned long debounceTime = 100;

void setup() {
  // put your setup code here, to run once:
  pinMode(buttonPinBulb, INPUT_PULLUP);
  pinMode(relay1, OUTPUT);
  s.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  buttonBulb = digitalRead(buttonPinBulb);
  bulbOnOff(buttonBulb);
}

int bulbOnOff(int buttonBulb) {
  unsigned long currentMillis = millis();
  // protect against overflow
  if ( (currentMillis - lastMillis > debounceTime) || (currentMillis < lastMillis)) {

    if (buttonBulb != currentStatus) {
      digitalWrite(relay1, buttonBulb);
      //Serial.println(!buttonBulb);
      currentStatus = buttonBulb;

      // update database here
      if(s.available()>0)
            {
            s.write(!buttonBulb);
            }

      lastMillis = currentMillis;
    }
  }
  return 0;
}
//Arduino代码
#包括
串行软件(5,6)//接收,发送
int buttonPinBulb=11;
int relay1=10;
int按钮盒;
int currentStatus=低;
无符号长lastMillis=0;
常量无符号长去BounceTime=100;
无效设置(){
//将安装代码放在此处,以便运行一次:
pinMode(按钮输入按钮,输入按钮上拉);
引脚模式(继电器1,输出);
s、 开始(115200);
}
void循环(){
//将主代码放在此处,以便重复运行:
buttonBulb=数字读取(buttonBulb);
bulbOnOff(buttonBulb);
}
int bulbOnOff(int buttonBulb){
无符号长电流毫秒=毫秒();
//防止溢出
if((当前毫秒-最后毫秒>去BounceTime)| |(当前毫秒<最后毫秒)){
if(buttonBulb!=当前状态){
数字写入(relay1,buttonBulb);
//Serial.println(!buttonBulb);
currentStatus=按钮bulb;
//在此更新数据库
如果(s.可用()>0)
{
s、 写入(!buttonBulb);
}
lastMillis=当前Millis;
}
}
返回0;
}
以下是nodeMCU ESP8266代码

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
#include <SoftwareSerial.h>

SoftwareSerial s(D6, D5); //RX,TX
int buttonBulb;
int Led_OnBoard = 2;
const char* ssid = "iPhone";                  // Your wifi Name
const char* password = "Qaser.shah.123";          // Your wifi Password
const char *host = "172.20.10.6"; //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() {
  // put your setup code here, to run once:
  wifiConnection();
  s.begin(115200);
}

int wifiConnection() {
  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
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  s.write("s");
  if (s.available() > 0)
  {
    buttonBulb = s.read();
    Serial.println(buttonBulb);
    int result = updateDatabase(buttonBulb);
    if(result != 0){
      //error updating database
      Serial.print("error updating database");
      }
  }
}

int updateDatabase(int buttonBulb){
    HTTPClient http;    //Declare object of class HTTPClient

  //String ButtonState;
  String buttonValueSend, postData;
  
  buttonValueSend = String(buttonBulb);   //String to interger conversion
 
  //Post Data
  postData = "buttonBulb=" + buttonValueSend;
  
  http.begin("http://172.20.10.6/Nodemcu_db_record_view/InsertDB.php");              //Specify request destination
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");    //Specify content-type header

  int httpCode = http.POST(postData);   //Send the request
  String payload = http.getString();    //Get the response payload
  
  Serial.println(httpCode);   //Print HTTP return code
  Serial.println(payload);    //Print request response payload
  Serial.println("Button Value send=" + buttonValueSend);

  http.end();  //Close connection
  return 0;
  }
#包括
#包括
#包括
#包括
#包括
串行软件(D6、D5)//接收,发送
int按钮盒;
仪表板上的int Led_=2;
const char*ssid=“iPhone”//您的wifi名称
const char*password=“Qaser.shah.123”//您的wifi密码
const char*host=“172.20.10.6”//您的pc或服务器(数据库)IP,例如:192.168.0.0,如果您是windows操作系统用户,请打开cmd,然后键入ipconfig,然后查看IPv4地址。
无效设置(){
//将安装代码放在此处,以便运行一次:
wifiConnection();
s、 开始(115200);
}
int-wifiConnection(){
引脚模式(Led_板载,输出);//将Led_板载引脚初始化为输出
序列号开始(115200);
WiFi.mode(WiFi_OFF);//防止重新连接问题(连接时间过长)
延迟(1000);
WiFi.mode(WiFi_STA);//此行隐藏了ESP作为WiFi热点的查看
WiFi.begin(ssid,密码);//连接到您的WiFi路由器
Serial.println(“”);
串行打印(“连接”);
//等待连接
while(WiFi.status()!=WL_已连接){
数字写入(车载Led_,低电平);
延迟(250);
连续打印(“.”);
数字写入(车载Led_,高);
延迟(250);
}
数字写入(车载Led_,高);
//如果连接成功,在串行监视器中显示IP地址
Serial.println(“”);
Serial.println(“连接到网络/SSID”);
串行打印(“IP地址:”);
Serial.println(WiFi.localIP());//分配给ESP的IP地址
序列号开始(115200);
}
void循环(){
//将主代码放在此处,以便重复运行:
s、 写下(“s”);
如果(s.可用()>0)
{
buttonBulb=s.read();
Serial.println(buttonBulb);
int result=updateDatabase(buttonBulb);
如果(结果!=0){
//更新数据库时出错
串行打印(“错误更新数据库”);
}
}
}
int updateDatabase(int buttonBulb){
HTTPClient http;//声明类HTTPClient的对象
//字符串按钮状态;
字符串按钮value发送,postData;
buttonValueSend=String(buttonBulb);//字符串到整数的转换
//发布数据
postData=“buttonBulb=“+buttonValueSend;
http.begin(“http://172.20.10.6/Nodemcu_db_record_view/InsertDB.php“”;//指定请求目标
http.addHeader(“内容类型”、“应用程序/x-www-form-urlencoded”);//指定内容类型头
int httpCode=http.POST(postData);//发送请求
字符串负载=http.getString();//获取响应负载
Serial.println(httpCode);//打印HTTP返回代码
Serial.println(负载);//打印请求响应负载
Serial.println(“按钮值发送=”+按钮值发送);
http.end();//关闭连接
返回0;
}
以下是我存储Arduino数据的php代码

<?php
//Creates new record as per request
    //Connect to database
    $servername = "localhost";      //example = localhost or 192.168.0.0
    $username = "root";     //example = root
    $password = ""; 
    $dbname = "automation";

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Database Connection failed: " . $conn->connect_error);
    }

    //Get current date and time
    date_default_timezone_set('Asia/Karachi');
    $d = date("Y-m-d");
    $t = date("H:i:s");

    if(!empty($_POST['buttonBulb']))
    {
        $buttonBulb = $_POST['buttonBulb'];
        
        $sql = "INSERT INTO project (ButtonState, Date, Time) VALUES ('".$buttonBulb."', '".$d."', '".$t."')"; //nodemcu_ldr_table = Youre_table_name

        if ($conn->query($sql) === TRUE) {
            echo "OK";
        } else {
            echo "Error: " . $sql . "<br>" . $conn->error;
        }
    }

    $conn->close();
?>

您可以创建一个单独的函数来更新数据库,并且只在按钮状态更改时调用更新

结合我对你上一个问题的回答,情况如下:

void循环(){
无符号长电流毫秒=毫秒();
如果((当前毫秒-最后毫秒>去BounceTime)
||(currentMillis
我发现了问题。问题出在我的php代码中,这就是为什么1会存储在数据库中,而0不会

以下是我对php代码的更改 我刚刚删除了
if(!empty(&_POST['buttonBulb']){}
在if语句中使用的代码现在位于if语句的外部。 原因 在这之后,当我将1发送到此代码时,这是正常的,但是如果发送0,则is语句假定没有值,buttonBulb变量为空

谢谢你们所有在这段代码中帮助我的人。不