micropython lcd触摸屏显示中文_基于Micropython的天气显示 进程帖

本帖最后由 michael_llh 于 2019-4-17 10:06 编辑

更下项目的进程哈!

项目的思路很简单,就是从网上获取天气信息,然后进行显示!

很尽量把过程写清楚,方便大家的交流和学习。

首先说明下使用的硬件信息:Micropython的开发板,LCD显示屏,WiFi模块ESP8266

思路是这样:LCD显示屏由Micropython开发板进行控制显示,然后WiFi模块从网上下载天气信息并且将信息发送给Micropython开发板进行显示。

其实是可以单单使用WiFi模块就可以完成这个项目的,不需要使用到Micropython开发板的,但是单单使用WiFi模块来做的话,需要使用ESP32这个模块,因为8266这个模块内存比较小,驱动LCD显示屏需要较大的内存。手上没有ESP32的模块,就只能做个变通了,也能顺便锻炼下两个模块的通信问题哈。

Micropython的准备问题

首先我们需要烧写STM32和ESP8266的micropython固件,固件可以直接在官网下载到。STM32开发板我使用的是micropython的开发板,这个应该直接淘宝可以买到,ESP8266使用的是NodeMCU这个板子,买回来烧写成micropython的。

关于烧写方法大家可以直接参考官网的说明,很详细了,具体参考:

http://www.micropython.org/download

也可以看看我之前的说明:

https://www.arduino.cn/thread-49997-1-1.html

关于代码的上传这里说明下:

因为STM32的开发板是带有SD卡槽的,所以我是将所有的代码拷贝到SD卡槽中。这里因为micropython实现SD的驱动,并且把开发板模拟成一个读卡器,插上电脑就会显示一个SD卡的盘,直接拷贝进去就可以了。

对于ESP8266比较麻烦,因为这个板子只有两个UART,然后UART1的一个引脚被板子上SPI芯片驱动的引脚占用了,所以UART1没有办法使用,而UART0又是我们需要连接电脑进行调试用的。所以需要采用官方提供的webrepl的方法,来进行板子的调试和文件上传,关于webrepl的使用,也可以直接参考官网的说明:http://docs.micropython.org/en/latest/esp8266/quickref.html#webrepl-web-browser-interactive-prompt

STM32代码部分

Micropython的LCD显示器的驱动参考自:

https://github.com/ropod7/pyboard_drive/tree/master/ILI9341

采用的是ILI9341的显示驱动的显示屏。LCD显示的代码实现比较简单,就是各个元素的显示位置需要调整下。

LCD显示的时候需要用到天气图标,在openweathermap找到了相应的图标,所以就直接用爬虫下载了,有点多,懒得点。。哈(小程序,不是很规范,仅供参考)[mw_shl_code=python,true]# encoding: utf-8

import requests

import os

from lxml import etree

url = "https://openweathermap.org/weather-conditions"

headers ={

'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'

}

icon_addr = './weather_icon/'

if not os.path.exists(icon_addr):

os.mkdir(icon_addr)

response = requests.get(url, headers=headers)

#print(response.content)

data = response.content

html = etree.HTML(data)

icon_table = html.xpath("//table[@class='table table-bordered']")[0]

# print(etree.tostring(icon_table).decode('utf-8'))

trs = icon_table.xpath('.//tr')[1:]

for tr in trs:

td = tr.xpath('./td/img/@src')

for icon_url in td:

respnse = requests.get(icon_url)

file_addr = icon_addr + icon_url[-7:]

with open(file_addr, 'wb') as fp:

fp.write(respnse.content)

print("success save icon: %s" % icon_url[-7:])

[/mw_shl_code]网上能下载到的icon基本都是png svg格式的,bmp的几乎没有,再加上LCD显示图片格式有一定要求,所以只能自己再转换下了。(But!!!下载下来的图片太小了,放大后很糊,表示看着很难受,所以我自己替换了几个,部分没有找到合适的就将就用了)使用的是Photoshop,然后选择文件,存储为,或者是使用快捷键ctrl+shift+s。

然后在弹出的存储为窗口中,选择保存文件格式为bmp,格式的下拉框第三个选项。

然后会弹出BMP选项,点击高级模式按钮,在左边的选项中选择:R5 G6 B5,确定即可。

