在前面的文章中,我们讲到了基于Arduino读取水质传感器的数据。详情可以阅读历史文章。
但由于Arduino的限制,无法将数据上传至网络。因此,本文为大家带来基于Esp8266配置水质传感器进行数据上报。
VCC
--3.3v
GND
--GND
信号线
--A0
(模拟脚针)
#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秒间隔
}
代码功能说明:
shuizhi
主题。数据格式说明:
发送数据为json数据,格式如下:
{"TDS":21,"DJ":"优"}
前者为上报的TDS数据,后者是当前的数据等级。
另外,当前仅为一个数据,如果您有多个设备,如用DHT11
接入温湿度数据,可以将拼接为完整的jons数据,如:
{"humi":58,"temp":36,"TDS":500,"DJ":"差"}
因为是基于MQTT上报数据,我们可以将数据接入HA或者微信小程序。
矿泉水效果
自来水数据
在后期,我们会更新其他类型的传感器。方便硬件爱好者学习和研究。当然,如果您有更好的方法,请在评论区留下你精彩的评论。
BREAK AWAY