資料介紹
描述
?
在這個(gè)項(xiàng)目中,我們將使用在線天氣服務(wù)在圖形 LCD Phidg??et (LCD1100) 上顯示當(dāng)?shù)靥鞖夂蜁r(shí)間。此項(xiàng)目的 C# 和 Python 代碼可用。
補(bǔ)給品
使用以下硬件:
- VINT 集線器 Phidg??et (HUB0000_0)
- 圖形 LCD Phidg??et (LCD1100_0)
第 1 步:設(shè)置
通過(guò)任何端口將您的圖形 LCD Phidg??et 連接到您的 VINT 集線器。
第 2 步:概述
如上所示,這個(gè)項(xiàng)目有兩個(gè)主要部分:
- 訪問(wèn)天氣數(shù)據(jù)
- 顯示天氣數(shù)據(jù)
讓我們先來(lái)看看訪問(wèn)數(shù)據(jù)。
第 3 步:訪問(wèn)天氣數(shù)據(jù)
我們將使用OpenWeather訪問(wèn)我們當(dāng)?shù)氐奶鞖忸A(yù)報(bào)。他們提供免費(fèi)訪問(wèn)超過(guò) 200,000 個(gè)城市的天氣預(yù)報(bào)。支持以下格式:
- JSON
- XML
- HTML
對(duì)于這個(gè)項(xiàng)目,我們將使用 XML 格式。
為了訪問(wèn)天氣數(shù)據(jù),您必須創(chuàng)建一個(gè)免費(fèi)帳戶并獲取 API 密鑰。
第 4 步:創(chuàng)建您的帳戶
按照此鏈接創(chuàng)建免費(fèi)帳戶并獲取 API 密鑰。獲取 API 密鑰后,您可以通過(guò)以下 URL 訪問(wèn)數(shù)據(jù):
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
嘗試在任何網(wǎng)絡(luò)瀏覽器中輸入您的 URL。您將看到 XML 格式的天氣數(shù)據(jù),如上所示。下一步是創(chuàng)建一個(gè)可以解析數(shù)據(jù)以便顯示的程序。
第 5 步:讀取/解析天氣數(shù)據(jù) - C#
對(duì)于 C#,您可以使用XMLTextReader類來(lái)快速解析 XML 數(shù)據(jù):
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;
}
您可以像這樣使用上面的函數(shù):
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");
}
還有其他可用的值(日出時(shí)間、日落時(shí)間、壓力等),但對(duì)于這個(gè)項(xiàng)目,我們將只顯示值的子集。
第 6 步:讀取/解析天氣數(shù)據(jù) - Python
對(duì)于 Python,您可以使用 ElementTree XML API 快速解析數(shù)據(jù):
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'))
還有其他可用的值(日出時(shí)間、日落時(shí)間、壓力等),但對(duì)于這個(gè)項(xiàng)目,我們將只顯示值的子集。
第 7 步:OpenWeather 圖標(biāo)
您可能已經(jīng)注意到我們?cè)谏厦娲鎯?chǔ)了iconID 。此值表示描述當(dāng)前天氣的圖像。您可以在此處查看圖標(biāo)。Graphic LCD Phidg??et 能夠顯示位圖,我們可以在我們的程序中輕松實(shí)現(xiàn)這些圖標(biāo)。如果您還沒(méi)有探索過(guò)圖形 LCD Phidg??et 上的位圖,請(qǐng)查看這個(gè)項(xiàng)目。
網(wǎng)上有很多像素藝術(shù)程序,我們使用了 Piskel。由于簡(jiǎn)單的“導(dǎo)出到 C 文件”選項(xiàng),重新創(chuàng)建 OpenWeatherMap 圖標(biāo)很容易。位圖的結(jié)果在下面的 github 存儲(chǔ)庫(kù)中提供。
第 8 步:顯示數(shù)據(jù) - C#
現(xiàn)在我們已經(jīng)收集了天氣數(shù)據(jù),最后一步是將其顯示在圖形 LCD Phidg??et 上:
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();
}
下面是對(duì)上面代碼的快速回顧:
重繪
此函數(shù)在圖形 LCD 上繪制主要邊框。它還打印當(dāng)前時(shí)間并調(diào)用 updateWeather 程序。
更新天氣
此功能將來(lái)自 OpenWeather 服務(wù)的數(shù)據(jù)排列到圖形 LCD 上。
第 9 步:顯示數(shù)據(jù) - Python
現(xiàn)在我們已經(jīng)收集了天氣數(shù)據(jù),最后一步是將其顯示在圖形 LCD Phidg??et 上:
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()
下面是對(duì)上面代碼的快速回顧:redraw
此函數(shù)在圖形 LCD 上繪制主要邊框。它還打印當(dāng)前時(shí)間并調(diào)用 updateWeather 程序。
更新天氣
此功能將來(lái)自 OpenWeather 服務(wù)的數(shù)據(jù)排列到圖形 LCD 上。
第 10 步:主循環(huán)
最后要做的是創(chuàng)建一個(gè)主循環(huán),按設(shè)定的時(shí)間表更新 LCD。以下是我們的推薦:
- 每秒:更新液晶顯示屏上的時(shí)間
- 每 15 分鐘:更新 LCD 上的天氣狀態(tài)
創(chuàng)建一個(gè)每秒循環(huán)的無(wú)限循環(huán)。創(chuàng)建一個(gè)計(jì)數(shù)器來(lái)跟蹤循環(huán),當(dāng)計(jì)數(shù)器達(dá)到 900(900 秒是 15 分鐘)時(shí)更新天氣。
第 11 步:繼續(xù)前進(jìn)
該項(xiàng)目的完整代碼可在此處獲得:https ://github.com/phidgeteer/LCDWeather.git
如果您有任何疑問(wèn),請(qǐng)?jiān)谙旅姘l(fā)表評(píng)論!
- 使用Arduino和LCD顯示器的天氣報(bào)告系統(tǒng)
- 在LCD上顯示腳本
- 在LCD上顯示溫度和濕度
- 使用Swift語(yǔ)言在LCD上顯示溫度
- 基于ARM處理器的TFT-LCD顯示系統(tǒng) 34次下載
- 基于51單片機(jī)的LCD1602顯示proteus實(shí)驗(yàn) 38次下載
- 基于LCD1602的時(shí)鐘顯示源代碼下載 28次下載
- PIC32 FRM圖形LCD(GLCD)控制器詳細(xì)中文資料概述
- 基于FPGA設(shè)計(jì)LCD顯示控制器相關(guān)知識(shí)詳解 35次下載
- LCD圖形顯示解決方案與PIC32 Graphic在智能家居的應(yīng)用介紹 8次下載
- LCD圖形生成工具 13次下載
- verilog_實(shí)現(xiàn)_LCD顯示 47次下載
- 基于NiosⅡ處理器的TFT-LCD圖形顯示設(shè)計(jì)
- 帶LCD驅(qū)動(dòng)MCU在顯示方面的軟件設(shè)計(jì)
- 多功能顯示LCD顯示芯片電路
- lcd屏和oled屏的優(yōu)缺點(diǎn) lcd屏和oled屏的區(qū)別 4627次閱讀
- 如何在LCD上顯示漢字和英文 2373次閱讀
- LCD1602顯示屏如何使用 2725次閱讀
- 如何將柔性傳感器與樹(shù)莓派連接并在LCD屏幕上顯示其值 3709次閱讀
- LCD1602液晶顯示屏的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn) 9575次閱讀
- 淺析初次使用LCD1602時(shí)都不能一次點(diǎn)亮顯示的問(wèn)題 3207次閱讀
- GD32全面支持高性能LCD顯示驅(qū)動(dòng)方案 1.1w次閱讀
- 51單片機(jī)對(duì)LCD1602顯示的四線驅(qū)動(dòng) 6527次閱讀
- LCD1602是什么?關(guān)于LCD1602液晶模塊的顯示問(wèn)題? 2.2w次閱讀
- LCD驅(qū)動(dòng)分析_LCD控制器設(shè)置及代碼詳解 1.8w次閱讀
- LCD顯示漢字的兩種算法分析 7186次閱讀
- lcd1602指令說(shuō)明 3.6w次閱讀
- lcd1602能顯示漢字嗎_lcd1602顯示漢字程序 8.7w次閱讀
- lcd1602顯示程序 2.9w次閱讀
- lcd1602工作原理是什么? 16.6w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開(kāi)發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多