STM32下载micropython固件,驱动LCD,并且接受UART中断数据进行显示的代码如下:

display.py

[mw_shl_code=python,true]# endcoding:utf-8

import os

import gc

import pyb, micropython

from lcd import LCD, Chars, ILI, imgdir, cachedir, imgcachepath

from colors import *

from machine import UART

l = LCD()

c = l.initCh(color=BLACK, font='Vera_15', bgcolor=WHITE)

uart = UART(4, 9600)

uart.init(9600, bits=8, parity=None, stop=1)

def draw_bg():

l.portrait = False # 修改为横屏显示

l.fillMonocolor( WHITE )

l.drawRect(170, 10, 140, 100, MAROON, border=1)

l.drawRect(170, 130, 140, 100, MAROON, border=1)

l.drawRect(10, 130, 140, 100, MAROON, border=1)

c.printLn('Weather Forcast', 10, 15, scale=1)

c.printLn('TEMPERATURE', 175, 20, scale=1)

c.printLn('HUMIDITY', 200, 140, scale=1)

c.printLn('WINDSPEED', 30, 140, scale=1)

c.printLn('°C', 270, 60, scale=2)

c.printLn('%', 270, 180, scale=2)

c.printLn('m/s', 95, 180, scale=2)

def display_data(s):

l.portrait = False # 修改为横屏显示

data = s.split(',')

l.drawRect(200, 60, 68, 25, WHITE, border=0) # 清空temp显示区域

l.drawRect(200, 180, 68, 25, WHITE, border=0)# 清空humdity显示区域

l.drawRect(30, 180, 60, 25, WHITE, border=0) # 清空windspeed显示区域

l.drawRect(30, 30, 110, 90, WHITE, border=0) # 清空icon显示区域

c.printLn(data[0][:5], 200, 60, scale=2) # 温度

if data[1] == "----":

c.printLn(data[1], 200, 180, scale=2)# 湿度

else:

c.printLn(data[1], 220, 180, scale=2)# 湿度

c.printLn(data[2], 30, 180, scale=2) # 风速

if data[3] != '----':

img = data[3][:3]+'.bmp'

l.renderBmp(img, pos=(40, 120))

else:

c.printLn(data[3], 55, 60, scale=2)

def irq_func(uart_o):

try:

data = str(uart_o.read(), 'utf8')

except:

return

print('----->>>>: ', data)

if (data == 'connecting'):

l.portrait = False # 修改为横屏显示

l.drawRect(30, 30, 110, 90, WHITE, border=0)

c.printLn('connecting', 35, 60, scale=1)

elif data.startswith('data'):

data = data[5:]

display_data(data)

uart.irq(trigger=UART.IRQ_RXIDLE, handler=irq_func)

def init_display():

draw_bg()

display_data('----,----,----,----') # 初始化显示

[/mw_shl_code]

main.py

[mw_shl_code=python,true]# -*- coding: utf-8 -*-

from display import *

from machine import UART

uart = UART(4, 9600)

uart.init(9600, bits=8, parity=None, stop=1)

init_display() # 初始化完成后再开启UART

uart.irq(trigger=UART.IRQ_RXIDLE, handler=irq_func)[/mw_shl_code]

ESP8266代码部分WiFi模块就只要简单ESP8266模块来完成就可以了。定时获取天气信息(这里我设置了1分钟更新一次,对于天气更新的话,可以不这么频繁)并且发送给STM32的代码如下:config.py

[mw_shl_code=python,true]# encoding:utf-8

import os

import network

import socket

import json

from machine import UART

import time

uart=UART(0,9600)

uart.init(9600, bits=8, parity=None, stop=1)

def get_weather_info():

key = 'openweatermap注册账号,然后获取这个key值'

info = b''

weather_data = 'data:'

s = socket.socket()

addr = socket.getaddrinfo('api.openweathermap.org', 80)

s.connect(addr[0][4])

s.send(b'GET http://api.openweathermap.org/data/2.5/weather?q=Putian,CN&appid=%s HTTP/1.0\r\n\r\n' % key)

while True:

data = s.recv(100)

if data:

info += data

else:

break

s.close()

data = info.split(b'\r\n\r\n')[-1]

data = json.loads(data)

temp = data['main']['temp'] - 273.15

