ESP8266+DHT11+Python制作一个物联网温湿度传感器
ESP8266是一款低功耗、高集成度的Wi-Fi SOC(System on Chip,系统级芯片),这款芯片专为物联网(IoT)应用而设计,常见开发ESP8266的环境可以使用Arduino或者ESP8266 RTOS SDK、NodeMCU,加入DHT11温湿度传感器和python脚本即可制作一个物联网模块,实时在电脑终端记录温度值和湿度值。
我这次使用的Arduino IDE,Arduino IDE默认不带ESP8266开发板,需要先下载ESP8266开发板信息,先打开首选项,随后在其他开发板管理地址里填入json文件连接:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
随后在开发板管理中安装ESP8266开发板
随后即可在开发板中选择ESP8266开发板
在编写代码前需要在Arduino IDE中安装DHT库,在DHT.h中可以看到不止支持DHT11温湿度传感器,也支持DHT12~22和AM2301温湿度传感器,需要精度要求高一点的可以选择AM2301这种
// DHT.h
static const uint8_t DHT11{11}; /**< DHT TYPE 11 */
static const uint8_t DHT12{12}; /**< DHY TYPE 12 */
static const uint8_t DHT21{21}; /**< DHT TYPE 21 */
static const uint8_t DHT22{22}; /**< DHT TYPE 22 */
static const uint8_t AM2301{21}; /**< AM2301 */
硬件接线
我直接购买的三线制DHT11温湿度传感器,相较于四线制的版本省得加入上拉电阻的步骤,图中的电路板S端口为信号线,中间端口为电源正极,-号端口为电源负极
我选择了ESP8266开发板中IO2(另一面是D4)端口,因为这个端口挨着3.3V电源和GND端口,正好插一排
Arduino IDE代码
这里需要先确定好WIFI和WIFI密码、电脑的ID与一个空闲的端口,电脑ID可以在cmd命令中使用ipconfig命令查找,这里我使用的:8000端口 :
const char* ssid = "GAY-LINK"; // WIFI名称
const char* password = "GGBond"; // WIFI密码
const char* serverUrl = "http://电脑ID:8000";
随后定义好要使用的引脚:
#define DHTPIN 2 // 定义DHT11数据引脚,连接到ESP8266的D4(IO2)引脚
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
完整版代码:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <DHT.h>
const char* ssid = "GAY-LINK"; // WIFI名称
const char* password = "GGBond"; // WIFI密码
const char* serverUrl = "http://电脑ID:8000"; // ID可以在cmd命令中使用ipconfig命令查找
// 这里使用的:8000端口
#define DHTPIN 2 // 定义DHT11数据引脚,连接到ESP8266的D4(IO2)引脚
#define DHTTYPE DHT11 // 定义DHT类型(DHT11)
DHT dht(DHTPIN, DHTTYPE); // 初始化DHT传感器
unsigned long previousMillis = 0;
const long interval = 5000; // 每5秒发送一次数据
void setup() {
Serial.begin(115200);
dht.begin();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("WiFi connected");
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// 读取温湿度数据
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// 检查是否读取失败
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// JSON格式的数据
String jsonData = "{\"humidity\":" + String(humidity) + ",\"temperature\":" + String(temperature) + "}";
// 发送HTTP POST请求
WiFiClient wifiClient;
HTTPClient http;
http.begin(wifiClient, serverUrl);
http.addHeader("Content-Type", "application/json");
int httpResponseCode = http.POST(jsonData);
// 输出HTTP响应
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
http.end();
}
}
Python代码
接下来使用Python自带的http.server库和json库,制作一个主站来接受ESP8266发送来的数据,这里推荐使用JSON数据来进行传输
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
class RequestHandler(BaseHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
print("Received data:", post_data.decode('utf-8'))
# 解析JSON数据(推荐使用JSON,年轻就是好啊,怎么piao都累不倒,你看我现在还能跳)
try:
data = json.loads(post_data.decode('utf-8'))
print("Parsed JSON data:", data)
except json.JSONDecodeError as e:
print("Error decoding JSON:", e)
# 发送响应
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
self.wfile.write(b'Data received')
def run(server_class=HTTPServer, handler_class=RequestHandler, port=8000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print(f"Starting server on port {port}...")
httpd.serve_forever()
run()
接下来运行Python脚本并在Arduino IDE中打开串口监视器:
可以看到串口监视器显示WIFI已经连接到,并向主站设备传输了数据
在终端可以看到接收到了ESP8266所发送来的数据,如果觉得不给力还可以在脚本中加入代码,将接收到的数据连同时间存储到一个EXCEL表格中(在物理和化学实验室里会用得到);也可以加一个TTL转Modbus模块、一个IIC协议通讯的OLED屏幕,设计设计电源电路变成Modbus RTU协议的传感器,再用C#写个上位软件;作为一个基础模块,可以延伸出甚多创意。