在这个项目中,我们将使用在线天气服务在图形LCDPhidget(LCD1100)上显示当地天气和时间。此项目的代码可用C#和Python编写。补给品使用以下硬件:VINT集线器Phidget(HUB0000_0)图形LCD小工具(LCD1100_0)第1步:设置将您的图形LCDPhidget连接到任何端口上的VINT集线器。第2步:概述如上图,这个项目主要有两个部分:访问天气数据显示天气数据让我们先来看看访问数据。第3步:访问天气数据我们将使用OpenWeather访问我们当地的天气预报。他们提供免费访问超过200,000个城市的天气预报。支持以下格式:JSONXMLHTML对于这个项目,我们将使用XML格式。为了访问天气数据,您必须创建一个免费帐户并获得一个API密钥。第4步:创建您的帐户按照此链接创建一个免费帐户并获取API密钥。获取API密钥后,您将可以通过此URL访问数据:api.openweathermap.org/data/2.5/weather?q={cityname}&appid={APIkey}将{cityname}替换为您的城市,将{APIkey}替换为您的API密钥。例如,这就是我们的样子:http://api.openweathermap.org/data/2.5/weather?q=Calgary&APPID=fakeid111111111111111111111111111&units=metric&mode=xml尝试在任何网络浏览器中输入您的URL。您将看到如上所示的XML格式的天气数据。下一步是创建一个程序,该程序可以解析数据以便显示。第5步:读取/解析天气数据-C#对于C#,您可以使用XMLTextReader类来快速解析XML数据:staticstringreadXML(stringarg1,stringarg2){StringURLString="http://api.openweathermap.org/data/2.5/weather?q=Calgary&APPID=fakeid111111111111111111111111111&units=metric&mode=xml";XmlTextReaderreader=newXmlTextReader(URLString);reader.ReadToFollowing(arg1);reader.MoveToAttribute(arg2);returnreader.Value;}您可以像这样使用上面的函数:staticvoidupdateWeather(LCDlcd){stringcity=readXML("city","name");stringtemperature=readXML("temperature","value");stringhumidity=readXML("humidity","value");stringwindspeed=readXML("speed","value");stringdescript=readXML("weather","value");stringiconID=readXML("weather","icon");}还有其他可用的值(日出时间、日落时间、压力等),但对于这个项目,我们将只显示值的一个子集。第6步:读取/解析天气数据-Python对于Python,您可以使用ElementTreeXMLAPI来快速解析数据:importxml.etree.ElementTreeasETfromurllib.requestimporturlopenurl=urlopen('http://api.openweathermap.org/data/2.5/weather?q=Calgary&APPID=fakeid111111111111111111111111111&units=metric&mode=xml')tree=ET.parse(url)root=tree.getroot()defreadXML(arg1,arg2):foriteminroot.iter(arg1):returnitem.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。该值表示描述当前天气的图像。您可以在此处查看图标。GraphicLCDPhidget能够显示位图,我们可以在我们的程序中轻松实现这些图标。如果您还没有在GraphicLCDPhidget上探索位图,请查看此项目。网上有很多像素艺术程序,我们使用了Piskel。由于简单的导出到C文件选项,重新创建OpenWeatherMap图标很容易。位图的结果在下面的github存储库中提供。第8步:显示数据-C#现在我们已经收集了天气数据,最后一步是将其显示在GraphicLCDPhidget上:staticvoidupdateWeather(LCDlcd){stringcity=readXML("city","name");stringtemperature=readXML("temperature","value");stringhumidity=readXML("humidity","value");stringwindspeed=readXML("speed","value");stringdescript=readXML("weather","value");stringiconID=readXML("weather","icon");if(temperature.Length>5){temperature=temperature.Remove(5);}//Temperatureboxintx=(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");//Weatherimage+descriptboxbyte[]temp;if(iconID=="01d")temp=_01d;elseif(iconID=="02d")temp=_02d;elseif(iconID=="03d")temp=_03d;elseif(iconID=="04d")temp=_04d;elseif(iconID=="09d")temp=_09d;elseif(iconID=="10d")temp=_10d;elseif(iconID=="11d")temp=_11d;elseif(iconID=="13d")temp=_13d;elseif(iconID=="50d")temp=_50d;elseif(iconID=="01n")temp=_01n;elseif(iconID=="02n")temp=_02n;elseif(iconID=="10n")temp=_10n;elsetemp=unknown;lcd.WriteBitmap(2,31,32,32,temp);lcd.WriteText(LCDFont.Dimensions_5x8,40,42,descript);//Extrainfoboxlcd.WriteText(LCDFont.Dimensions_5x8,50,11,"Humidity:"+humidity+"%");lcd.WriteText(LCDFont.Dimensions_5x8,50,20,"Wind:"+windspeed+"km/h");}staticvoidredraw(LCDlcd){lcd.Clear();//drawbordersaroundoutsidelcd.DrawLine(0,0,127,0);lcd.DrawLine(0,0,0,63);lcd.DrawLine(127,0,127,63);lcd.DrawLine(0,63,127,63);//drawbordersinsidelcd.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,MMMdhh:mm:sstt"));updateWeather(lcd);lcd.Flush();}下面是对上面代码的快速回顾:重绘此函数在图形LCD上绘制主要边界。它还打印当前时间并调用updateWeather程序。更新天气此函数将来自OpenWeather服务的数据排列到图形LCD上。第9步:显示数据-Python现在我们已经收集了天气数据,最后一步是将其显示在GraphicLCDPhidget上:defupdateWeather():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:]#removelastcharsoitfits#temperatureboxx=(44-((len(temperature)*6)+12))/2x=int(x)#forcetointlcd.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")#Weathericon+descriptboxtemp=[]if(iconID=="01d"):temp=_01delif(iconID=="02d"):temp=_02delif(iconID=="03d"):temp=_03delif(iconID=="04d"):temp=_04delif(iconID=="09d"):temp=_09delif(iconID=="10d"):temp=_10delif(iconID=="11d"):temp=_11delif(iconID=="13d"):temp=_13delif(iconID=="50d"):temp=_50delif(iconID=="01n"):temp=_01nelif(iconID=="02n"):temp=_02nelif(iconID=="10n"):temp=_10nelse:temp=unknownlcd.writeBitmap(2,31,32,32,temp)lcd.writeText(LCDFont.FONT_5x8,40,42,descript)#Extrainfoboxlcd.writeText(LCDFont.FONT_5x8,50,11,"Humidity:"+humidity+"%")lcd.writeText(LCDFont.FONT_5x8,50,20,"Wind:"+windspeed+"km/h")defredraw():lcd.clear()#Drawbordersaroundoutsidelcd.drawLine(0,0,127,0)lcd.drawLine(0,0,0,63)lcd.drawLine(127,0,127,63)lcd.drawLine(0,63,127,63)#drawbordersinsidelcd.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()下面是对上面代码的快速回顾:重绘此函数在图形LCD上绘制主要边界。它还打印当前时间并调用updateWeather程序。更新天气此函数将来自OpenWeather服务的数据排列到图形LCD上。第10步:主循环最后要做的是创建一个主循环,按设定的时间表更新LCD。以下是我们的建议:每秒:更新LCD上的时间每15分钟:更新LCD上的天气状态创建一个每秒循环一次的无限循环。创建一个计数器来跟踪循环,当计数器达到900(900秒是15分钟)时更新天气。第11步:完成该项目的完整代码可在此处获得:https://github.com/phidgeteer/LCDWeather.git如果您有任何问题,请在下面发表评论!