当前位置: 首页 > news >正文

esp8266+dht11传感器实时上报温湿度

esp8266+dht11传感器实时上报温湿度

  • 1、接线示意图
  • 2、esp8266控制代码
  • 3、服务器端示例
  • 4、效果图

1、接线示意图

DHT11               ESP8266 (NodeMCU)
┌─────────┐         ┌─────────────┐
│ VCC  ●──┼─────────│ 3.3V        │
│ OUT  ●──┼─────────│ D4 (GPIO2)  │
│ GND  ●──┼─────────│ GND         │
└─────────┘         └─────────────┘

2、esp8266控制代码

#include <DHT.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>
#include <NTPClient.h>
#include <WiFiUdp.h>// 温湿度传感器配置
#define DHTPIN D4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);// WiFi配置
const char* ssid = "";
const char* password = "";// NTP时间配置
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 8*3600, 60000); // 东八区// 上报服务器配置
const char* serverURL = "http://192.168.*.*:5000/api/sensor-data"; // 替换为你的服务器地址// 设备标识
const String deviceId = "ESP8266_DHT11_001";void setup() {Serial.begin(115200);// 初始化传感器dht.begin();// 连接WiFiWiFi.begin(ssid, password);Serial.print("连接WiFi");while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("\nWiFi连接成功");Serial.print("IP地址: ");Serial.println(WiFi.localIP());// 初始化时间客户端timeClient.begin();timeClient.update();
}void loop() {// 读取温湿度float temperature = dht.readTemperature();float humidity = dht.readHumidity();if (isnan(temperature) || isnan(humidity)) {Serial.println("传感器读取失败");} else {// 获取当前时间timeClient.update();String timestamp = timeClient.getFormattedTime();String date = getFormattedDate();Serial.print("时间: "); Serial.print(date); Serial.print(" "); Serial.println(timestamp);Serial.print("温度: "); Serial.print(temperature); Serial.print("°C ");Serial.print("湿度: "); Serial.println(humidity);// 上报数据到服务器if (reportToServer(date, timestamp, temperature, humidity)) {Serial.println("数据上报成功");} else {Serial.println("数据上报失败");}}delay(5000); // 5秒读取一次
}bool reportToServer(String date, String time, float temperature, float humidity) {if (WiFi.status() == WL_CONNECTED) {WiFiClient client;HTTPClient http;// 准备JSON数据DynamicJsonDocument doc(512);doc["deviceId"] = deviceId;doc["date"] = date;doc["time"] = time;doc["timestamp"] = timeClient.getEpochTime();doc["temperature"] = temperature;doc["humidity"] = humidity;String jsonString;serializeJson(doc, jsonString);// 发送HTTP POST请求http.begin(client, serverURL);http.addHeader("Content-Type", "application/json");int httpResponseCode = http.POST(jsonString);if (httpResponseCode > 0) {String response = http.getString();Serial.print("服务器响应: ");Serial.println(response);http.end();return true;} else {Serial.print("错误代码: ");Serial.println(httpResponseCode);http.end();return false;}}return false;
}String getFormattedDate() {time_t rawtime = timeClient.getEpochTime();struct tm * ti;ti = localtime (&rawtime);uint16_t year = ti->tm_year + 1900;uint8_t month = ti->tm_mon + 1;uint8_t day = ti->tm_mday;return String(year) + "-" + String(month < 10 ? "0" : "") + String(month) + "-" + String(day < 10 ? "0" : "") + String(day);
}

3、服务器端示例

from flask import Flask, request, jsonify
from datetime import datetime
import jsonapp = Flask(__name__)# 存储最新的数据(可选,用于显示)
latest_data = {}@app.route('/api/sensor-data', methods=['POST'])
def receive_sensor_data():"""接收传感器数据接口"""try:# 获取JSON数据data = request.get_json()# 添加服务器接收时间data['server_received_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')# 保存最新数据global latest_datalatest_data = data.copy()# 打印接收到的数据print("\n" + "=" * 50)print("收到传感器数据:")print(f"设备ID: {data.get('deviceId', 'N/A')}")print(f"日期: {data.get('date', 'N/A')}")print(f"时间: {data.get('time', 'N/A')}")print(f"时间戳: {data.get('timestamp', 'N/A')}")print(f"温度: {data.get('temperature', 'N/A')}°C")print(f"湿度: {data.get('humidity', 'N/A')}%")print(f"服务器接收时间: {data['server_received_at']}")print("=" * 50)# 返回成功响应return jsonify({'status': 'success','message': '数据接收成功','received_at': data['server_received_at']}), 200except Exception as e:print(f"错误: {str(e)}")return jsonify({'status': 'error','message': f'数据接收失败: {str(e)}'}), 400@app.route('/api/sensor-data/latest', methods=['GET'])
def get_latest_data():"""获取最新接收到的数据"""if latest_data:return jsonify({'status': 'success','data': latest_data}), 200else:return jsonify({'status': 'error','message': '暂无数据'}), 404@app.route('/api/health', methods=['GET'])
def health_check():"""健康检查接口"""return jsonify({'status': 'success','message': '服务运行正常','timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S')}), 200@app.route('/', methods=['GET'])
def index():"""首页"""return """<h1>温湿度传感器数据接收服务</h1><p>服务运行正常!</p><ul><li><a href="/api/sensor-data/latest">查看最新数据</a></li><li><a href="/api/health">健康检查</a></li></ul><p>使用 POST 方法向 <code>/api/sensor-data</code> 发送传感器数据</p>"""if __name__ == '__main__':print("启动温湿度传感器数据接收服务...")print("访问 http://127.0.0.1:5000 查看服务状态")app.run(host='0.0.0.0', port=5000, debug=True)

