You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:28:18