一个综合实验:树莓派+DHT22+QVGA TFT显示温湿度

最近完成了这么一个综合性的实验:树莓派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。

一切正常的话重启后就会自动执行了!找了个纸盒子稍微包装了一下。内部是这样子的:


放DHT22的地方要挖个孔,不然树莓派自身发热会有点影响采集数据的正确性。

猜你喜欢

转载自blog.csdn.net/ki1381/article/details/79910581