远程控制LED/天气站/消息显示屏(第一部分 - Raspberry Pi)






4.98/5 (35投票s)
一个小项目,为我的儿子带来惊喜
引言
我一直在玩树莓派和电子产品,我的四岁的儿子偶尔会来我的桌子玩耍,将红色、黄色和绿色的LED插在面包板上。他称它们为“交通灯”,所以我想,为什么不为他做一个可以在圣诞节使用的东西呢!
以下是我决定设备的功能
- 一个可通过手机App控制的交通灯,可以模拟交通灯/行人灯的顺序,也可以手动开启/关闭
- 一些实用的功能,如20字符x4行屏幕,显示
- 日期和时间
- 温度和湿度
- 一个由App控制的消息(2行x20字符)
本教程旨在涵盖以下技术
- 使用Python和Flask的简单Pi HTTP服务器
- 运行在Pi上的超轻量级SQLite数据库
- 使用DHT22传感器通过树莓派读取温度和湿度。详情请参见此处。
- 使用廉价的带I2C接口的20x4 LCD显示屏。详情请参见此处。
- 使用Xamarin构建一个简单的移动App,该App向Pi HTTP服务器发送命令。我将使用Xamarin Forms,这是一个非常方便的跨平台(iOS/Android/Windows移动)框架。
这是用乐高和App精心包装的最终成品。
电路图
由于20x04 LCD需要5V而树莓派的数字输入接受3.3V,因此需要一个3.3V/5V逻辑转换器。
一个大版本在这里。
Using the Code
已开发两个进程在树莓派上运行。
- weather.py - 这是一个有限的循环,它
- 获取并显示温度和湿度,并将它们保存到数据库
- 在LCD上显示日期和时间
- 启动时显示IP地址,以便App能够轻松找到它
- weatherwww.py - 一个Flask Python应用程序,它
- 监听天气请求命令,从数据库读取并返回它们
- 监听交通灯控制命令
- 监听消息显示命令并在LCD上显示它们
假设代码将从/home/pi/weather运行。
运行weather.py
让我们从weather.py开始,有一些先决条件需要安装。
该代码假定您在树莓派上运行的是Raspbian Wheezy或更高版本。
旧版本可能需要手动安装Python GPIO库。
sudo apt-get install python-dev python-rpi.gpio
Adafruit_DHT
- 用于读取温度和湿度的库。在树莓派上运行以下命令来安装该库。完整详情请参见此处。sudo apt-get update sudo apt-get install build-essential python-dev
sudo python setup.py install
- 安装
sqlite3
- SQLite是一个非常轻量级的、基于文件的SQL数据库。sudo apt-get install sqlite3
创建数据库文件和表。
sqlite3 weather.db
在SQLite提示符下,创建表
sqlite> CREATE TABLE weather (timestamp DATETIME, temperature REAL, humidity REAL);
- 安装I2C 2004显示屏所需的工具(或此处的详细说明)
启用I2C
sudo raspi-config
- 选择“Advanced Options”。
- 选择“I2C”。
- 选择“Yes”。
安装工具
sudo apt-get update
sudo apt-get install -y python-smbus i2c-tools
重启
sudo reboot
按照原理图连接I2C 2004显示屏。通过运行以下命令查找其地址。在我的情况下,我获得了0x27。
sudo i2cdetect -y 1
编辑lcd_i2c.py以反映您获取的地址
#for 2004
I2C_ADDR = 0x27
此时,运行weather.py的所有先决条件都应该准备就绪。尝试运行以下命令(gpio
访问需要sudo
)。
sudo python weather.py
如果一切顺利,您应该在2004 LCD上看到类似以下的显示,显示日期时间、温度、湿度和IP地址(第3行将显示eth0
,第4行将显示wlan0
)。
运行weatherwww.py
weatherwww.py是一个Flask Web应用程序。Flask是一个Python框架,它允许您轻松快速地编写用Python编写的Web服务/动态网页。提供了一个快速入门指南。
要安装Flask,最快的方法是运行以下命令。您也可以在virtualenv下运行它。
sudo pip install Flask
要运行weatherwww.py Web应用(使用内置的Flask Web服务器),请运行以下命令
cd /home/pi/weather
export FLASK_APP=weatherwww.py
flask run --host=0.0.0.0
运行上述命令后,它应该会显示类似以下内容:
使用浏览器,测试Flask webapp
是否正常工作(将192.168.11.115替换为您的Pi的IP地址)。
如果返回“OK”,则表示Web应用已启动并正在运行。如果电子元件全部连接好,红色LED也应该亮起。
设置的最后一步是通过将Run脚本(我已包含在zip中的RunWeather和RunWeatherWWW)添加到rc.local来自动启动这两个进程。
<code>sudo nano /etc/rc.local</code>
关注点
代码快速说明 - weather.py
启动时,它会获取温度和湿度并将其插入数据库
humidity, temperature = Adafruit_DHT.read_retry(sensor, 4)
InsertWeather(temperature,humidity)
然后尝试获取并显示IP地址在屏幕上(因为我们希望该设备无头运行)
lanip = GetLANIP().strip()
wanip = GetWLANIP().strip()
retry=0
while((not lanip) and (not wanip)) and retry<5:
time.sleep(2)
lanip = GetLANIP().strip()
wanip = GetWLANIP().strip()
retry = retry + 1
lcd_i2c.lcd_string(lanip,LCD_LINE_3)
lcd_i2c.lcd_string(wanip,LCD_LINE_4)
然后它将进入一个无限循环,该循环不断获取天气(每10分钟)并刷新显示屏上的时间(大约每30秒一次,取决于获取天气所需的时间)。
代码快速说明 - weatherwww.py
在Flask中,每个URL都映射到一个方法。例如
@app.route('/redon')
def redon():
GPIO.output(GPIO_RED,True)
return 'OK'
还有一些稍微耗时的long running方法,如下所示。由于我们使用的是内置的单线程Flask Web容器,当上一个请求仍在运行时,它将接受任何新请求。为了改进这一点,我们可以考虑将其更改为异步运行,启动一个新线程并立即返回响应。但是,这会变得有点棘手,因为新请求需要取消之前正在运行的请求。
@app.route('/blinkyellow')
def blinkyellow():
allledoff()
GPIO.output(GPIO_YELLOW,True)
time.sleep(1)
GPIO.output(GPIO_YELLOW,False)
time.sleep(1)
GPIO.output(GPIO_YELLOW,True)
time.sleep(1)
GPIO.output(GPIO_YELLOW,False)
time.sleep(1)
GPIO.output(GPIO_YELLOW,True)
time.sleep(1)
GPIO.output(GPIO_YELLOW,False)
return 'OK'
您也可以尝试其他URL,例如在LCD上显示消息,如:
http://192.168.11.115:5000/display?line3=hello&line4=how are you?
在第二部分,我将讨论用于远程控制此设备的Xamarin移动应用程序。