“物联网开发实战”学习笔记-(五)根据土壤湿度、环境温湿度和光照强度自动浇花
研究场景需求
自动浇花这个场景,很明显是为了自动控制水泵,及时给植物补充水分。同时用户的目的并不只是浇水而已,他们真正想要的,是看到自己养的植物健康地生长。
植物生长需要的条件
环境温湿度条件
热带的植物无法忍受低温和干燥的环境条件,而温带植物遇到高温,也可能出现热衰竭的现象,所以环境的温度和湿度最好也能监控。
光照条件
植物进行光合作用,所以光照强度需要监控。
空气质量
对植物的生长来说也很重要,比如二氧化碳是否充足,有害气体是否超标等。
所以综合来看,我们需要监控的指标包括土壤湿度、环境温湿度和光照强度。
硬件电路
相应的传感器可以确定是土壤湿度传感器、环境温湿度传感器和光照传感器。
下面,我总结一下自动浇花器需要用到的材料:
1.NodeMCU ESP32 开发板(用WI-FI)
2.继电器,用于控制水泵的供电电路的通断。
3.水泵,用于从水箱中抽水,并送到花盆中。
4.电池盒,用于给水泵供电。
5.土壤湿度传感器
它可以测量花盆土壤的湿度,然后输出模拟信号。
6.环境温湿度传感器
它基于 DHT11 传感器,用于测量房屋中的温度和湿度,并且输出数字信号。它采用单总线(1-wire)接口与 NodeMCU 连接。
7.光照传感器,它可以测量花盆位置接收到的光照条件。
8.面包板和杜邦线。
课程给出的一个电路图,方便了解整个自动浇花器的设备组成。
软件实现
接下来还是使用 Python 语言来完成软件的开发工作。
继电器
继电器的控制。主要是改变了连接的 GPIO 管脚。根据硬件电路的连线,这里使用的是 GPIO23 管脚。
参考代码它连接的管脚是 GPIO23):
## !!!本文件采用商城的继电器模块FL-3FF-S-Z
## !!!on(), off()状态相反。
## !!!初始化中需要调用on()先关闭水泵电路
from machine import Pin
class Relay():
ON = 0
OFF = 1
def __init__(self, pin):
self.relaypin = Pin(pin, Pin.OUT)
self.relaypin.on()
self.last_status = self.OFF
def set_state(self, state):
tmp_state = self.ON if state==1 else self.OFF
self.relaypin.value(tmp_state)
self.last_status = tmp_state
def state(self):
return self.last_status
def on(self):
self.relaypin.value(self.ON)
self.last_status = self.ON
def off(self):
self.relaypin.value(self.OFF)
self.last_status = self.OFF
土壤湿度传感器
土壤湿度传感器。它会根据不同的电阻值,输出变化的模拟信息,数值越小,说明越干燥。使用的时候,你需要把它完全插入花盆的土壤中。
参考代码(它连接的管脚是 GPIO34):
from machine import ADC
from machine import Pin
class SoilSensor():
def __init__(self, pin):
self.sensor = ADC(Pin(pin))
def value(self):
value = self.sensor.read()
print("Sensor ADC value:",value)
return int(value*100/4095)
环境温湿度传感器
环境温湿度传感器是基于 DHT11 实现的,并且使用的是单总线的连接方式,我们可以直接使用。
参考代码(它连接的管脚是 GPIO14):
import dht
from machine import Pin
class EnvSensor():
def __init__(self, pin):
self.sensor = dht.DHT11(Pin(pin))
def value(self):
self.sensor.measure()
return (self.sensor.temperature(), self.sensor.humidity())
光照传感器
光照传感器
参考代码(它连接的管脚是 GPIO36):
from machine import ADC
from machine import Pin
class IllumSensor():
def __init__(self, pin):
self.sensor = ADC(Pin(pin))
def value(self):
value = self.sensor.read()
print("Sensor ADC value:",value)
return int(value/4095*600
完成联网开发
将设备接入腾讯云物联网平台。可以参考前面的分享。
自动浇花器的物模型 JSON 文件,提供参考。
{
"version": "1.0",
"profile": {
"ProductId": "你的ProductID",
"CategoryId": "909"
},
"properties": [
{
"id": "power_switch",
"name": "水泵开关",
"desc": "控制水泵启动关闭",
"mode": "rw",
"define": {
"type": "bool",
"mapping": {
"0": "关",
"1": "开"
}
}
},
{
"id": "water_shortage",
"name": "缺水状态",
"desc": "水箱是否缺水",
"mode": "r",
"define": {
"type": "bool",
"mapping": {
"0": "否",
"1": "是"
}
}
},
{
"id": "humidity",
"name": "土壤湿度",
"desc": "当前的土壤湿度",
"mode": "r",
"define": {
"type": "int",
"min": "0",
"max": "100",
"start": "0",
"step": "1",
"unit": "%"
}
},
{
"id": "env_temp",
"name": "环境温度",
"desc": "空间环境的温度",
"mode": "r",
"define": {
"type": "float",
"min": "-40",
"max": "100",
"start": "0",
"step": "0.1",
"unit": "℃"
},
"required": false
},
{
"id": "env_hum",
"name": "环境湿度",
"desc": "周围环境的湿度",
"mode": "r",
"define": {
"type": "int",
"min": "0",
"max": "100",
"start": "0",
"step": "1",
"unit": "%"
},
"required": false
},
{
"id": "env_illum",
"name": "环境光照度",
"desc": "周围环境的光照度",
"mode": "r",
"define": {
"type": "int",
"min": "0",
"max": "6000",
"start": "0",
"step": "1",
"unit": "lux"
},
"required": false
}
],
"events": [],
"actions": []
}
多传感器融合
在测量过程中,我们可以使用多个土壤传感器进行测量,然后根据多个测量值来计算出更可靠的土壤水分含量。这个计算过程就是多传感器融合。
多传感器融合最关键的地方,不是多个传感器的硬件连接或数据收集,而是融合算法,也就是怎么进行多个不同维度的参数的处理,从而得到一个相对准确的、有意义的数据信息。
这个就是物联网的应用层的工作模块,根据传感器反馈回来的大量的数据通过训练构建模型,这个过程其实体现了人工智能与物联网的融合点。