769|3

95

帖子

4

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子Follow me第1期】+ 小猫相框 [复制链接]

  本帖最后由 qwert1213131 于 2023-6-21 20:08 编辑

6月14日

 

项目描述

本项目主要基于树莓派pico w开发板,板子支持wifi连接,由丰富的资源,可以使用micropython语言进行开发。

micropython内置了很多模块,非常方便调用。

项目主要是从网络获取随机的小猫图片,并解析显示到彩屏上。

http://placekitten.com网站有很多各种尺寸的小猫图片,我们可以按照类似 http://placekitten.com/200/300 或http://placekitten.com/g/200/300这样的格式来显示宽200、高300的图片

实际在电脑上打开上面的网址,会发现图片是jpg格式存储的。因此我们还需要一个jpeg解析库来获取真实的像素数据,方便我们在屏幕上画点。

为了让屏幕显示不同的图片,需要调整长宽值,来获取不同的尺寸,做到图片变化的效果。

本项目主要用到了network、urequests、random、spi、time、gc等内置模块,还用到了大神们已经写好的JPEGdecoder和st7789py库。

由于rp2040的ram有限,为了防止读取网站图片和解析图片的失败,图片的尺寸限制在100x100左右。

目前所用的彩屏是1.3寸 240x240分辨率的,因此对获取到的图片做了放大处理。

 

主要代码详解

初始化彩屏,使用硬件spi

from machine import Pin,SPI
import st7789py as st7789
spi = SPI(0, baudrate=20_000_000, polarity=1, phase=1, bits=8, sck=Pin(6), mosi=Pin(7), miso=Pin(4))
​
tft = st7789.ST7789(
        spi,
        240,
        240,
        reset=Pin(9, Pin.OUT),
        cs=Pin(5, Pin.OUT),
        dc=Pin(8, Pin.OUT),
        backlight=Pin(13, Pin.OUT),
        rotation=0)
​
tft.fill(st7789.BLACK)      # clear screen

 

通过network模块,连接wifi

import network 
import time
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('ssid','pass')
while not wlan.isconnected() and wlan.status()>=0:
    print("Waiting to connect:")
    time.sleep(1)
print(wlan.ifconfig())

 

通过urequests模块,访问网站,高度由random模块生成

import urequests
import random
​
html = "http://placekitten.com/{0}/{1}"
WIDTH=100
HEIGHT = 100+random.randint(0,10)
html = html.format(WIDTH,HEIGHT)
print(html)
r = urequests.get(html)
# print(r)
# print(r.content)  # 返回响应的内容

 

将获取到的内容解析出来,图片质量目前设置的是4,会有一些质量损失

from JPEGdecoder import jpeg
​
jpeg(r.content,4,callback=draw ).render(10, (120-HEIGHT)>>1)
print("T:%d" % time.ticks_ms())
print(gc.mem_free())

 

解析并显示的过程中使用了回调函数draw

def rgb24_to_rgb565(color24):
    r = (color24>>16) &0xff
    g = (color24>>8) &0xff
    b = (color24>>0) &0xff
​
    r = (r >> 3) & 0x1F
    g = (g >> 2) & 0x3F
    b = (b >> 3) & 0x1F
    return (r << 11) | (g << 5) | b
​
def draw(x,y,color):
#     tft.pixel(x,y,rgb24_to_rgb565(color))
    tft.rect(x*2,y*2,2,2,rgb24_to_rgb565(color))
​
print("T:%d" % time.ticks_ms())

 

最终我们就得到了小猫图片

 

 

任务

任务1:熟悉micropython的基本语法

向Raspberry Pi Pico w开发板烧写固件

在插入usb之前,按住BOOTSEL按钮,然后插入usb,就会出现一个盘符为RPI-RP2的U盘。 

 打开INFO_UF2.TXT,里面记录了板子的一些信息   点击U盘中的HTM文件,则会跳转到树莓派的网站,可以查看开发板的相关资源

 

点击上图的MicroPython则可以跳转到页面并下载相关固件

 

下载的固件是uf2格式的文件,将其拖入到u盘中,传输完成后,开发板就会自动重启

安装Mu软件,去官网下载安装即可

https://codewith.mu/en/

 点击REPL按钮可看到如下信息

 至此,开发板就已经可以正常使用micropython来开发了。

Hello World

想要通过串口打印hello world,则只要调用print函数即可,简直不要太简单了

print('Hello World')








  

1s间隔打印一次

import time

while True:
    print('Hello World')
    time.sleep(1.0)

 

 

