各位晚上好,我是新人up。第一次玩circuitpython,本来不想来的,但是铁子偶然间查到咱们EEWORLD和digikey举办的follow me2活动,愣是要上,没办法打仗亲兄弟,所以来了。技术不好,见谅,但是绝对认真完成任务。
本次活动使用adafruit组织的circuitpython语言。circuitpython语言属于micropython分支,adafruit的主板对于cpy都准专门优化的优化。所以此次必然选择circuitpython语言来完成编程。以下是技术正文
一、项目介绍
1.项目目的介绍:
本次任务需要完成三个必选目标和一个可选目标即:
1)屏幕输出汉字
2)wifi功能,wifi连接和广播
3)板载多彩led灯配合按键展示
4)*选择任务
完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息
所需硬件:Adafruit ESP32-S3 TFT Feather
2.项目结构介绍:
本次任务比较简单,所以采用“小霸王合集”形式,即一次性代码实现所有功能。以下是程序部分
import board, displayiortc, wifi, ssl,rtc, wifi
import time as Time
import socketpool
import neopixel
from digitalio import DigitalInOut, Direction, Pull
import adafruit_imageload
import adafruit_ntp
import adafruit_requests
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
1)首先引入必须的包,其中主板驱动,时钟,wifi,ssl连接池,多彩led驱动,屏幕文字,图片驱动等
#以下代码在根目录settings.toml文件夹中
#连接已知wifi
CIRCUITPY_WIFI_SSID = "自己的wifi热点名称"
CIRCUITPY_WIFI_PASSWORD = "自己的wifi热点密码"
#以下代码在code.py中
##任务 创建热点
wifi.radio.start_ap('Follow_me_wifi', 'EEworld12345678')
print("Wifi raido begin")
2)关于任务2 wifi任务的代码部分的讲解,只需要四行代码,即可完成wifi的连接和ap广播
##任务3(板载RGB) 基础设置
pixel_pin = board.NEOPIXEL
pixels = neopixel.NeoPixel(pixel_pin, 1, brightness=0.2, auto_write=False) #定义像素
def pixelsetcolor(c):#改变颜色函数,针对单个像素量身定制
pixels[0] = c
pixels.show()
#设置按钮
btn = DigitalInOut(board.BOOT0)
btn.direction = Direction.INPUT
btn.pull = Pull.UP
color = 0#控制rgb
#以下代码在while主循环里面
##任务(RGB) 循环颜色
if not btn.value:
if color % 3 == 0:
pixelsetcolor(0xFF0000)
print("Pixel is R")
elif color % 3 == 1:
pixelsetcolor(0x00FF00)
print("Pixel is G")
elif color % 3 == 2:
pixelsetcolor(0x0000FF)
print("Pixel is B")
color += 1
else:
pass
Time.sleep(0.5)#灯光保持0.5秒
3) 关于任务3 板载多彩LED的代码,其中l多彩led显示3种不同颜色,用按键来激活灯光的颜色(除3的余数对应RGB)
##任务4-天气&时钟代码
display = board.DISPLAY #初始化屏幕
display.rotation = 90 #屏幕旋转90度
group = displayio.Group() #定义显示组别
# 加载图片
image, palette = adafruit_imageload.load("/img/snake.bmp")
# 是否开启透明
palette.make_transparent(1)
# 创建图片布局
grid = displayio.TileGrid(image, pixel_shader=palette,width=1, height=1)
# 将图片布局添加到图像组,由于是第一个添加的,默认是最下层
group.append(grid)
#加载必要字体
font = bitmap_font.load_font("/font/sytq_16.pcf")#此字体为群友龙哥制作
#加载文字标签函数
def labletext(x, y, text, font=font, color=0x0000FF,scale=1):
return label.Label(font, text=text, color=color, x=x, y=y,scale=scale)
#将文字添加到显示组
#设置文字标签
date = labletext(0, 100, "0月0日",color=0x0000FF)
day = labletext(95, 100, "周八",color=0x0000FF)
time = labletext(0, 125, "00:00:00",color=0x00FFFF)
weather = labletext(0, 160, "?+/",color=0xFFFFFF,scale=2)
temp = labletext(60, 200, "00°",color=0xFFFFFF,scale=2)
#加入显示组
group.append(date)
group.append(day)
group.append(time)
group.append(weather)
group.append(temp)
# 联网获取时间与天气信息
pool = socketpool.SocketPool(wifi.radio) #初始化
ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com") #校正时间
rtc.RTC().datetime = ntp.datetime #校正时间
requests = adafruit_requests.Session(pool, ssl.create_default_context()) #定义请求
def get_weather():#获取天气函数
city = "325600"#地区代码
key = "1joijinji23ji23257k7kj56h7k5"#此处自行填写
url = "https://restapi.amap.com/v3/weather/weatherInfo?city=" + city + "&key=" + key
response = requests.get(url)#获取
json_resp = response.json()
response.close()
return json_resp["lives"][0]["temperature"], json_resp["lives"][0]["weather"]#提取参数
#以下代码在while主循环里面
##任务4 自动刷新标签
n = Time.localtime()
if (state == "init" or n.tm_min == 0):
date.text = "%d月%d日" % (n.tm_mon, n.tm_mday)
day.text = days[n.tm_wday]
t, w = get_weather()
weather.text = w+'/'
temp.text = "%s°" % (t)
state = "running"
#每次循环刷新
time.text = "%02d:%02d:%02d" % (n.tm_hour, n.tm_min, n.tm_sec)
display.show(group)
4)关于任务1&任务4的综合代码,因为天气时钟自然包括汉字显示。首先确定显示的图片设置(大小位置等),确定文本显示信息,但是文本屏幕的输出函数display.show(group)在while主循环里面。
二、成果展示
图示
【得捷电子Follow me第2期】小霸王合集-EEWORLD大学堂
视频
三、总结
经过本次得捷电子Follow me第2期 的学习,使我学习了更快速高质量的单片机开发方式。真的收获满满!下次还要多介绍几个同学来学习
四、代码附件