首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >OLED+MQTT 实现土壤 温湿度 线上线下展示

OLED+MQTT 实现土壤 温湿度 线上线下展示

作者头像
逍遥子大表哥
发布2025-07-28 19:12:31
发布2025-07-28 19:12:31
12200
代码可运行
举报
文章被收录于专栏:kali blogkali blog
运行总次数:0
代码可运行

本文为大家讲解基于MQTT协议和传感器的综合使用。希望对你的学习有所帮助。

实验目的

借助HA,实现随时随地的观看当前温度,湿度,以及土壤湿度。并借助OLED屏幕,实时显示,方便在现场检测数据。

接入HA

在现场用OLED屏幕展示

实验设备

  • esp8266
  • dht11温湿传感器
  • 土壤传感器
  • homeassistant
  • 其他备用(后期会用到舵机、继电器)

线路连接

显示器线路

VCC

--

3V3(+)

GND

--

GND(-)

SOA

--

D1

SCL

--

D2

DHT11线路

VCC

--

3V3(+)

GND

--

GND(-)

DATA

--

D5

土壤线路

VCC

--

3V3(+)

GND

--

GND(-)

A0

--

A0

代码

在烧写代码之前,我们需要安装部分库。

  • U8g2 (用于显示汉字)
  • DHT11

示例代码

代码语言:javascript
代码运行次数:0
运行
复制
#include <Arduino.h>  
#include <U8g2lib.h>  
#include <DHT.h>  
#include <ESP8266WiFi.h>
#include <PubSubClient.h> 
// 创建DHT传感器实例  
#define DHTPIN D5     // 连接DHT数据引脚到D1(GPIO5)  
#define DHTTYPE DHT11 // DHT 11  
int moistureSensorPin = A0; // 定义传感器连接的引脚
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif  
DHT dht(DHTPIN, DHTTYPE);  
  
// OLED显示屏设置  
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ D2, /* data=*/ D1, /* reset=*/ U8X8_PIN_NONE);  
/************ WIFI and MQTT 配置 ******************/
const char* ssid = "PDCN"; //type your WIFI information inside the quotes
const char* password = "1234567890";
const char* mqtt_server = "192.168.123.88"; #改为你的mqtt服务器
const char* mqtt_username = "admin";
const char* mqtt_password = "admin";
const int mqtt_port = 1883;
const char* mqtt_sensor_topic = "dht11"; #订阅主题
unsigned long last_send = 0; 

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {  
  // 初始化串口通信,方便调试  
  Serial.begin(115200);  
    
  // 初始化DHT传感器  
  dht.begin();  
  
  // 初始化OLED显示屏  
  u8g2.begin();  
  u8g2.enableUTF8Print(); 
  setupWifi();
  client.setServer(mqtt_server, mqtt_port);
}  

// 连接 Wifi
void setupWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {  

  if ( !client.connected() ) { // MQTT 是否连接成功
    reconnect();
  }
  if ( millis() - last_send > 5000 ) { // 每5秒发布一次温湿度数据
    handleTemperatureAndHumidity();
    last_send = millis();
  }
  client.loop();

  // 等待传感器稳定  
  delay(2000);  
  
  // 读取温度和湿度数据  
  float humidity = dht.readHumidity();  
  float temperature = dht.readTemperature();  
    
  // 检查是否读取失败,读取失败时返回NAN(不是一个数字)  
  if (isnan(humidity) || isnan(temperature)) {  
    Serial.println(F("Failed to read from DHT sensor!"));  
    return;  
  }  
  
  int moistureValue = analogRead(moistureSensorPin); // 读取传感器的模拟值
  // 将模拟值转换为土壤湿度百分比
  int moisturePercent = map(moistureValue, 1024, 0, 0, 100);
  // 清空显示缓冲区  
  u8g2.clearBuffer();  
  // 设置字体
  u8g2.setFont(u8g2_font_wqy12_t_gb2312);    
  // 设置文本颜色  
  u8g2.setDrawColor(1); // 白色    
  // 设置光标位置(注意:U8g2的坐标系统与Adafruit库可能不同)  
  u8g2.setCursor(0, 15);  
  // 显示温度和湿度数据(使用中文)  
  u8g2.print("温度: ");  
  u8g2.print(humidity);  
  u8g2.print(" %   ");  
  u8g2.setCursor(0, 30);  
  u8g2.print("温度: ");  
  u8g2.print(temperature);  
  u8g2.print(" ℃");  
  u8g2.setCursor(0, 45);  
  u8g2.print("土壤: ");  
  u8g2.print(moisturePercent);  
  u8g2.print(" %");  
    
  // 更新显示  
  u8g2.sendBuffer();  
    
  // 等待2秒再读取一次  
  delay(2000);  
}
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(mqtt_sensor_topic, mqtt_username, mqtt_password)) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

void handleTemperatureAndHumidity() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  int moistureValue = analogRead(moistureSensorPin); 
  int moisturePercent = map(moistureValue, 1024, 0, 0, 100);
  if (isnan(h) || isnan(t) ) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }
  // 准备JSON Payload
  String payload = "{";
  payload += "\"temp\":"; payload += t; payload += ",";
  payload += "\"humi\":"; payload += h;payload += ",";
  payload += "\"turang\":"; payload += moisturePercent;
  payload += "}";

  // 发送温湿度数据
  char attributes[100];
  payload.toCharArray( attributes, 100 );
  client.publish( mqtt_sensor_topic, attributes );
  Serial.println( attributes );
}

上传代码后,我们利用MQTT客户端进行测试。

上报数据为json格式

配置HA

在HA集成中添加MQTT

修改ha配置文件如下:

代码语言:javascript
代码运行次数:0
运行
复制
vim configuration.yaml

新增内容如下:

代码语言:javascript
代码运行次数:0
运行
复制
mqtt: 
 sensor: 
   - unique_id: Temperature 
     name: "Temp" 
     state_topic: "dht11" 
     suggested_display_precision: 1  
     unit_of_measurement: "℃ " 
     value_template: "{{ value_json.temp }}"
  - unique_id: Humidity 
     name: "Humi" 
     state_topic: "dht11" 
     suggested_display_precision: 1  
     unit_of_measurement: "% " 
     value_template: "{{ value_json.humi }}"

注意书写格式,空格一定要对齐。

完成配置后,重启HA

接下来,在实体中便可以看到当前设备了。

如果,想将数据入库。利用echar展示,我们可以参考下往期文章。

BREAK AWAY

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 kali笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实验目的
  • 实验设备
  • 线路连接
  • 代码
  • 配置HA
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档