humidity = data['main']['humidity']

wind = data['wind']['speed']

icon = data['weather'][0]['icon']

# weather_data.append({'temp':temp, 'humidity':humidity, 'wind':wind})

weather_data += str(temp)

weather_data += ','

weather_data += str(humidity)

weather_data += ','

weather_data += str(wind)

weather_data += ','

weather_data += str(icon)

return weather_data

def send_data(data):

uart.write(data)

def do_connect():

send_data("\r\n")

connect = 'connecting'

send_data(connect)

time.sleep(1)

wlan = network.WLAN(network.STA_IF)

wlan.active(True)

if not wlan.isconnected():

#print('connecting to network...')

wlan.connect('Xiaomi_196E', '1234567890')

while not wlan.isconnected():

send_data(connect)

time.sleep(1)

print('network config:', wlan.ifconfig())

[/mw_shl_code]

main.py[mw_shl_code=arduino,true]from config import *

import os

from machine import Timer

def send_data_period(tim):

send_data(get_weather_info())

tim = Timer(-1)

tim.init(period=60000, mode=Timer.PERIODIC, callback = send_data_period)

do_connect()

time.sleep(1)

send_data(get_weather_info())[/mw_shl_code]

项目可以深入的地方:

1. ILI9341这个显示屏的话还支持触屏,但是我代码中给的库还没有支持,所以这个可以继续深入,支持触屏的话,还可以做很多好玩的事情。

2. 代码中将对应的WiFi连接信息和获取信息的地点写在代码中了,这个可以继续优化,加上前面显示屏的例子,可以进行在屏幕进行输入选择

3. 项目中用到了STM32和ESP8266两块芯片,其实可以直接使用ESP32单独完成的,或者是单独的ESP8266(8266不一定的可以使用micropython的固件来完成,对空间和内存有一定要求,可以试试)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux用while循环输出1到10,Linux Shell系列教程之(十一)Shell while循环 | Linux大学...

摘要在上一篇Linux Shell系列教程之(十)Shell for循环中,我们已经对Shell 循环语句的for循环进行了介绍,本篇给大家介绍下Shell 中另一种循环语句:Shell while循环。在上一篇Linux Shell系列教程之(十)Shell for循环中,我们已经对…

存储过程优缺点总结

优点: 1、快速 a、当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQ…

c语言作业重庆科技学院,C语言程序设计学生上机报告-NO3.doc

C语言程序设计学生上机报告-NO3.doc重庆科技学院 上机实验报告(上机操作类) 课程名称 C 语 言 程 序 设 计 实验项目 循环结构程序设计(一) 机房名称 I313 上机时间 2017 年 11 月 19 日 指导老师 焦晓军 上机成绩 学生姓名 曾云 学号 2015441907 专业班级 机电 15-3 一、上机操…

sqlserver 触发器 update_运维日记| SQL server 那点事——DML触发器

各位新朋友~记得先点蓝字关注我哦~11月19日,21点,小编正六指霸屏,决赛圈1V4,忽然,电话响了,这种感觉很熟悉,不错,上次差点推掉对面水晶的那一幕又上演了……作…

linux fb应用例子,Linux下利用framebuffer画点的程序小例子

