拼凑电子墨水仪表盘

2020-05-02 17:58:19

我意识到我在一遍又一遍地问谷歌助手同样的问题。比如现在的天气怎么样?或者我今天的日程表上有什么?因此,我开始为我的树莓PI构建一个小仪表盘,我可以代替它进行检查。

我花了大约20美元买了一个Waveshare 2.7英寸的电子纸帽子(B)。这个版本配有一个印刷电路板,可以直接插在树莓PI的通用输入/输出(GPIO)引脚上。您还可以使用随附的导线,以避免阻塞未使用的GPIO引脚。

我按照Waveshare wiki的安装说明启动了hello world程序之一-有C和Python两个版本。与其他Raspberry PI硬件附件相比,实现这一点的步骤以及示例程序非常容易实现。

我开始仔细阅读Python示例的源代码,以了解EPD库是如何工作的。该屏幕B版为三色,可显示白、黑、红三色,分辨率为264x176。示例首先清除屏幕(用白色填充),然后创建两个层,这两个层是Pillow库中的Image对象。其中一层是黑色内容,另一层是红色内容。然后将它们传递给渲染函数EPD::Display。

#initialize the EPD classepd=epd2in7b.EPD()EPD.init()#从清晰的(白色)背景开始.Clear()#定义简单的字体24=ImageFont.truetype(os.path.join(picdir,';Font.ttc';),24)#创建空的图像对象/层HBlackimage=Image.new(';1&#。,(EPD.high,EPD.width),255)#渲染黑色部分Black_Draw=ImageDraw.Draw(HBlackImage)BLACK_DRAW.text((1,1),top_text,font=font_Large,Fill=0)#Calculate.。

对于原型,我将显示当前的天气和来自BBC的一些新闻头条。Open Weather和News API都有慷慨的自由层。对于这些特性中的每一个,我都将编写返回文本的函数,我可以从中创建图层。

我将使用Python3.5中的格式化字符串(而不是高级的f字符串),因为这是Raspian(默认的Raspberry PI操作系统)附带的。

def get_weet():';';';';获取格式化的天气描述。例如:`里士满,GB:晴空`';';';owm=pyowm.OWM(Open_Weet_Key)servation=owm.weet_at_place(Location)w=观察.get_weet()Detailed=w.get_Detailed_status().Capitalize()temp_data=w.get_temp(';摄氏度;)current_temp=str(temp_data[";])min_temp=str(temp_data[";temp_min";])max_temp=str(temp_data[";temp_max";])text=';{}:{}\n{}°C({}°C.。

遗憾的是,News API没有可用的最新库,所以我使用请求进行HTTP调用并解析数据。我可以显示大约三个标题(每个标题都有一个额外的换行)。文本需要手动换行,以防止其脱离屏幕。

def get_news(Limit=3):';';';';从BBC获取一些列表格式的新闻标题。例如,“备受赞誉的瑞典作家佩尔·奥洛夫·恩奎斯特去世了-PM重返工作岗位,这是对这个国家的一个提振。错误的说法是,瑞典没有采取认真的措施。”URL=';https://newsapi.org/v2/top-headlines?sources=bbc-news&;apiKey={}';。格式(News_Api_Key)resp=request.get(url=url)data=resp.json()文章=[文章[';标题';]用于数据中的文章.。

使用这两段文本,我创建了图像层。我希望天气在黑色的图层上,字体稍大一点。新闻将在红色的图层下面。下面是一个函数,它接受EPD类的一个实例以及两段文本。

def show_text(EPD,top_text=';';,Bottom_text=';';):';';';给定EPD实例和文本部分,渲染文本。';';';';HBlackImage=Image.new(';1';,(epd2in7b.EPD_Height,epd2in7b.EPD_Width),255)HRedImage=Image.new(';1';,(epd2in7b.EPD_HEIGHT,epd2in7b.EPD_WIDTH),255)#渲染黑色部分BLACK_DRAW=ImageDraw(HBlackImage)BLACK_DRAW.text((1,1),top_text,font=font_Large,Fill=0)#计算黑色的深度.。

这两个Image对象包含简单的数据,并不“知道”它们是什么颜色。渲染为位图格式时,它们看起来如下所示。

注意第二层为第一层留出的空间,这样文本就不会重叠。

这个程序的主要功能是确保我们只在有人醒着的时候才显示仪表板。我希望避免文档警告的重影。传递给show_text函数的EPD类在这里初始化。

定义m