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的固件来完成,对空间和内存有一定要求,可以试试)
micropython lcd触摸屏显示中文_基于Micropython的天气显示 进程帖相关推荐
- pandas 做柱状图 显示中文_官方调研重磅发布,Pandas或将重构?
为指引 Pandas 未来开发方向,Pandas 官方团队于 2019 年夏搞了一次调研,这次调研历时 15 天,共有 1250 条反馈数据.问卷数据保存在 data 文件夹的 2019.csv.zi ...
- 8乘8led点阵显示数字_基于51单片机的8乘8LED点阵显示屏的设计
1 基于单片机的 8*8LED 点阵显示屏的设计 随着单片机在各个领域的广泛应用,许多用单片机作控制驱动 LED 显示屏也应运产生.本系统设 计使用单片机 MCS-51 控制扫描方法实现 LED 点阵 ...
- python图片显示中文_解决Python pandas plot输出图形中显示中文乱码问题
解决方式一: import matplotlib #1. 获取matplotlibrc文件所在路径 matplotlib.matplotlib_fname() #Out[3]: u'd:\\Anaco ...
- c51时钟数码管显示流程图_基于单片机89C51的数码管显示时钟设计.doc
基于单片机89C51的数码管显示时钟设计 基于单片机的数字时钟 摘 要单片机在多功能数字钟中的应用已是非常普遍的,人们对数字钟的功能及工作顺序都非常熟悉.但是却很少知道它的内部结构以及工作原理.由单片 ...
- linux命令框显示中文乱码_CentOS终端命令行显示中文乱码的解决方法
这篇文章主要介绍了CentOS终端命令行显示中文乱码的解决方法,以及测试方法和缺少中文字体时的解决方法,需要的朋友可以参考下 安装CentOS的时候选择了中文,结果在终端不能显示中文,都是乱码,解决方 ...
- micropython中文社区 socket通讯_基于MicroPython结合ESP8266模块实现TCP通信(AT指令版)...
转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 实验目的 - 学习ESP8266模块(ESP-01) ...
- micropython中文社区 socket通讯_基于micropython的TCP客户端编程
python概述 python现在是一门比较火的语言,如果能够使用python编写嵌入式的应用程序,那该有多好呀,现在micropython软件框架的出现,使得python进入了嵌入式领域. pyth ...
- python画心电图_基于MicroPython:TPYBoard心率监测器
转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 一.前言 这几年智能穿戴设备大火,尤其是手环类,从A ...
- python 串口时钟校对_基于MicroPython的自动网络时间校准器
前言 之前使用TPYBoard v202(主控ESP8266模块)开发板做过一款WIFI攻击神器,一开始使用Arduino源码做的,后来又接触到micropython.觉得使用micropython真 ...
最新文章
- mysql金库模式_Python vault-anyconfig包_程序模块 - PyPI - Python中文网
- python requirements.txt_python生成requirements.txt的两种方法
- DIV与Table布局在大型网站的可用性比较
- linux kill命令信号,linux kill命令详解
- mysql isolation_mysqltx_isolation
- BZOJ 2733: [HNOI2012]永无乡
- plugin.super mysql_使用MySQ Clone Plugin部署MySQL Group Replication
- adapter java_Java 实现适配器(Adapter)模式
- 简单博弈(java)
- 计算机基础——网卡(网络适配器network adaptor)
- 如何批量将 jpg 图片转换为 png 格式
- 无法更新 EntitySet“Ips_Articles”,因为它有一个 DefiningQuery,而 ModificationFunctionMapping 元素中没有支持当前操作的 Inse...
- astar不能用了_解锁不可切除肝癌治疗的新时代——“T+A”北美上市会纪要
- Docker 图片水印中文乱码显示为方框, 设置Docker容器字体
- android 禁用触摸屏,Touch Protector-安卓禁用手机触摸屏软件
- 中国蚁剑的下载以及安装教程
- 数据库的一些基础知识
- 马哥2016linux就业班+架构班+运维班全套
- OCI runtime create failed: runc create failed: unable to start container process: --docker加载镜像
- CentOS7.9安装nexus-3.20.1-01-unix.tar.gz
热门文章
- 小程序 遮照 mask 背景透明,里面内容不透明
- 会移动的文字(Marquee)
- Linux日志高频使用命令
- 1011 A+B 和 C (15分)
- mysql的 怎么处理_本人的MySQL连接到底怎么处理才好……
- 【C语言进阶深度学习记录】十九 #pragma使用与分析
- 【剑指offer - C++/Java】8、跳台阶
- 【OS学习笔记】十 实模式:实现一个程序加载器-程序加载器如何将用户程序加载到内存并执行
- The 2018 ACM-ICPC上海大都会赛 J Beautiful Numbers (数位DP)
- 设计模式 策略模式2 c++11