本帖最后由 lugl4313820 于 2023-12-16 18:46 编辑
【得捷Follow me第3期】项目总结
【前言】
感谢EEWORLD论坛、得捷电子组织的这次Follow me第3期活动,这次活动使用的开发是Seeed Studio XIAO ESP32C3 以及 扩展版。这款开发板使用的主控芯片是Espressif ESP32-C3 Wi-Fi/蓝牙双模芯片。在通过官方提共的示例的学习中,我掌握了这款开发板的固件下载、开发环境搭建、OLED驱动与汉字的显示、wif联网、从国外、国内获取日期时间、或取环境温湿度、环境光环境器,收获非常大。
第一部分:视频介绍
视频太长了,分了几部分上传:
第二部分:任务提交/项目总结
【任务1】:使用MicroPython系统
- 这次的任务主要是学习使用如何查找这款开发板的资料,完成开发环境的创建,然后从官网下载固件,并烧写到开发板,同时在电脑上安装好micropython的开发环境thonny。我是按照下如步骤完成的:
- 下载esptool:git clone
- 下载固件:https://micropython.org/download/esp32c3/
- 安装idf,教程在网址:
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/get-started/
- 连接好开发板后清除一下flash:
- 下载固件到开发板上:python.exe esptool.py --chip esp32c3 --port COM7 --baud 460800 write_flash -z 0x0 ESP32_GENERIC_C3-20231005-v1.21.0.bin
- 下载后打开thonny输入连接选择开发板。从菜单“运行”-选择解释器为esp32,选择相应的端口。
- 在终端输入print(“hello world”),回车后输入hello world。这样就完成了任务1。
【任务1总结】 这个任务是所有的任务中最难的,主要是idf工个的下载,这需要有python的知识、环境变量设置的知识,当idf安装好,如果环境变量没有设置好,再次开机就会没有idf了。
【任务2】OLED显示文本和汉字
1、下载ssd1306包
下载好后,我们把这个文件上传到开发板:
2、在boot.py主程序中,我们编写代码如下:
from machine import Pin, SoftI2C
import ssd1306py as lcd
import math
# ESP8266 Pin assignment
i2c = SoftI2C(scl=Pin(7), sda=Pin(6)) # Adjust the Pin numbers based on your connections
lcd.init_i2c(7,6,128,64)
lcd.text('font8x8', 0, 0, 8)
font16 = {
0xe4bda0:
[0x08, 0x08, 0x08, 0x11, 0x11, 0x32, 0x34, 0x50, 0x91, 0x11, 0x12, 0x12, 0x14, 0x10, 0x10, 0x10, 0x80, 0x80,
0x80, 0xFE, 0x02, 0x04, 0x20, 0x20, 0x28, 0x24, 0x24, 0x22, 0x22, 0x20, 0xA0, 0x40], # 你
0xe5a5bd:
[0x10, 0x10, 0x10, 0x10, 0xFC, 0x24, 0x24, 0x25, 0x24, 0x48, 0x28, 0x10, 0x28, 0x44, 0x84, 0x00, 0x00, 0xFC,
0x04, 0x08, 0x10, 0x20, 0x20, 0xFE, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xA0, 0x40] # 好
}
lcd.set_font(font16, 16)
lcd.text('font16x16', 0, 20, 16)
lcd.text_cn("你好", 0, 40, 16)
lcd.show()
- 上传后效果如下:
EEWORLDIMGTK6
【任务2小结】这任务主要是实现ssd1306包的安装,我按照官方的教程,下载pipy包一直不成功,最后只有手动下载包,并上传到开发板。还有就是汉字的处理,也需要学习很久。
【任务3】任务3控制蜂鸣器播放音乐
在扩展板上有蜂鸣器,找到原理图,查看接在了pin5上。然后引入machine包,配置好bzzer_pin,使用machine的pwm来配置频率与占空比。就可以实现对蜂鸣器的响度了,然后在网上下载到了成品的曲谱,从而完成了播放音乐的功能
- pwm的频率决定音调,根据资料定义音谱频率如下:
# Defining frequency of each music note
NOTE_C4 = 262
NOTE_D4 = 294
NOTE_E4 = 330
NOTE_F4 = 349
NOTE_G4 = 392
NOTE_A4 = 440
NOTE_B4 = 494
NOTE_C5 = 523
NOTE_D5 = 587
NOTE_E5 = 659
NOTE_F5 = 698
NOTE_G5 = 784
NOTE_A5 = 880
NOTE_B5 = 988
- 根据乐谱,制定如下频率表:
# Music notes of the song, 0 is a rest/pulse
notes = [
NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0,
NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
NOTE_A4, NOTE_G4, NOTE_A4, 0,
NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0,
NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
NOTE_A4, NOTE_G4, NOTE_A4, 0,
NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0,
NOTE_A4, NOTE_C5, NOTE_D5, NOTE_D5, 0,
NOTE_D5, NOTE_E5, NOTE_F5, NOTE_F5, 0,
NOTE_E5, NOTE_D5, NOTE_E5, NOTE_A4, 0,
NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
NOTE_D5, NOTE_E5, NOTE_A4, 0,
NOTE_A4, NOTE_C5, NOTE_B4, NOTE_B4, 0,
NOTE_C5, NOTE_A4, NOTE_B4, 0,
NOTE_A4, NOTE_A4,
#Repeat of first part
NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
NOTE_A4, NOTE_G4, NOTE_A4, 0,
NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0,
NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
NOTE_A4, NOTE_G4, NOTE_A4, 0,
NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0,
NOTE_A4, NOTE_C5, NOTE_D5, NOTE_D5, 0,
NOTE_D5, NOTE_E5, NOTE_F5, NOTE_F5, 0,
NOTE_E5, NOTE_D5, NOTE_E5, NOTE_A4, 0,
NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
NOTE_D5, NOTE_E5, NOTE_A4, 0,
NOTE_A4, NOTE_C5, NOTE_B4, NOTE_B4, 0,
NOTE_C5, NOTE_A4, NOTE_B4, 0,
#End of Repeat
NOTE_E5, 0, 0, NOTE_F5, 0, 0,
NOTE_E5, NOTE_E5, 0, NOTE_G5, 0, NOTE_E5, NOTE_D5, 0, 0,
NOTE_D5, 0, 0, NOTE_C5, 0, 0,
NOTE_B4, NOTE_C5, 0, NOTE_B4, 0, NOTE_A4,
NOTE_E5, 0, 0, NOTE_F5, 0, 0,
NOTE_E5, NOTE_E5, 0, NOTE_G5, 0, NOTE_E5, NOTE_D5, 0, 0,
NOTE_D5, 0, 0, NOTE_C5, 0, 0,
NOTE_B4, NOTE_C5, 0, NOTE_B4, 0, NOTE_A4
]
- 而延时决定声音的长短。我们根据乐谱制作时序如下表:
# Durations (in ms) of each music note of the song
# Quarter Note is 250 ms when songSpeed = 1.0
durations = [
125, 125, 250, 125, 125,
125, 125, 250, 125, 125,
125, 125, 250, 125, 125,
125, 125, 375, 125,
125, 125, 250, 125, 125,
125, 125, 250, 125, 125,
125, 125, 250, 125, 125,
125, 125, 375, 125,
125, 125, 250, 125, 125,
125, 125, 250, 125, 125,
125, 125, 250, 125, 125,
125, 125, 125, 250, 125,
125, 125, 250, 125, 125,
250, 125, 250, 125,
125, 125, 250, 125, 125,
125, 125, 375, 375,
250, 125,
#Rpeat of First Part
125, 125, 250, 125, 125,
125, 125, 250, 125, 125,
125, 125, 375, 125,
125, 125, 250, 125, 125,
125, 125, 250, 125, 125,
125, 125, 250, 125, 125,
125, 125, 375, 125,
125, 125, 250, 125, 125,
125, 125, 250, 125, 125,
125, 125, 250, 125, 125,
125, 125, 125, 250, 125,
125, 125, 250, 125, 125,
250, 125, 250, 125,
125, 125, 250, 125, 125,
125, 125, 375, 375,
#End of Repeat
250, 125, 375, 250, 125, 375,
125, 125, 125, 125, 125, 125, 125, 125, 375,
250, 125, 375, 250, 125, 375,
125, 125, 125, 125, 125, 500,
250, 125, 375, 250, 125, 375,
125, 125, 125, 125, 125, 125, 125, 125, 375,
250, 125, 375, 250, 125, 375,
125, 125, 125, 125, 125, 500
]
结合以上三个数组,做播放声音程序如下:
def play_song():
total_notes = len(notes)
for i in range(total_notes):
current_note = notes
wait = durations
if current_note != 0:
buzzer.duty(512) # Set duty cycle for sound
buzzer.freq(current_note) # Set frequency of the note
else:
buzzer.duty(0) # Turn off the sound
time.sleep_ms(wait)
buzzer.duty(0) # Turn off the sound
【任务小结】这部分任务主要的难点是如何配置pwm的点空比与频率,频率决定音调如哆是262,再升半拍是294等,不过网上有很多介绍。还有就是节拍的长短,这也是制作曲谱的知识点之一。
【任务4】联网获取时间
Esp32c3 带有wifi接口,在使用连网我们需要引入network、urequests两个库。
做为station模式,我们需要配置station为network.WLAN(network.STA_IF),启用station.connected()来启用联网。下面是一个获取New_York的日期时间的例子。具体的实现是先引入network、urequests包发送http请求后,从返回的字符串口获取需要的时间,在oled中展示:
import machine
import time
from machine import Pin, SoftI2C
import ssd1306py as lcd
from time import sleep
import time
import network
import urequests
import ujson
i2c = SoftI2C(scl=Pin(7), sda=Pin(6)) # Adjust the Pin numbers based on your connections
lcd.init_i2c(7,6,128,64)
lcd.text('PLAY SONG', 10, 10, 16)
lcd.show()
station = network.WLAN(network.STA_IF)
station.active(True)
# Network settings
wifi_ssid = "你的路由器名称"
wifi_password = "wifi密码"
url = "http://worldtimeapi.org/api/timezone/America/New_York"
print("Scanning for WiFi networks, please wait...")
authmodes = ['Open', 'WEP', 'WPA-PSK' 'WPA2-PSK4', 'WPA/WPA2-PSK']
for (ssid, bssid, channel, RSSI, authmode, hidden) in station.scan():
print("* {:s}".format(ssid))
print(" - Channel: {}".format(channel))
print(" - RSSI: {}".format(RSSI))
print(" - BSSID: {:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}".format(*bssid))
print()
# Continually try to connect to WiFi access point
while not station.isconnected():
# Try to connect to WiFi access point
print("Connecting...")
station.connect(wifi_ssid, wifi_password)
time.sleep(10)
# Display connection details
print("Connected!")
print("My IP Address:", station.ifconfig()[0])
while True:
# Perform HTTP GET request on a non-SSL web
response = urequests.get(url)
# Check if the request was successful
if response.status_code == 200:
# Parse the JSON response
data = ujson.loads(response.text)
# Extract the "datetime" field for New York
ny_datetime = data["datetime"]
# Split the date and time components
date_part, time_part = ny_datetime.split("T")
# Get only the first two decimal places of the time
time_part = time_part[:8]
# Get the timezone
timezone = data["timezone"]
# Clear the OLED display
lcd.clear()
# Display the New York date and time on separate lines
lcd.text("New York Date:", 0, 0, 8)
lcd.text(date_part, 0, 10,8)
lcd.text("New York Time:", 0, 20,8)
lcd.text(time_part, 0, 30,8)
lcd.text("Timezone:", 0, 40,8)
lcd.text(timezone, 0, 50,8)
# Update the display
lcd.show()
time.sleep(10)
else:
lcd.text("Failed to get the time for New York!",0,0,8)
# Update the display
lcd.show()
效果如下:
【任务小结】
micorpython的固件集成了wifi的联网模块,使用起来非常方面。这个任务的难点是要有wifi的联网模块的使用经验,如何配置wifi的ssd与pwd,还有就是从哪个站点获取,获取回来的数据如何解析。这个模块,我主要学习到了,使用wifi、urequests、json的使用。当然这里获取的是纽约的时间,如果需要获取国内的时间,可以从国内的天气站获取到。
【任务5】 传感器使用
这次我买的传感器是ATH20与光传感器。
ath20的任务主要是安装他的驱动库,我从pipy官方可下载到了库后解压出来,当然也可以通过thony进行安装,我这里直接考进开发板进行使用:
光传器,光传感器获取到的是一个ADC的电压值,我们直接驱动IO为模拟输入,然后读取他的植,进行换算就可以了,具体代码如下:
import machine
import time
from machine import Pin, SoftI2C
import ssd1306py as lcd
from time import sleep
import time
import network
import math
import ahtx0
# 光照部分
adc = ADC(Pin(2))
adc.atten(ADC.ATTN_11DB)
adc.width(ADC.WIDTH_12BIT) #4095
oled_width = 128
oled_height = 64
i2c = SoftI2C(scl=Pin(7), sda=Pin(6)) # Adjust the Pin numbers based on your connections
lcd.init_i2c(7,6,oled_width,oled_height)
machine.freq(160000000) # Set CPU frequency to 160 MHz
lcd.clear()
lcd.text('Starting up...', 0, 16, 8)
lcd.show()
aht20 = ahtx0.AHT20(i2c)
while True:
lcd.clear()
temperature="T:%0.2f C" % aht20.temperature //获取温度值
humidity="H:%0.2f %%" % aht20.relative_humidity //获取湿度值。
# 计算光照强度单位Lux
light_lux = "L:%0.1f" % (light_adc * 350 * 1.0 / 4095)
lcd.text(temperature,10,16,8)
lcd.text(humidity,10,24,8)
lcd.text(light_lux,64,16,8)
lcd.show()
sleep(2)
【任务5小结】
micropython提供了很多开源的驱动库,我们只要需要找到并下载,对期进行IO的设定就可以调用他的地库,简单的获取到数据。这也就是python的魁力所大,很多开源的大佬提供了开源库。所以这次任务我也是学习到如何下载和安装micropython的库的安装。
【任务6】
分任务1、第一个是寻找wifi发射源的位置。这个任务在官方上有例程,其原理就是获取wifi的rssi信号强度。其关键代码为:
rssi = station.status('rssi')#获取信号强度
def calculate_block_count(rssi):
# Determine the number of blocks based on RSSI values
if -80 <= rssi < -60:
return 1
elif -60 <= rssi < -40:
return 2
elif -40 <= rssi < -20:
return 3
elif -20 <= rssi <= 10:
return 4
然后根据强度在oled屏上绘制图块与文本说明信号质量,显示RSSI数值,评估信号的强度,再根据信号的强度来用蜂鸣器的响声长短来提示。以此来达到查找信号源。
同时我读取ATH20的温度以及湿度显示在屏幕之上。同时也读取了光强度显示屏之上。
【任务5小结】
整个任务5,我把所有的任务都集中体现了出来,后期可以根据相关的状态来实现自己想的东西。
【心得体会】
- follow me我从第一期以来都参与了,这个活动非常好,对于新手来说是最好的学习方式方法,有论坛举办方的细心的对整个活动的引导,特别是论坛管管们,细心的服务于整个活动过程,组织授课,解决参与人员的各项在开发的各种困难。
- Follow me的活动有很多大佬们也参与了进来,也第一时间的提交了任务,无私的把自己的学习方法、解决问题的途径、把调试好的代码也无私的上传到了附件,这使得新手们可以找到大量的学习教程,通过学习大佬们的作品,从而达到自己解决问题的方法。
- 在开发板的官方网站,也提供了大量的教材、示例,这也使得大家更加清楚如何查找资料,如果查看官方文档,来达到掌握他们的芯片的选型、开发、作品分享等等,从而让开发板更加了解他们的产品定位,在哪个领域可以适用等等,从而贴过大批的开发者来参与试用他们家的产品。
【建议】
虽然这期活动举办非常成功,我也如期的完成了各项任务,但是还有几点建议,1、开发板的扩展板不知道是本来就这么发热的还是我拿到的板子是个案,单模块上电是不发热的,但是接上开发板,静态工作电流有200mA以上,用手摸开发板的电源管理芯片温度非常高,烫手,需要工作一段断开一会,要不怕任务没有完成,芯片挂了。在我与得捷客服沟通后,他们让我提供非常多的资料给他们,我感觉非常麻烦。
2、在中国开展活动,但是这款芯片的中文的文档非常少,在我认为,在中国区售卖的产品,能提供准确的中文数据手册是非常之必要的。
|