基于NodeMCU与Arduino IDE,如何用代码变量上传传感器数据到数据库?
问题描述
我使用NodeMCU作为IO处理器,现有可运行的传感器采集代码(如下),希望将采集到的温湿度、心率数据上传至数据库,请问如何通过代码中的变量实现该功能?
#include "DHT.h" #define DHTTYPE DHT11 #define dht_dpin 0 const int analog_ip = A0; int inputVal = 0; DHT dht(dht_dpin, DHTTYPE); void setup() { dht.begin(); Serial.begin(9600); Serial.println("Humidity sensor \n\n"); delay(1000); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); Serial.print("current humidity = "); Serial.print(h); Serial.println("% "); Serial.print("\ncurrent temperature = "); Serial.print(t); Serial.println("C "); inputVal = analogRead (analog_ip); Serial.print("\ncurrent heartbeat = "); Serial.println (60000/inputVal); delay(1000); }
解决方案
我给你两种实用的实现方案,都是基于NodeMCU的WiFi能力来上传数据,你可以根据自己的需求选择:
方案1:通过HTTP POST上传到后端接口(适合自定义数据库)
这种方式需要你先搭建一个简单的后端服务(比如PHP/Node.js),NodeMCU把数据通过HTTP请求发给后端,再由后端写入数据库(比如MySQL、PostgreSQL),灵活性很高。
步骤1:添加必要的库
NodeMCU自带ESP8266WiFi.h和ESP8266HTTPClient.h库,直接在代码里引用就行,不用额外安装。
步骤2:修改后的完整代码
我已经把你的原代码扩展,加入了WiFi连接和数据上传逻辑:
#include "DHT.h" #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> // 替换成你的WiFi信息 const char* ssid = "你的WiFi名称"; const char* password = "你的WiFi密码"; // 替换成你的后端接口地址(比如你的电脑IP+后端脚本路径) const char* serverUrl = "http://192.168.1.100/upload_sensor_data.php"; #define DHTTYPE DHT11 #define dht_dpin 0 const int analog_ip = A0; int inputVal = 0; DHT dht(dht_dpin, DHTTYPE); void setup() { dht.begin(); Serial.begin(9600); Serial.println("Humidity sensor initialized \n"); // 连接WiFi Serial.print("Connecting to WiFi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi connected!"); delay(1000); } void loop() { // 读取传感器数据,这里加了错误判断避免无效数据 float h = dht.readHumidity(); float t = dht.readTemperature(); inputVal = analogRead(analog_ip); float heartbeat = 60000.0 / inputVal; // 用浮点型避免整数除法丢失精度 // 打印本地数据 Serial.print("Humidity: "); Serial.print(h); Serial.println("%"); Serial.print("Temperature: "); Serial.print(t); Serial.println("°C"); Serial.print("Heartbeat: "); Serial.println(heartbeat); Serial.println("---"); // 检查WiFi状态,没问题就上传数据 if(WiFi.status() == WL_CONNECTED) { HTTPClient http; http.begin(serverUrl); // 设置请求头,告诉后端我们发的是表单数据 http.addHeader("Content-Type", "application/x-www-form-urlencoded"); // 把传感器变量拼成POST参数 String postData = "humidity=" + String(h) + "&temperature=" + String(t) + "&heartbeat=" + String(heartbeat); int responseCode = http.POST(postData); // 打印上传结果 if(responseCode > 0) { String response = http.getString(); Serial.println("Upload success! Response code: " + String(responseCode)); Serial.println("Server response: " + response); } else { Serial.println("Upload failed! Error code: " + String(responseCode)); } http.end(); // 关闭HTTP连接 } else { Serial.println("WiFi disconnected, reconnecting..."); WiFi.reconnect(); delay(1000); } delay(5000); // 调整上传间隔,别太频繁给服务器压力 }
步骤3:后端接口示例(PHP+MySQL)
后端需要接收POST参数并存入数据库,这里给你一个简单的PHP示例,记得替换成你的数据库信息:
<?php // 数据库配置 $servername = "localhost"; $dbUser = "你的数据库用户名"; $dbPass = "你的数据库密码"; $dbName = "你的数据库名称"; // 连接数据库 $conn = new mysqli($servername, $dbUser, $dbPass, $dbName); if ($conn->connect_error) { die("Database connection failed: " . $conn->connect_error); } // 获取NodeMCU传来的参数 $humidity = $_POST['humidity']; $temperature = $_POST['temperature']; $heartbeat = $_POST['heartbeat']; // 插入数据的SQL语句(先确保你已经创建了sensor_data表) $sql = "INSERT INTO sensor_data (humidity, temperature, heartbeat, created_at) VALUES ('$humidity', '$temperature', '$heartbeat', NOW())"; if ($conn->query($sql) === TRUE) { echo "Data saved successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?>
提示:记得先在MySQL里创建
sensor_data表,字段可以设为:id(自增主键)、humidity(float)、temperature(float)、heartbeat(float)、created_at(datetime)。
方案2:直接上传到Firebase实时数据库(快速原型首选)
如果不想自己搭后端,Firebase实时数据库是个不错的选择,它提供了现成的云存储,NodeMCU可以直接连接上传,适合快速做原型。
步骤1:安装Firebase库
打开Arduino IDE的库管理器,搜索Firebase Arduino Client Library for ESP8266 and ESP32并安装。
步骤2:修改后的完整代码
#include "DHT.h" #include <ESP8266WiFi.h> #include <FirebaseESP8266.h> // WiFi配置 const char* ssid = "你的WiFi名称"; const char* password = "你的WiFi密码"; // Firebase配置(从Firebase控制台获取) #define FIREBASE_HOST "你的firebase项目地址.firebaseio.com" #define FIREBASE_AUTH "你的firebase数据库密钥" FirebaseData firebaseData; #define DHTTYPE DHT11 #define dht_dpin 0 const int analog_ip = A0; int inputVal = 0; DHT dht(dht_dpin, DHTTYPE); void setup() { dht.begin(); Serial.begin(9600); Serial.println("Humidity sensor initialized \n"); // 连接WiFi Serial.print("Connecting to WiFi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi connected!"); // 初始化Firebase连接 Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); Firebase.reconnectWiFi(true); // WiFi断开后自动重连 delay(1000); } void loop() { // 读取传感器数据 float h = dht.readHumidity(); float t = dht.readTemperature(); inputVal = analogRead(analog_ip); float heartbeat = 60000.0 / inputVal; // 打印本地数据 Serial.print("Humidity: "); Serial.print(h); Serial.println("%"); Serial.print("Temperature: "); Serial.print(t); Serial.println("°C"); Serial.print("Heartbeat: "); Serial.println(heartbeat); Serial.println("---"); // 上传到Firebase if(Firebase.ready()){ // 用时间戳生成唯一路径,避免数据覆盖 String dataPath = "/sensor_data/" + String(millis()); // 逐个上传数据字段 bool uploadSuccess = Firebase.setFloat(firebaseData, dataPath + "/humidity", h) && Firebase.setFloat(firebaseData, dataPath + "/temperature", t) && Firebase.setFloat(firebaseData, dataPath + "/heartbeat", heartbeat); if(uploadSuccess){ Serial.println("Data uploaded to Firebase successfully!"); } else { Serial.println("Firebase upload failed: " + firebaseData.errorReason()); } } delay(5000); }
注意事项
- 去Firebase控制台创建项目,开启实时数据库,然后在“项目设置”里获取
FIREBASE_HOST和FIREBASE_AUTH。 - 测试阶段可以把数据库规则设为公开(读写权限都设为
true),正式环境一定要配置安全规则,避免数据泄露。
内容的提问来源于stack exchange,提问作者Ishan Verma
相关产品推荐
相关产品推荐

