用树莓派4B做一个鱼缸水位报警
2019-08-07Linux
因为最近要出门一段时间,鱼缸没人照顾,树莓派的第一个实用需求出现了。
准备做一个液位报警仪,当鱼缸水位低于报警水位,发一封邮件给我,我就能在微信上收到通知,从而远程控制给鱼缸加水,防止鱼缸循环泵烧坏。
<video src="/images/20190807_raspberrypi_fish.mp4" controls="controls" width="70%" style="margin:24px auto;display: block;"></video>
使用GPIO接口控制硬件和接收传感器的数据,实现过程如下:
<!--more-->GPIO介绍
树莓派的一个强大功能是沿着电路板顶部边缘的一排GPIO(general-purpose input/output)引脚。 树莓派4B板上有一排40针GPIO接头。

主板上有两个5V引脚和两个3V3引脚,以及一些不可配置的接地引脚(0V)。 其余引脚均为通用3V3引脚,意味着输出设置为3V3,输入为3V3容差。
输出
指定为输出引脚的GPIO引脚可以设置为高(3V3)或低(0V)。
输入
指定为输入引脚的GPIO引脚可以读为高(3V3)或低(0V)。 使用内部上拉或下拉电阻可以更轻松地实现这一点。 引脚GPIO2和GPIO3具有固定的上拉电阻,但对于其他引脚,可以使用软件配置。
其它
除了简单的输入和输出设备外,GPIO引脚还可以使用多种替代功能,一些可用于所有引脚,另一些则可用于特定引脚。如:PWM、SPI、I2C、串行
装备
- 面包板:用于免焊接线,边上两排是竖向连接的,中间是横向连接的。用杜邦线插入孔中就可以便捷接线了。

- GPIO扩展版:可以方便地将所有GPIO接到面包板上

- LED二极管:用于展示状态

- 干簧管液位计:用于监测液位,其原理是浮球中有磁铁,可以磁化干簧管,从而短路电路

接线
LED一端接GPIO17号引脚,一端接地。
液位开关一端接GPIO2号引脚,一端接地。

编程
这里我使用GPIO Zero
这是一个Python的GPIO库,树莓派默认已经安装了,可以直接使用。
核心脚本如下:
from gpiozero import LED
from gpiozero import Button
from time import sleep
led = LED(17) #1
button = Button(2) #2
while True:
sleep(0.5) #3
if button.is_pressed: #4
led.on()
else:
led.off()
- 创建一个LED模式的GPIO口用于展示状态
- 创建一个Button模式的GPIO口
- 每0.5秒检测一次
- 开关打开则点亮LED,否则关闭LED
Python发送邮件
#coding=utf-8
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
import time
#邮箱smtp服务器
host_server = 'smtp.exmail.qq.com'
#sender用户名
sender_user = 'wangyu@wycode.cn'
#邮箱登录密码
sender_pwd = '**********'
#发件人的邮箱
sender_mail = sender_user
#收件人邮箱
receiver = sender_user
#邮件的正文内容
mail_content = '【水位警报】过低\n时间:'+time.strftime( '%Y-%m-%d %X', time.localtime())
#邮件标题
mail_title = '【水位警报】过低'
#ssl登录
smtp = SMTP_SSL(host_server)
#set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
smtp.set_debuglevel(1)
smtp.ehlo(host_server)
smtp.login(sender_user, sender_pwd)
msg = MIMEText(mail_content, "plain", 'utf-8')
msg["Subject"] = Header(mail_title, 'utf-8')
msg["From"] = sender_mail
msg["To"] = receiver
smtp.sendmail(sender_mail, receiver, msg.as_string())
smtp.quit()