4、效果图

串口监视器数据
服务端接收数据
web效果

http://www.dtcms.com/a/552882.html

相关文章:

  • WPF中为Button设置IsMouseOver和IsPressed事件中改变背景颜色不起作用
  • vagrant nat网络问题-虚拟机同时存在两个IP,并且不能访问外网
  • 微信小程序代理商加盟多少钱郑州网站优化公司价位
  • Ingress-Nginx故障排除
  • WPF ListView 列表
  • 国内资深易经风水专家谷晟阳
  • seo网站优化优化排名关于网站建设电话销售的开场白
  • Docker Swarm K8s云原生分布式部署2025年版
  • 量化投资从入门到入土:什么是股市
  • Windows 下 ComfyUI + Comfy CLI + PyTorch(CUDA)完整源码安装教程
  • wordpress站点管理wordpress去除仪表盘
  • 【SpringMVC】详解用户登录前后端交互流程:AJAX 异步通信与 Session 机制实战
  • Arbess零基础学习,使用Arbess+GitLab实现Vue.js项目构建并主机部署
  • Git 标准工作流程和 Git 使用(持续更新)
  • 阿里云 OceanBase 可观测最佳实践
  • vitest单元测试测试vue中了element项目安装与运行笔记
  • NineData社区版 V4.6.0 正式发布!SQL 窗口新增4个数据源,新增支持OceanBase等多条数据复制和对比链路
  • 仿RabbitMQ实现消息队列(一)--项目介绍
  • 建设网站的法律声明正规赚佣金的平台
  • BUG与测试用例
  • 【spring boot 使用apache poi 生成和处理word 文档】
  • 橙米网站建设做网站查询违章
  • AI用于自动化办公指南
  • 从“手动试错”到“自动化闭环”:实车OTA测试的效率革命
  • 智能电器:重构生活的科技力量
  • OpenAI拟借AI估值重构浪潮冲击1.1万亿美元IPO——基于市场情绪因子与估值量化模型的深度分析
  • redis事务与Lua脚本
  • 【技术选型】前端框架:Vue vs React - 组合式API与Hooks的哲学之争
  • 网站建设网网站建设全网营销客户资源
  • Python 数据可视化:用 Matplotlib 绘制多维度对比图表