[作品提交] 【得捷电子Follow me第2期】+ 作业提交帖

manhuami2007   2023-10-14 11:07 楼主

今天完成了本期活动的全部内容,这次活动使用的是feather esp-s3 tft开发板。通过circuitPython编写代码。

内容一:演示视频


 

内容二:项目总结报告

任务1:控制屏幕显示中文: 完成屏幕的控制,并且能显示中文

首先需要去官网上下载官方的库文件,然后导入到开发板中。官方库的下载地址是:Libraries (circuitpython.org) 有的时候这个地址不好用,需要换个时间再试一试。

然后导入的开发板中,怎么导入呢,其实很简单,当开发板接上电脑后,会识别出一个U盘,打开U盘,将相应的库文件放入到lib文件夹里就可以了。

image.png  

当然还需要下载中文字库文件,参考其他大神的代码,用的都是PCF格式的,从下面的网站上下载:https://github.com/carrothu-cn/chinese-bitmap-fonts

我用的是wenquanyi_9pt.pcf这个文件,同样将其放入到U盘中。字库文件比较大,2M多,几乎将开发板的内存占满了。

代码如下:

import board
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
import time

def show_chinese(word):
    font = bitmap_font.load_font("\wenquanyi_9pt.pcf")
    test_area = label.Label(font,text = word)
    test_area.x = 93
    test_area.y = 62
    display.show(test_area)

display = board.DISPLAY
while True:
    show_chinese("大家好")
    time.sleep(1)
    show_chinese("这是Follow me 第2期")
    time.sleep(1)
    show_chinese("必做任务1")
    time.sleep(1)
    show_chinese("中文显示")
    time.sleep(1)

image.png  

任务2:网络功能使用(必做任务):完成网络功能的使用,能够创建热点和连接到WiFi

创建热点的方法很简单,方法如下:

import wifi
wifi.radio.start_ap("manhuami2007","11111111")

这样就能够搜索到SSID为manhuami2007的wifi了,后面的就是密码。

连接wifi的方法也很简单:

import wifi
wifi.radio.connect("ssid","password")
print(f"Ip: {wifi.radio.ipv4_address}")

当连接上wifi后,可以通过PC去ping开发板。

image.png  

既然能够联网了,自然要建立一个TCP/IP的服务器实现通信功能。在cpy里要用到socketpool这个核心模块,其参考文档如下:

socketpool — CircuitPython中文网 7.0.0 文档

通过下面代码连接PC端的TCP服务器,并将服务器发送的数据显示在终端上。

import wifi
import socketpool


wifi.radio.connect("505","75057505")
print(f"Ip: {wifi.radio.ipv4_address}")

pool = socketpool.SocketPool(wifi.radio)
sock = pool.socket(pool.AF_INET,pool.SOCK_STREAM)
sock.connect(("192.168.2.216",502))
sock.send(b"hello")


while True:
    buf = bytearray(20)
    len = sock.recv_into(buf)    
    print(bytearray.decode(buf))

任务3:控制WS2812B:使用按键控制板载Neopixel LED的显示和颜色切换

板载的ws2812b需要引入neopixel库,这个库跟任务一里的一样,需要导入到开发板中。

这里实现ws2812b随机显示颜色的代码:

import neopixel
import time
import board
import random

pixel = neopixel.NeoPixel(board.NEOPIXEL,1)
pixel.brightness = 0.3
a=b=c=0
while True:
    pixel.fill((a%255,b%255,c%255))
    a = int(random.random()*256)
    b = int(random.random()*256)
    c = int(random.random()*256)
    time.sleep(0.2)
    
pixel.fill((255,0,0))
time.sleep(2)

任务4:日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息

这个功能主要是参考论坛其他大神的代码。在代码中用到了adafruit_requests库,通过这个库获取天气和时间信息。代码中有2个地方需要修改,1是wifi的信息,2是city_code,city code是城市编码,用于指定获取哪个城市的天气。这个代码可以从中国天气网查找。

import board, os, wifi
import time
import ssl
import socketpool
import adafruit_requests
from adafruit_display_text import label, wrap_text_to_lines
from adafruit_bitmap_font import bitmap_font


def refresh_screen(print_text):
    text_area = label.Label(font, text=print_text, scale=1)
    text_area.x = 5
    text_area.y = 15
    text_area.scale = 1
    text_area.color = color
    display.show(text_area)

def get_data():
    try:
        response = requests.get(JSON_TIME_URL)
    except ConnectionError as e:
        print("Connection Error:", e)
        print("Retrying in 60 seconds")
    time_data = response.json()['sysTime2'][:-3]
    try:
        city_code = "101090901"
        url = JSON_weather_URL.format(city_code)
        response = requests.get(url)
    except ConnectionError as e:
        print("connect error:{},retry in 60s".format(e))
    weather_data = response.json()
    cityInfo = weather_data['cityInfo']
    city_weather = weather_data['data']
    forecast = city_weather['forecast']
    dis_str = cityInfo['parent'] + ' '+ cityInfo['city'] + ' ' + forecast[0]['week']
    dis_str += "\n时间:"+time_data
    dis_str += "\n温度:"+city_weather['wendu']+"℃"
    dis_str += " 湿度:" + city_weather['shidu']
    dis_str += '\n空气质量:' + city_weather['quality']
    return dis_str



wifi.radio.connect("505", "75057505")

display = board.DISPLAY
display.brightness = 1
display.rotation = 0
font = bitmap_font.load_font("wenquanyi_9pt.pcf")
color = 0xFFFFFF

JSON_TIME_URL = "http://quan.suning.com/getSysTime.do"
JSON_weather_URL = "http://t.weather.sojson.com/api/weather/city/{}"

pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
while True:
    info = get_data()
    refresh_screen(info)
    time.sleep(60)

心得

很高兴能够参加这次的活动,这次活动用到了cpy,这个是以前没有接触过的。而且看其它坛友的帖子,发现这次大家实现的方式都很不一样,除了cpy以外,有的是arduino,有的是platformio。有些百花齐放的感觉,增长了见识。这次的开发板虽然小巧,但是功能齐全,板载资源丰富,只依靠开发板上的资源就能够完成全部的测评任务,减小了学习的难度。还有乔大神的细心讲解,提供了不一样的编程方法和思路。感谢得捷和eeworld论坛的活动,接下来就是争取参加第3期活动。

内容三:可编译下载的代码

得捷Follow me第二期.zip (1.98 KB)
(下载次数: 2, 2023-10-13 19:04 上传)
本帖最后由 manhuami2007 于 2023-10-14 11:06 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复