ESP32自动浇花项目

1. ESP32刷入micropython固件

1. 本机安装python环境

python下载地址:https://www.python.org/downloads/

2. 安装工具

pip install esptool
pip install pyserial

3. 擦除所有的flash

esptool --port COM3 erase_flash

4. 固件下载

固件下载https://micropython.org/download/esp32/

5. 写入固件

# COM3连结串口号   # ESP32_GENERIC-20231005-v1.21.0.bin固件名称
esptool --chip esp32 --port COM3 write_flash -z 0x1000 ESP32_GENERIC-20231005-v1.21.0.bin

6. 验证固件已刷入

# 呼吸灯测试
# 开发板上的蓝色小灯会由暗——明——暗
from machine import Pin, PWM
import time

# 使用 ESP32 的板载 LED。大多数 ESP32 开发板的板载 LED 连接到 GPIO2。
LED_PIN = 2

# 创建一个 PWM 对象
led = PWM(Pin(LED_PIN), freq=1000)

def breath():
    while True:
        # 逐渐增加亮度
        for duty in range(0, 1024, 10):
            led.duty(duty)
            time.sleep(0.01)
        
        # 逐渐减少亮度
        for duty in range(1023, -1, -10):
            led.duty(duty)
            time.sleep(0.01)

breath()

2. 使用Thonny编程

1. 连接电路,测试程序

# 使用GPIO15接收传感器模块数字量
# 使用GPIO33接收传感器模拟量
# 打印湿度值
from machine import Pin, ADC
import time


pin15 = Pin(15, Pin.IN) # 15引脚接受传感器数字量
pin33 = ADC(Pin(33))    # 33引脚接收传感器模拟量
pin33.atten(ADC.ATTN_11DB)  # 这里配置测量量程为3.3,传感器供电3.3v

while Ture:
    print(pin15.value(), pin33.read()) # 0-4095
    time.sleep(0.5)

2. 连接继电器模块,并测试

# 使用GPIO15接收传感器模块数字量
# 使用GPIO33接收传感器模拟量
# 使用GPIO13输出数字量至继电器,控制其动作

from machine import Pin, ADC
import time


# pin15 = Pin(15, Pin.IN) # 15引脚接受传感器数字量
pin33 = ADC(Pin(33))    # 33引脚接收传感器模拟量
pin13 = Pin(13, Pin.OUT)# 13引脚输出到继电器

pin33.atten(ADC.ATTN_11DB)  # 这里配置测量量程为3.3,传感器供电3.3v
pin13.value(0)  # 默认继电器不动作

while True:
    value= pin33.read()  # 读取湿度值0-4095
    print("湿度值(湿0—4095干燥):{}".format(value))

    if value > 3000:
        print("检测到湿度值为{},已经很干燥了,准备倒计时".format(value))
        for i in range(3, 0, -1):
            print("倒计时{}".format(i))
            time.sleep(1)
        
        pin13.value(1)
        while pin33.read() > 2000:
            print("正在抽水灌溉中...当前湿度值:{}".format(pin33.read()))
            time.sleep(0.5)
        pin13.value(0)
        print("已完成灌溉...抽水机停止工作")
    time.sleep(1) # 每xx分钟检测一次.1为测试值1s
# 最终代码:
# 使用GPIO33接收传感器模拟量
# 使用GPIO13输出数字量至继电器,控制其动作
from machine import Pin, ADC
import time


pin33 = ADC(Pin(33))    # 33引脚接收传感器模拟量
pin13 = Pin(13, Pin.OUT)# 13引脚输出到继电器

pin33.atten(ADC.ATTN_11DB)  # 这里配置测量量程为3.3,传感器供电3.3v
pin13.value(0)  # 默认继电器不动作

while True:
    value= pin33.read()  # 读取湿度值0-4095
    print("湿度值(湿0—4095干燥):{}".format(value))

    if value > 3000:
        print("检测到湿度值为{},已经很干燥了,准备倒计时".format(value))
        for i in range(3, 0, -1):
            print("倒计时{}".format(i))
            time.sleep(1)
        
        pin13.value(1)  # 开启灌溉,继电器动作
        while pin33.read() > 2000:
            print("正在抽水灌溉中...当前湿度值:{}".format(pin33.read()))
            time.sleep(0.5)
        pin13.value(0)    # 灌溉停止,将继电器复位。
        print("已完成灌溉...抽水机停止工作")
    time.sleep(900) # 每15分钟检测一次

3. 改进

可以改进的地方。

  1. 在倒计时可以设置为15秒,15秒后再次检测湿度值,如果湿度值还是大于设定值,再开始浇水
  2. 我这个花盆较小,浇水时候可以设置每浇水2秒,等待10秒再检测湿度值。
  3. 统计浇水时间,并记录到mqtt服务器。
  4. 将湿度值传输到mqtt服务器,并且能远程手动浇水。
上一篇
下一篇