使用for循环遍历列表

list_fruit_cn = ['苹果','桔子','樱桃','香蕉']
for fruit in list_fruit_cn:
   print(fruit)

 

任务2:驱动外设

使用Pin模块来驱动led闪烁

from machine import Pin
import time

led = Pin('LED',Pin.OUT)

while True:
  led.toggle()
  time.sleep(0.5)

 

 

驱动OLED,使用I2C模块

使用ssd1306库

链接已隐藏,如需查看请登录或者注册

from machine import Pin, I2C
i2c1 = I2C(1,sda=Pin(6), scl=Pin(7))
​
from ssd1306 import SSD1306_I2C
oled = SSD1306_I2C(128, 64, i2c1)
​
import time
​
oled.fill(1)
oled.show()
time.sleep(1.0)
​
oled.fill(0)
oled.show()
time.sleep(1.0)
​
​
oled.text('Hello', 0, 0)
oled.text('World', 0, 10)
oled.show()

 

驱动蜂鸣器

将gpio16引脚连接无源蜂鸣器,使用PWM模块来驱动发声

from machine import Pin, PWM
import utime
​
pwm0 = PWM(Pin(16))      # create PWM object from a pin
pwm0.freq()             # get current frequency
pwm0.freq(1000)         # set frequency
pwm0.duty_u16()         # get current duty cycle, range 0-65535
pwm0.duty_u16(1000)      # set duty cycle, range 0-65535
​
utime.sleep(1.0)
pwm0.deinit()           # turn off PWM on the pin

任务3:同步网络时间

使用network模块来配置和连接网络

import network
import time

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('wifi','pass')

while not wlan.isconnected() and wlan.status()>=0:
    print("Waiting to connect:")
    time.sleep(1)
    
print(wlan.ifconfig())
 







  

 通过ntptime模块来获取网络时间

import ntptime


while True:   
    try:
        print('获取时间中')     
        ntptime.host = 'ntp1.aliyun.com' 
        ntptime.settime()
        print('成功获取')
        break
    except:
        print('获取失败')
        time.sleep(1)
        
while True:
    print(time.localtime())
    time.sleep(1.0)

 

 

 

任务4:实现定位功能

定位解析使用了大佬的库

链接已隐藏,如需查看请登录或者注册

主要使用了UART模块,与Air530模块进行通信

from machine import Pin, I2C, UART
i2c1 = I2C(1,sda=Pin(6), scl=Pin(7))

from ssd1306 import SSD1306_I2C
oled = SSD1306_I2C(128, 64, i2c1)

import time


oled.fill(0)
oled.text('GPS', 0, 0)
oled.show()
time.sleep(1.0)

import hashlib
from micropyGPS import MicropyGPS
my_gps = MicropyGPS(local_offset=8)

uart0 = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))

while True:
    if uart0.any()>0:
#         print(uart0.read(1))
        state = my_gps.update(uart0.read(1).decode('utf-8'))
        if state:
            state = None
            oled.fill(0)
            lat_disp = my_gps.latitude_string()
            oled.text(lat_disp,5,10)
            lon_disp = my_gps.longitude_string()
            oled.text(lon_disp,5,20)
            date_disp = my_gps.date_string('s_mdy')
            oled.text(date_disp,5,30)            
            time_disp = str(my_gps.timestamp[0]) +':'+str(my_gps.timestamp[1])+':'+str(my_gps.timestamp[2])
            oled.text(time_disp,5,40)            
            oled.show()

 

 

活动总结

这个活动非常棒,体验了一把使用micropython开发的优势。以前做单片机开发,基本都是编译下载,非常耗时,调试也不是很方便。

最近迷上了micropython,还需要多做一些实践,进行一些项目开发,加深对micropython的使用度。

小猫相框,如果使用墨水屏就更好了,可惜手里没有,就先拿彩屏代替下了。实现思路上都是一样的。

非常感谢EEworld和得捷电子,非常不错的活动。

希望下次活动早日公布日程,我还想继续参加。

 

相关源代码

codes.zip (22.63 KB, 下载次数: 0)

 

最新回复

GOOG job   详情 回复 发表于 2023-6-23 12:35
点赞(1) 关注
 
 

回复
举报

6593

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

这个小猫相框漂亮,用micropython编程开发真是好

 
 
 

回复

6075

帖子

7

TA的资源

版主

板凳
 

那个高分辨率的屏可能效果更好  

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

159

帖子

0

TA的资源

一粒金砂(中级)

4
 

GOOG job

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表