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#写个上位软件;作为一个基础模块,可以延伸出甚多创意。