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

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


http://www.kler.cn/news/317700.html

相关文章:

  • 基于C#+SQL Server2005(WinForm)图书管理系统
  • 多边形抠图 python
  • python爬虫案例——抓取链家租房信息
  • IPsec-Vpn
  • 6、论文阅读:水下图像增强基准数据集及其他数据集
  • 【Godot4.3】三角形类
  • lunar无第三方依赖的公历、农历、法定节假日...日历工具库
  • 什么是单例模式?
  • 用最新的C++技术,如何实现一个序列化工具库?
  • CSS的盒子模型(Box Model)
  • 2024年最强网络安全学习路线,详细到直接上清华的教材!
  • sftp上传文件报错提示“Permission denied“
  • geodatatool(地图资源下载工具)3.8更新
  • JavaScript 网页设计案例详解( 最新技术趋势)
  • jmeter本身常用性能优化方法
  • JavaWeb校园二手交易平台
  • 统信服务器操作系统【qcow2 镜像空间扩容】方案
  • Stable Diffusion Fooocus批量绘图脚本
  • 【深度学习|地学应用】glacier——让我们一起看看深度学习在冰川研究中的应用是怎么样的呢?
  • 【ANTLR】核心语法标记
  • Vue + element-ui实现动态表单项以及动态校验规则
  • 数据库1-1、1-n 、n-n关系实际场景
  • 如何用Stable Diffusion XL模型,绘制精致的二次元插图,学完就能用!
  • Ansible部署与应用基础
  • Nginx的相关细节
  • 【Elasticsearch】-spring boot 依赖包冲突问题
  • dedecms靶场(四种webshell姿势
  • 如何使用 Visual Studio Code 将工作效率提升 200%
  • 封装Progress 组件
  • 爬虫到底难在哪里?