最近完成了这么一个综合性的实验:树莓派Zero W用DHT22检测温湿度,并在2.2寸QVGA TFT上显示出来。编程语言用的Python。
总的思路是:DHT22获取温湿度数据,然后用Python语言生成一张QVGA分辨率的图片,显示在TFT上。因为我还不知道怎么直接在TFT上写字,只会显示整张图片,所以暂时只能把温湿度数据的打印在图片上整体输出。这样做最大的缺点就是要比较频繁的生成图片文件(尽管可以保存到tmpfs文件系统中),并且在刷新时可能有闪烁感。
所以分解任务的话,需要实现以下几个功能:
1、DHT22的使用(Python)
2、使用Python生成自定义图片(把静态的图标PNG和动态生成的文字打印在输出图片上)
3、使用QVGA TFT显示图片
4、定时调用python脚本
5、开机自动运行脚本
一个个解决。
第一个问题相对好办。
参考https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/software-install-updated。核心步骤是:
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install(或sudo python3 setup.py install,如果使用python3)
Python核心代码:数据线接在BCM编码的GPIO引脚4上(物理引脚PIN7)
import Adafruit_DHT
# Sensor
sensor = Adafruit_DHT.DHT22
pin = '4'
humi, temp = Adafruit_DHT.read_retry(sensor, pin)
# If this happens try again!
if humi is not None and temp is not None:
#print('Temp={0:0.1f}* Humi={1:0.1f}%'.format(temp, humi))
TempShow = '{0:0.1f}'.format(temp)
HumiShow = '{0:0.1f}'.format(humi)
#print(TempShow)
#print(HumiShow)
else:
print('Failed to get reading. Try again!')
sys.exit(1)
第二个问题也好解决。核心代码为:
#生成输出图,先产生纯蓝背景图
bkimg = Image.new('RGBA',(320,240),(0,0,255))
#载入温度图标
icoTemp = Image.open('/home/pi/t1.png')
#载入湿度图标
icoHumi = Image.open('/home/pi/h1.png')
#黏贴到输出图的指定位置上
bkimg.paste(icoTemp,(20,60))
bkimg.paste(icoHumi,(20,140))
#定义温湿度显示字体
ft2 = ImageFont.truetype('/usr/share/fonts/truetype/freefont/FreeSans.ttf',56)
draw = ImageDraw.Draw(bkimg)
#打印数值到指定位置上
draw.text((110,65),TempShow + ' C',fill=(255,255,255),font=ft2)
draw.text((110,145), HumiShow + ' %',fill=(255,255,255),font=ft2)
#保存最终输出图片
bkimg.save('/run/a.png','PNG')
#清理
bkimg.close()
icoTemp.close()
icoHumi.close()
#显示到QVGA
#详细解释请参考问题三给出的链接
os.system('sudo fbi -d /dev/fb1 -T 1 -noverbose -a /run/a.png')
第三个问题有点小复杂,请参考https://blog.csdn.net/ki1381/article/details/79351641。
第四个问题很简单,编写一个bash,名叫ki,+rx权限。用于实现每30秒调用一次python脚本:
#!/bin/sh
while :
do
sudo python3 /home/pi/showDHT22.py
sleep 30
done
第五个问题又有点小复杂。我试过rc.local方式,没用,所以最后采用了update-rc.d方式。
具体来说,cd /etc/init.d,并在下面建立一个脚本,名叫ki22,需要+rx权限:
#!/bin/sh
#/etc/init.d/ki22
### BEGIN INIT INFO
# Provides: ki22
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: KIDHT22
# Description: Start DHT22
### END INIT INFO
case "$1" in
start)
/home/pi/ki &
;;
stop)
;;
*)
echo "Usage: service ki22 start|stop"
exit 1
;;
esac
exit 0
那些###段内的貌似注释的内容都是有用的,最好都能保留,并根据实际情况做出修改。
最后注册ki22:
sudo update-rc.d /etc/init.d/ki22 defaults 99。
一切正常的话重启后就会自动执行了!找了个纸盒子稍微包装了一下。内部是这样子的: