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

1. 硬件准备: - ESP8266开发板 - DHT11湿度传感器 - 蜂鸣器 - 杜邦线 - 面包板 2. 软件准备: - Arduino IDE - ESP8266 - DHT 3. 接线: 将DHT11的VCC接到ESP8266的3.3V,将DHT11的GND接到ESP8266的GND,将DHT11的DATA接到ESP8266的D1口,将蜂鸣器的正极接到ESP8266的D2口,将蜂鸣器的负极接到ESP8266的GND。 4. 代码编写: ``` #include <ESP8266WiFi.h> #include <DHT.h> #define DHTPIN D1 // DHT11 DATA引脚连接ESP8266的D1口 #define DHTTYPE DHT11 // DHT11传感器类型 #define buzzerPin D2 // 蜂鸣器连接ESP8266的D2口 const char* ssid = "你的WiFi名称"; // WiFi名称 const char* password = "你的WiFi密码"; // WiFi密码 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); pinMode(buzzerPin, OUTPUT); digitalWrite(buzzerPin, HIGH); delay(1000); digitalWrite(buzzerPin, LOW); delay(1000); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); } void loop() { delay(2000); float h = dht.readHumidity(); // 读取湿度 float t = dht.readTemperature(); // 读取度 if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; } Serial.print("Humidity: "); Serial.print(h); Serial.print("% Temperature: "); Serial.print(t); Serial.println("°C"); if (t > 28) { // 度超过28°C时触发报警 digitalWrite(buzzerPin, HIGH); delay(1000); digitalWrite(buzzerPin, LOW); delay(1000); } } ``` 5. 上传代码: 将ESP8266通过USB连接到计算机,打开Arduino IDE,选择正确的开发板和端口,将代码上传到ESP8266中。 6. 测试: 将DHT11放置在需要检测的环境中,开启串口监视器,可以看到ESP8266每隔2秒钟会读取一次湿度数据并打印到串口中,当度超过28°C时,蜂鸣器会响起一次,表示触发了报警。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值