Linux下利用framebuffer画点的程序小例子:/** ** Filename: framebuffer.c** Description: linux下利用framebuffer画点的程序小例子** Version: 1.0* Created: 2011年02月25日 10时33分29秒* Revision: none* Compiler: …

pb利用datawindow查询符合条件的数据并且过滤掉其他数据_数据质量监测

1 Overview1.1 数据质量在数据部门里,数据质量问题经常是被动发现,所以数据质量的问题是大多数公司数据部门都不得不面对的问题。数据质量校验的目标是监控数据管道中,生产者、处理阶段以及消费者的数据的正确性、一致性和及时性的一项系统工…

PadLeft函数

string num12num.PadLeft(4, 0); //结果为为 0012 看字符串长度是否满足4位,不满足则在字符串左边以"0"补足 转载于:https://www.cnblogs.com/shy1766IT/p/5184937.html

将解决方案和项目放在同一目录中_借助卡第那思3D电子目录,巴鲁夫使用CAE数据扩展其产品目录...

巴鲁夫作为一家中型企业,1921年成立于毗邻斯图加特市的诺伊豪森,80年代初期直至后来很长的一段时间内,巴鲁夫是巴西第一家及唯一一家从事自主生产的传感器制造商。如今巴鲁夫不再仅仅位于诺伊豪森,而是遍布欧洲、亚洲、北美、南美…

c语言math函数 sgn,常用矩阵计算C语言代码

参考资料:行列式:http://zh.wikipedia.org/wiki/行列式#.E4.BB.A3.E6.95.B0.E4.BD.99.E5.AD.90.E5.BC.8F伴随矩阵:http://zh.wikipedia.org/wiki/伴随矩阵余因子矩阵:http://zh.wikipedia.org/wiki/余因子矩阵逆矩阵:h…

pip: The ultimate package manager for Python

安装Package pip install <package name>列出已安装的Package pip list查看已安装的Package的详细信息 pip show <package name>搜索PyPi上的Package pip search <keyword>卸载已安装的Package pip uninstall <package name>转载于:https://www.cnblog…

python调用mysql数据库sql语句过长有问题吗_python连接MYSQL数据库,调用update语句后无法更新数据,解决...

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"云数据库SQL Server&#xff0c;具有企业许可…

c语言结构体出现乱码,结构体数组输出时出现了乱码情况 求大神帮帮看程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#define N 3struct Student{int num;char name[20];int count;}; int useful_poll0;int useless_poll0;int total_poll0;int main(){void input(struct Student stu[]);void print(struct Student stu[]);struct S…

动态创建对象

C#主要支持 5 种动态创建对象的方式&#xff1a;   1. Type.InvokeMember   2. ContructorInfo.Invoke   3. Activator.CreateInstance(Type)   4. Activator.CreateInstance(assemblyName, typeName)   5. Assembly.CreateInstance(typeName)  最快的是方式 3 &…

python公式如何编写_如何编写 Python 程序,资深Python大咖教你玩转Python

如何编写Python程序&#xff0c;这从来就不是一件很难的事。下面我教你保存和运行 Python 程序的标准步骤&#xff0c;如下&#xff1a;对于 PyCharm 用户1. 打开 PyCharm。2. 以给定的文件名创建新文件。3. 输入案例中给出的代码。4. 右键并运行当前文件。注意&#xff1a;每当…

c语言学籍管理系统小程序,学籍业务办理系统(开源 v2.0发布 优化代码,增加小程序端)...

更新说明&#xff1a;1、此2.0版&#xff0c;大幅度优化代码&#xff0c;增加小程序端方便使用2、v1.0测试地址已关&#xff0c;请勿测试学生在校期间避免不了要和各种证明打交道&#xff0c;比如学籍证明、转专业申请、休学申请、退学申请等等。此类业务一般流程都是学生去找老…

Android 下的EXIF

一.什么是Exif Exif(Exchangeable Image File 可交换图像文件)是一种图象文件格式&#xff0c;它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息&#xff0c;包括拍 摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件…

hill密码源代码c语言,古典密码(Hill加密算法)(示例代码)

“Hill的加密与解密”Hill加密是另一种多字母代替密码&#xff0c;与多表代替密码不同的是&#xff0c;Hill密码要求将明文分成同等规模的若干个分组(最后一个分组涉及到填充)&#xff0c;每一个分组被整体的加密代换&#xff0c;即希尔密码属于分组加密。Hill密码的算法思想是…

python背景怎么自定义铃声_Python 上课铃声的定时播放(具有较强的自我管理能力.jpg)...

为了在家安心学习&#xff0c;我决定写一段代码播放上课的铃声。之前中学时就希望有一个这样的软件&#xff0c;周末就可以高效学习了。但是网上搜不到相关软件&#xff0c;当时也不会写代码&#xff0c;就用闹钟来代替了。现在自己写一个试试。原本我是用C写的&#xff0c;但后…

那些地方会用C语言多线程,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …

AWK高级编程 转载

AWK高级编程 转载 转载自&#xff1a;http://blog.csdn.net/wzhwho/article/details/5513791 1. 程序元素 一个awk 程序是一对以模式(pattern) 与大括号框起来的操作(action) 组合而成的&#xff0c;或许&#xff0c;还会加上实现操作细节的函数(function ) 。针对每个匹配于输…