由于过年回家时间长,家里养的鱼没人喂,自己又想DIY一个。决定动手搞一个,搞之前也看了几个其他视频教程,参考着结合自己身边的废品做了一个,先上图
![](https://img-blog.csdnimg.cn/img_convert/afed2b716946461357c3bdc74a2a62ef.jpeg)
![](https://img-blog.csdnimg.cn/img_convert/14b74a7babff8dcc20235a8a67c6b7cb.jpeg)
![](https://img-blog.csdnimg.cn/img_convert/fa22a5d47d7914c19fd32210850a3d7e.jpeg)
使用物品:
esp8266+电机驱动板+tt电机(从地盘拆下来的)
三通水管接口(鱼缸过滤剩下的)、弹簧(从洗洁精上拆的)、口径8mm水管 一段(也可以用别的替代)
安卓手机+ioT MQTT Panel 软件
云服务器 部署MQTT服务器(如果不需要联网的话,也可以不使用)
实现了点击喂鱼按钮就可以驱动电机,把食物推到鱼缸,随时随地都可以喂鱼啦
代码部分
from umqtt.robust import MQTTClient
from machine import Pin
import machine
import network
import time
import utime
from machine import Timer
client_id = "slim_id"
mserver = '14.21.127.73'
port=6008
mq_user='xxx'
mq_password='xx'
topic_ctl = b'lot_ctl'#设备订阅的主题,客户端推送消息的主题
topic_sta = b'lot_sta'#客户端订阅的主题,设备推送消息的主题
client = None
SSID = "CU_11111111111"
PASSWORD = "7e7hecz5111111111111111"
def dianjiA(status):
D1 = Pin(5,Pin.OUT)
D3 = Pin(0,Pin.OUT)
if status:
print('打开电机...')
D1.value(1)
D3.value(1)
else:
print('关闭电机...')
D1.value(0)
D3.value(0)
def feedFish():
dianjiA(True)
utime.sleep_ms(200)
dianjiA(False)
def do_connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect(SSID, PASSWORD)
start = time.ticks_ms() # get millisecond counter
while not wlan.isconnected():
time.sleep(1) # sleep for 1 second
if time.ticks_ms()-start > 20000:
print("connect timeout!")
break
if wlan.isconnected():
print('Connected! network config :', wlan.ifconfig())
def reconnect(): #重启开发板
print('Failed to connect to MQTT broker. Reconnecting...')
time.sleep(5)
client.reconnect()
def sub_callback(topic, cmd):
"""
收到订阅消息回调
"""
global client
print((topic_ctl, cmd))
print(cmd)
if cmd == 1 or cmd == b'1':
pub_msg = 'LED1: ON-state'
feedFish()
elif cmd == b'led1 OFF' or cmd == b'led1 off':
pub_msg = 'LED1: OFF-state'
elif cmd == b'led2 ON' or cmd == b'led2 on':
pub_msg = 'LED2: ON-state'
elif cmd == b'led2 OFF' or cmd == b'led2 off':
pub_msg = 'LED2: OFF-state'
else:
pub_msg = 'other msg'
client.publish(topic_sta, pub_msg, retain=True)
def connectMQTT():
client = MQTTClient(client_id, mserver, port, user=mq_user, password=mq_password,keepalive=60)
client.set_callback(sub_callback)
client.DEBUG = True
if not client.connect(clean_session=False):
print("New session being set up")
client.subscribe(topic_ctl)
client.publish(topic_sta, 'ESP32 Device online', retain=True)
print("Connected to %s, subscribed to %s topic" % (mserver, topic_ctl))
return client
# except OSError as e:
# print(e)
# print('off line')
# restart_and_reconnect()
# finally:
# if client is not None:
# print('off line')
# client.disconnect()
#do_connect()
# 若能连接到 broker,调用 connect(),反之调用 reconnect()
def keepLiveTimeCb(client):
print("ping....")
client.ping()
do_connect()
try:
do_connect()
client = connectMQTT()
tim = Timer(-1)
keepLiveTime = 30
tim.init(period=keepLiveTime*1000, mode=Timer.PERIODIC, callback=lambda t: keepLiveTimeCb(client))
while True:
client.wait_msg()
time.sleep(5)
except OSError as e:
reconnect()
finally:
if client is not None:
print('off line')
client.disconnect()