资料介绍
描述
在这个项目中,我们将使用在线天气服务在图形 LCD Phidget (LCD1100) 上显示当地天气和时间。此项目的 C# 和 Python 代码可用。
补给品
使用以下硬件:
- VINT 集线器 Phidget (HUB0000_0)
- 图形 LCD Phidget (LCD1100_0)
第 1 步:设置
通过任何端口将您的图形 LCD Phidget 连接到您的 VINT 集线器。
第 2 步:概述
如上所示,这个项目有两个主要部分:
- 访问天气数据
- 显示天气数据
让我们先来看看访问数据。
第 3 步:访问天气数据
我们将使用OpenWeather访问我们当地的天气预报。他们提供免费访问超过 200,000 个城市的天气预报。支持以下格式:
- JSON
- XML
- HTML
对于这个项目,我们将使用 XML 格式。
为了访问天气数据,您必须创建一个免费帐户并获取 API 密钥。
第 4 步:创建您的帐户
按照此链接创建免费帐户并获取 API 密钥。获取 API 密钥后,您可以通过以下 URL 访问数据:
api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key}
将 {city name} 替换为您的城市,将 {API key} 替换为您的 API 密钥。例如,这就是我们的样子:
http://api.openweathermap.org/data/2.5/weather?q=Calgary&APPID=fakeid111111111111111111111111111&units=metric&mode=xml
尝试在任何网络浏览器中输入您的 URL。您将看到 XML 格式的天气数据,如上所示。下一步是创建一个可以解析数据以便显示的程序。
第 5 步:读取/解析天气数据 - C#
对于 C#,您可以使用XMLTextReader类来快速解析 XML 数据:
static string readXML(string arg1, string arg2)
{
String URLString = "http://api.openweathermap.org/data/2.5/weather?q=Calgary&APPID=fakeid111111111111111111111111111&units=metric&mode=xml";
XmlTextReader reader = new XmlTextReader(URLString);
reader.ReadToFollowing(arg1);
reader.MoveToAttribute(arg2);
return reader.Value;
}
您可以像这样使用上面的函数:
static void updateWeather(LCD lcd) {
string city = readXML("city", "name");
string temperature = readXML("temperature", "value");
string humidity = readXML("humidity", "value");
string windspeed = readXML("speed", "value");
string descript = readXML("weather", "value");
string iconID = readXML("weather", "icon");
}
还有其他可用的值(日出时间、日落时间、压力等),但对于这个项目,我们将只显示值的子集。
第 6 步:读取/解析天气数据 - Python
对于 Python,您可以使用 ElementTree XML API 快速解析数据:
import xml.etree.ElementTree as ET
from urllib.request import urlopen
url = urlopen('http://api.openweathermap.org/data/2.5/weather?q=Calgary&APPID=fakeid111111111111111111111111111&units=metric&mode=xml')
tree = ET.parse(url)
root = tree.getroot()
def readXML(arg1, arg2):
for item in root.iter(arg1):
return item.get(arg2)
print(readXML('city','name'))
print(readXML('temperature','value'))
print(readXML('humidity','value'))
print(readXML('speed','value'))
print(readXML('weather','value'))
print(readXML('weather','icon'))
还有其他可用的值(日出时间、日落时间、压力等),但对于这个项目,我们将只显示值的子集。
第 7 步:OpenWeather 图标
您可能已经注意到我们在上面存储了iconID 。此值表示描述当前天气的图像。您可以在此处查看图标。Graphic LCD Phidget 能够显示位图,我们可以在我们的程序中轻松实现这些图标。如果您还没有探索过图形 LCD Phidget 上的位图,请查看这个项目。
网上有很多像素艺术程序,我们使用了 Piskel。由于简单的“导出到 C 文件”选项,重新创建 OpenWeatherMap 图标很容易。位图的结果在下面的 github 存储库中提供。
第 8 步:显示数据 - C#
现在我们已经收集了天气数据,最后一步是将其显示在图形 LCD Phidget 上:
static void updateWeather(LCD lcd)
{
string city = readXML("city", "name");
string temperature = readXML("temperature", "value");
string humidity = readXML("humidity", "value");
string windspeed = readXML("speed", "value");
string descript = readXML("weather", "value");
string iconID = readXML("weather", "icon");
if (temperature.Length > 5)
{
temperature = temperature.Remove(5);
}
//Temperature box
int x = (44 - ((temperature.Length * 6) + 12)) / 2;
lcd.WriteText(LCDFont.Dimensions_6x12, x, 15, temperature);
lcd.WriteText(LCDFont.User1, x + temperature.Length * 6, 15, "0");
lcd.WriteText(LCDFont.Dimensions_6x12, x + temperature.Length * 6 + 6, 15, "C");
//Weather image + descript box
byte[] temp;
if (iconID == "01d")
temp = _01d;
else if (iconID == "02d")
temp = _02d;
else if (iconID == "03d")
temp = _03d;
else if (iconID == "04d")
temp = _04d;
else if (iconID == "09d")
temp = _09d;
else if (iconID == "10d")
temp = _10d;
else if (iconID == "11d")
temp = _11d;
else if (iconID == "13d")
temp = _13d;
else if (iconID == "50d")
temp = _50d;
else if (iconID == "01n")
temp = _01n;
else if (iconID == "02n")
temp = _02n;
else if (iconID == "10n")
temp = _10n;
else
temp = unknown;
lcd.WriteBitmap(2, 31, 32, 32, temp);
lcd.WriteText(LCDFont.Dimensions_5x8, 40, 42, descript);
//Extra info box
lcd.WriteText(LCDFont.Dimensions_5x8, 50, 11, "Humidity: " + humidity + "%");
lcd.WriteText(LCDFont.Dimensions_5x8, 50, 20, "Wind: " + windspeed + "km/h");
}
static void redraw(LCD lcd)
{
lcd.Clear();
//draw borders around outside
lcd.DrawLine(0, 0, 127, 0);
lcd.DrawLine(0, 0, 0, 63);
lcd.DrawLine(127, 0, 127, 63);
lcd.DrawLine(0, 63, 127, 63);
//draw borders inside
lcd.DrawLine(0, 10, 128, 10);
lcd.DrawLine(43, 10, 43, 30);
lcd.DrawLine(1, 30, 127, 30);
lcd.WriteText(LCDFont.Dimensions_5x8, 1, 1, DateTime.Now.ToString(" ddd, MMM d hh:mm:ss tt"));
updateWeather(lcd);
lcd.Flush();
}
下面是对上面代码的快速回顾:
重绘
此函数在图形 LCD 上绘制主要边框。它还打印当前时间并调用 updateWeather 程序。
更新天气
此功能将来自 OpenWeather 服务的数据排列到图形 LCD 上。
第 9 步:显示数据 - Python
现在我们已经收集了天气数据,最后一步是将其显示在图形 LCD Phidget 上:
def updateWeather():
city = readXML('city', 'name')
temperature = readXML('temperature', 'value')
humidity = readXML('humidity', 'value')
windspeed = readXML('speed', 'value')
descript = readXML('weather', 'value')
iconID = readXML('weather', 'icon')
if(len(temperature) > 5):
temperature = temperature[:-1:] #remove last char so it fits
#temperature box
x = (44 - ((len(temperature) * 6) + 12)) / 2
x = int(x) #force to int
lcd.writeText(LCDFont.FONT_6x12, x, 15, temperature)
lcd.writeText(LCDFont.FONT_User1, x + len(temperature) * 6, 15, "0")
lcd.writeText(LCDFont.FONT_6x12, x + len(temperature) * 6 + 6, 15, "C")
#Weather icon + descript box
temp = []
if(iconID == "01d"):
temp = _01d
elif(iconID == "02d"):
temp = _02d
elif (iconID == "03d"):
temp = _03d
elif (iconID == "04d"):
temp = _04d
elif (iconID == "09d"):
temp = _09d
elif (iconID == "10d"):
temp = _10d
elif (iconID == "11d"):
temp = _11d
elif (iconID == "13d"):
temp = _13d
elif (iconID == "50d"):
temp = _50d
elif (iconID == "01n"):
temp = _01n
elif (iconID == "02n"):
temp = _02n
elif (iconID == "10n"):
temp = _10n
else:
temp = unknown
lcd.writeBitmap(2, 31, 32, 32, temp)
lcd.writeText(LCDFont.FONT_5x8, 40, 42, descript)
#Extra info box
lcd.writeText(LCDFont.FONT_5x8, 50, 11, "Humidity: " + humidity + "%")
lcd.writeText(LCDFont.FONT_5x8, 50, 20, "Wind: " + windspeed + "km/h")
def redraw():
lcd.clear()
#Draw borders around outside
lcd.drawLine(0, 0, 127, 0)
lcd.drawLine(0, 0, 0, 63)
lcd.drawLine(127, 0, 127, 63)
lcd.drawLine(0, 63, 127, 63)
#draw borders inside
lcd.drawLine(0, 10, 128, 10)
lcd.drawLine(43, 10, 43, 30)
lcd.drawLine(1, 30, 127, 30)
timeStr = datetime.now().strftime("%a, %b %d %I:%M:%S %p")
lcd.writeText(LCDFont.FONT_5x8, 1, 1, timeStr)
updateWeather()
lcd.flush()
下面是对上面代码的快速回顾:redraw
此函数在图形 LCD 上绘制主要边框。它还打印当前时间并调用 updateWeather 程序。
更新天气
此功能将来自 OpenWeather 服务的数据排列到图形 LCD 上。
第 10 步:主循环
最后要做的是创建一个主循环,按设定的时间表更新 LCD。以下是我们的推荐:
- 每秒:更新液晶显示屏上的时间
- 每 15 分钟:更新 LCD 上的天气状态
创建一个每秒循环的无限循环。创建一个计数器来跟踪循环,当计数器达到 900(900 秒是 15 分钟)时更新天气。
第 11 步:继续前进
该项目的完整代码可在此处获得:https ://github.com/phidgeteer/LCDWeather.git
如果您有任何疑问,请在下面发表评论!
- 使用Arduino和LCD显示器的天气报告系统 1次下载
- LCD1602液晶屏显示资料 108次下载
- 6位LCD显示60秒计数器芯片ZH1805 19次下载
- 56*4/52*8 LCD显示驱动芯片VK2C23 16次下载
- 18*4位RAN LCD显示器VK1072B参考电路下载 22次下载
- 基于ARM处理器的TFT-LCD显示系统 34次下载
- 基于STC12C5A60S2的两路采集LCD显示源代码 12次下载
- 基于STC12C5A60S2的LCD显示屏源代码下载 18次下载
- TFT LCD液晶显示器的工作原理-谢崇凯(最全版本)LCD驱动必看.pdf 0次下载
- LCD图形显示解决方案与PIC32 Graphic在智能家居的应用介绍 8次下载
- 安富莱3.0寸LCD显示板 40次下载
- LCD图形生成工具 13次下载
- lcd1602的显示及注意点 0次下载
- 基于NiosⅡ处理器的TFT-LCD图形显示设计 42次下载
- 多功能显示LCD显示芯片电路 84次下载
- LCD1602显示屏如何使用 1181次阅读
- 51单片机的驱动LCD屏 3024次阅读
- LCD1602液晶显示屏的驱动设计与实现 8354次阅读
- 沁恒股份:LCD显示驱动芯片——CH462 2635次阅读
- 八段式四位LCD显示器的驱动设计 3293次阅读
- 51单片机对LCD1602显示的四线驱动 6088次阅读
- LCD1602是什么?关于LCD1602液晶模块的显示问题? 2.1w次阅读
- lcd1602显示电路图大全(两款lcd1602液晶显示电路原理图) 12w次阅读
- 一文解析段码LCD液晶屏驱动方法 4.6w次阅读
- lcd1602指令说明 3.6w次阅读
- lcd1602时序图浅析 2.8w次阅读
- lcd1602能显示汉字吗_lcd1602显示汉字程序 8.4w次阅读
- lcd1602显示程序 2.8w次阅读
- lcd1602工作原理是什么? 16.1w次阅读
- 通用型LCD1602自定义字符的显示 3.5w次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多