首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于ESP8266水质检测 (MQTT上报小程序和HA)

基于ESP8266水质检测 (MQTT上报小程序和HA)

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

在前面的文章中,我们讲到了基于Arduino读取水质传感器的数据。详情可以阅读历史文章。

但由于Arduino的限制,无法将数据上传至网络。因此,本文为大家带来基于Esp8266配置水质传感器进行数据上报。

准备

  • Esp8266
  • 水质传感器
  • MQTT服务器

线路连接

VCC--3.3v

GND--GND

信号线--A0(模拟脚针)

代码

代码语言:javascript
代码运行次数:0
运行
复制
#include<ESP8266WiFi.h>
#include<PubSubClient.h>
#include<ArduinoJson.h>

// WiFi配置
constchar* ssid = "你的WiFi名称";
constchar* password = "WiFi密码";

// MQTT配置
constchar* mqtt_server = "MQTT服务器地址";
constint mqtt_port = 1883;
constchar* mqtt_user = "admin";
constchar* mqtt_password = "admin";
constchar* topic = "shuizhi"; #订阅主题

// 传感器配置
constint TDS_PIN = A0;  // ESP8266只能使用A0进行模拟输入
constfloat VREF = 3.3;  // 传感器工作电压
constfloat K = 0.4;     // 校准系数

WiFiClient espClient;
PubSubClient client(espClient);

voidsetup_wifi(){
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

voidreconnect(){
while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("esp8266-SZ", mqtt_user, mqtt_password)) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

String getWaterQuality(float tds){
if (tds <= 9) return"优";       // 0-9 mg/L 纯净水
elseif (tds <= 60) return"优";  // 10-60 mg/L 山泉水、矿化水
elseif (tds <= 100) return"中"; // 60-100 mg/L 净化水
elseif (tds <= 300) return"中"; // 100-300 mg/L 普通自来水
elsereturn"差";                // >300 mg/L 可能存在污染
}

voidsetup(){
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
}

voidloop(){
if (!client.connected()) {
    reconnect();
  }
  client.loop();

// 读取并计算TDS值
int analogValue = analogRead(TDS_PIN);
float voltage = analogValue * VREF / 1024.0;
float tdsValue = (133.42 * pow(voltage, 3) - 255.86 * pow(voltage, 2) + 857.39 * voltage) * K;

// 获取水质等级
  String quality = getWaterQuality(tdsValue);

// 构建JSON数据
  StaticJsonDocument<200> doc;
  doc["TDS"] = round(tdsValue);  // 四舍五入取整
  doc["DJ"] = quality;

char jsonBuffer[512];
  serializeJson(doc, jsonBuffer);

// 发布MQTT消息
  client.publish(topic, jsonBuffer);

  Serial.print("Published: ");
  Serial.println(jsonBuffer);

  delay(5000);  // 5秒间隔
}

代码功能说明:

  • 每5s上传数据到shuizhi主题。
  • 对数据进行处理,分为优、中、差

数据格式说明:

发送数据为json数据,格式如下:

代码语言:javascript
代码运行次数:0
运行
复制
{"TDS":21,"DJ":"优"}

前者为上报的TDS数据,后者是当前的数据等级。

另外,当前仅为一个数据,如果您有多个设备,如用DHT11接入温湿度数据,可以将拼接为完整的jons数据,如:

代码语言:javascript
代码运行次数:0
运行
复制
{"humi":58,"temp":36,"TDS":500,"DJ":"差"}

接入HA或小程序

因为是基于MQTT上报数据,我们可以将数据接入HA或者微信小程序。

矿泉水效果
矿泉水效果

矿泉水效果

自来水数据
自来水数据

自来水数据

总结

在后期,我们会更新其他类型的传感器。方便硬件爱好者学习和研究。当然,如果您有更好的方法,请在评论区留下你精彩的评论。

BREAK AWAY

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备
  • 线路连接
  • 代码
  • 接入HA或小程序
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档