水质监控系统
用FireBeetle ESP32-E开发板作为控制单元,观察养殖水质参数(温度/浊度/tds/pH值/电位/溶解氧中两项指标以上)的变化,并能把数据上传到IoT网站上,可实时动态显示监测水质的变化情况。
· 硬件介绍
主控板:
FireBeetle 2 ESP32-E IoT 开发板(预焊排母版)
https://www.dfrobot.com.cn/goods-3048.html 货号 DFR0654-F
FireBeetle ESP32-E支持支持WIFI和蓝牙,具有体积小巧、超低功耗、板载充电电路、接口易用等特性。可灵活的用于家庭物联网改装、工业物联网改装、可穿戴设备等等。
特性
- ESP32双核低功耗主控,功耗低至2mA
- WiFi+BT4.0无线双模模组
- GDI显示接口,单线连接显示屏 (手头没有GDI接口屏幕,用了1602液晶屏)
- 板载充电电路以及PH2.0锂电池接口
外设:
Gravity: 模拟水质浊度传感器 https://www.dfrobot.com.cn/goods-1225.html
Gravity: 18B20 防水温度传感器套件 https://www.dfrobot.com.cn/goods-799.html
其中模拟水质浊度传感器利用光学原理,通过测量溶液中的透光率和散射率来综合判断溶液浊度情况,从而达到检测水质的目的。传感器内部是一个红外线对管,当光线穿过一定量的水时,光线的透过量取决于该水的污浊程度,水越污浊,透过的光就越少。
传感器可以用于洗衣机、洗碗机,鱼缸等产品的水污浊程度的测量。通过测量水的污浊程度来判断溶液的洁净程度,确定最佳的换水时间,达到减少能耗和节约用水的目的。也可以用于河流,污水的测量,澄清池检测和水质研究等等。
传感器提供模拟信号和数字信号两种输出模式。兼容Gravity 3-Pin接口,可直连Arduino扩展版,免除二次接线的麻烦,简单实用。本次项目使用模拟方式采集输出的数据,并且输出到物联网MQTT平台。
防水18B20温度传感器和Arduino结合可以用到很多地方,比如土壤温度检测、热水箱温度控制等等,但是防水的18B20温度传感器必须还要接一个上拉电阻才能使用,为此DFROBOT设计的Plugable Terminal转换器就派上用场了。
Plugable Terminal转接器数字口增加了上拉电阻,使用跳线帽切换使用,这样可以直接将防水18B20温度传感器连接到Arduino上了。使用温度范围:-55 to 125°C (-67°F to +257°F)
这个传感器是数字输出的,使用数字方式采集输出的数据,可以直接得到温度,十分方便。
· 设计思路
FireBeetle ESP32-E可以用ArduinoIDE,Scratch,MicroPython编程。本次项目开发,使用了简单易用的MicroPython编程。
任务内容是:
水质监控系统
用FireBeetle ESP32-E开发板作为控制单元,观察养殖水质参数(温度/浊度/tds/pH值/电位/溶解氧中两项指标以上)的变化,并能把数据上传到IoT网站上,可实时动态显示监测水质的变化情况。
这次选择了温度/浊度两项数据采集并上传,本来还有个一氧化碳传感器,到手后发现不是可以水里用的,泡水就完蛋了,于是放弃了一氧化碳传感器,只采集温度/浊度。
· 本期指定完成任务的功能演示
b. 项目总结报告(放在电子森林项目的描述处)
· 项目描述
本期项目使用MicroPython开发,使用MicroPython开发上传固件一次后再上传代码,不需要编译,开发调试速度比较快一些,但是执行效率不是很高,但是在这个小项目中性能是足够了。
首先要上传MicroPython固件。
不过我用这种方式失败了,不知道什么原因,后来直接用ThonnyIDE写入固件。进入Thonny工具选项中。点击箭头所示链接。
选择固件文件,选择正确的端口。按照箭头所示数据配置,然后点击安装。。
安装完成后,IDE的shell进入三个>的提示环境,说明固件上传成功。
使用IDE打开这两个文件,然后保存到ESP32上。这两个文件分别是屏幕的支持库文件和MQTT的支持库文件。
根据 MQTT数据修改源码中对应内容,比如地址端口,客户端ID,topic
修改后运行应该能提示连接网络信息和采集到的数据。
连接后就开始采集温度和浊度数据。
如果订阅了这个主题,也可以得到相应的温度和浊度数据。
各功能对应的主要代码片段及说明
初始化配置
from umqttsimple import MQTTClient
from machine import ADC,Pin, SoftI2C
import ds18x20
import machine,onewire,time,network
from lib_lcd1602_2004_with_i2c import LCD
# MQTT配置信息
mqtt_client_id = 'mqttx_999'
mqtt_server_ip = '192.168.10.2'
mqtt_server_port = '1883'
mqtt_topic = 'test001'
scl_pin = 22
sda_pin = 21
lcd = LCD(SoftI2C(scl=Pin(scl_pin), sda=Pin(sda_pin), freq=100000))
# 温度传感器初始化
ds_pin = Pin(13)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()
# print('发现设备: ', roms)
# 获取当前温度
def read_ds_sensor():
ds_sensor.convert_temp()
for rom in roms:
temp = ds_sensor.read_temp(rom)
if isinstance(temp, float):
temp = round(temp, 2)
return temp
return 0
# 链接WIFI联网
def wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('ceshi', '88888888') #配置wifi
i = 1
while not wlan.isconnected():
print("正在链接...{}".format(i))
i += 1
time.sleep(1)
print('network config:', wlan.ifconfig())
# MQTT建立链接
def mqtt_init():
# 建立一个MQTT客户端
mqtt_client = MQTTClient(mqtt_client_id, mqtt_server_ip, mqtt_server_port)
# 设置回调函数
# mqtt_client.set_callback(mqtt_sub)
# 建立连接
mqtt_client.connect()
# 监控ledctl这个通道,接收控制命令
# mqtt_client.subscribe(mqtt_topic)
return mqtt_client
# MQTT回调函数,收到服务器消息后会调用这个函数
def mqtt_sub(topic, msg):
print('收到服务器信息')
print(topic, msg)
主要代码,很简单吧?
wifi()
mqtt_client = mqtt_init()
while True:
current_temp ="temp:"+ str(read_ds_sensor())
turbidity = "turbidity:"+str(read_ADC())
print(current_temp)
print(turbidity)
lcd.puts(current_temp,0)
lcd.puts(turbidity,1)
mqtt_client.publish(mqtt_topic, current_temp)
mqtt_client.publish(mqtt_topic, turbidity)
time.sleep(2)
· 功能展示及说明(可右上角点“上传”插入图片进行展示并说明)
· 对本活动的心得体会(包括意见或建议)
文章提交编辑器有问题吧?提交时候提示什么ID=0,然后就失败了,再进入就啥都没了!还得重新编辑,好麻烦啊。
为什么上传标题图片也总失败?
c. 可编译下载的代码,在附件中。。