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的天气显示 进程帖的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 轮胎墓地一次火灾烧掉100万个!科威特为
- 下一篇: RTX30挖矿被破解 NVIDIA新驱动