65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.98/5 (35投票s)

2016年12月28日

CPOL

5分钟阅读

viewsIcon

45966

downloadIcon

591

一个小项目,为我的儿子带来惊喜

引言

我一直在玩树莓派和电子产品,我的四岁的儿子偶尔会来我的桌子玩耍,将红色、黄色和绿色的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

已开发两个进程在树莓派上运行。

  1. weather.py - 这是一个有限的循环,它
    • 获取并显示温度和湿度,并将它们保存到数据库
    • 在LCD上显示日期和时间
    • 启动时显示IP地址,以便App能够轻松找到它
  2. 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移动应用程序。

© . All rights reserved.