日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2023/12/10 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的天气显示 进程帖的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。