- 2024-01-09
-
回复了主题帖:
辞旧:年底清仓,100+板卡来袭,有缘来领
所需板卡:DFRobot Arduino四路电机驱动板领取理由:熟悉DFRobot各类板卡、传感器,用于完成麦轮小车
- 2023-12-18
-
加入了学习《Follow me 第3期任务视频》,观看 Follow me 第3期任务视频
-
上传了资料:
Follow me 第3期任务代码
- 2023-12-17
-
发表了主题帖:
【得捷电子Follow me第3期】+项目总结报告
本帖最后由 doudoubaba 于 2023-12-18 15:10 编辑
内容一:3-5分钟短视频
内容二: 任务/项目总结报告
1 项目介绍
1、Seeed Studio XIAO ESP32C3介绍
Seeed Studio XIAO ESP32C3是一款基于express的物联网迷你开发板 ESP32-C3 WiFi/蓝牙双模芯片ESP32-C3是一款32位RISC-V CPU,包含一个FPU(浮点单元),用于32位单精度运算,具有强大的计算能力。它具有出色的射频性能,支持IEEE 802.11 b/g/n WiFi和蓝牙5 (LE)协议。该电路板附带一个外部天线,以增加无线应用程序的信号强度。 它还具有小巧精致的外形,并结合了单面表面贴装设计。 它配备了丰富的接口,具有11个数字I/O,可作为PWM引脚和4个模拟I/O,可作为ADC引脚。支持**UART、I2C、SPI等4种串行接口。
(1)引脚
(2)组件
2、Seeed Studio Expansion Board Base for XIAO扩展版介绍
一个功能强大的扩展板,适用于Seeed Studio XIAO,仅有Raspberry Pi 4大小的一半。它能够以简单快捷的方式构建原型和项目。具有丰富的外设,包括OLED显示屏、RTC实时时钟、可扩展存储器、无源蜂鸣器、复位/用户按钮、5V舵机连接器、多个数据接口。
该设备具有外部MicroSD卡插槽和RTC电池座,MicroSD卡主要用于保存和运行 python.py 文件,RTC用于跟踪当前时间,并可用于在特定时间执行操作。
(1)引脚
3、温湿度传感器Grove - AHT20
4、光线传感器Grove - Light Sensor v1.2
5、5向开关Grove - 5-Way Switch
Seeed Studio XIAO ESP32C3焊接排针,完成后如下图所示。
按下图方法将Seeed Studio XIAO ESP32C3安装到Seeed Studio Expansion Board Base for XIAO扩展板上。
完成后,如下图所示。
2 各任务功能对应的主要代码片段、功能展示及说明
任务1:使用MicroPython系统(必做任务)
熟悉Seeed Studio XIAO ESP32C3开发板基本操作,安装esptool,并给开发板刷写MicroPython系统,完成入门程序的运行
搭配器件:Seeed Studio XIAO ESP32C3
1、下载并安装Python
浏览器输入python.org/downloads/打开python下载页面,点击“Download Python 3.12.1”下载并安装Python。
或者点击以下链接下载Python。
https://www.python.org/ftp/python/3.12.1/python-3.12.1-amd64.exe
2、安装esptool
pip install esptool
3、下载Micropython固件
https://micropython.org/resources/firmware/ESP32_GENERIC_C3-20231005-v1.21.0.bin
4、设备管理器查看端口号,如下图所示端口号为COM31。
4、擦除固件
esptool --chip esp32c3 --port COM31 erase_flash
擦除中,如下图所示:
擦除完成,如下图所示:
5、烧录固件
esptool --chip esp32c3 --port COM31 --baud 921600 write_flash -z 0x0 ESP32_GENERIC_C3-20231005-v1.21.0.bin
固件烧录中,如下图所示。
固件烧录完成,如下图所示。
6、安装Thonny
https://github.com/thonny/thonny/releases/download/v4.1.4/thonny-4.1.4.exe
5、用Thonny访问Seeed Studio XIAO ESP32C3
看到如下图所示界面,表示连接成功。
至此,任务一完成。
任务2:驱动扩展板上的OLED屏幕(必做任务)
使用扩展板上的OLED屏幕显示文字和图形
搭配器件:Seeed Studio XIAO ESP32C3、Seeed Studio Expansion Board Base for XIAO
1、上传库文件到Seeed Studio XIAO ESP32C3
2、编写代码,如下所示。
# 得捷电子Follow me第3期
# 任务2:驱动扩展板上的OLED屏幕(必做任务)
# 作者:豆爸
# 时间:2023-12-17
import time
from machine import Pin, SoftI2C
import ssd1306
import math
i2c = SoftI2C(scl=Pin(7), sda=Pin(6))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
oled.fill(0)
oled.text("XIAO-ESP32-C3", 10, 5)
oled.text("Follow me 3", 15, 30)
oled.text("DouDad 20231217", 0, 55)
oled.show()
3、运行当前代码,如下图所示。
文字与图形代码,如下:
# 得捷电子Follow me第3期
# 任务2:驱动扩展板上的OLED屏幕(必做任务)
# 作者:豆爸
# 时间:2023-12-17
from machine import Pin, SoftI2C
import ssd1306
import math
i2c = SoftI2C(scl=Pin(7), sda=Pin(6))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
oled.fill(0)
oled.fill_rect(0, 0, 32, 32, 1)
oled.fill_rect(2, 2, 28, 28, 0)
oled.vline(9, 8, 22, 1)
oled.vline(16, 2, 22, 1)
oled.vline(23, 8, 22, 1)
oled.fill_rect(26, 24, 2, 4, 1)
oled.text('Follow me 3', 40, 0, 1)
oled.text("DouDad", 40, 18,1)
oled.text("20231217", 40, 36,1)
oled.text('XIAO-ESP32-C3', 5, 56, 1)
oled.show()
运行结果,如下图所示。
任务3:控制蜂鸣器播放音乐(必做任务)
使用Seeed Studio XIAO ESP32C3控制蜂鸣器发出不同频率的声音,并播放一段音乐
搭配器件:Seeed Studio XIAO ESP32C3、Seeed Studio Expansion Board Base for XIAO
1、编写代码,如下图所示。
# 得捷电子Follow me第3期
# 任务3:控制蜂鸣器播放音乐(必做任务)
# 使用Seeed Studio XIAO ESP32C3控制蜂鸣器发出不同频率的声音,并播放一段音乐——播放歌曲<<他是海盗>>
# 搭配器件:Seeed Studio XIAO ESP32C3、Seeed Studio Expansion Board Base for XIAO
# 作者:豆爸
# 时间:2023-12-17
import machine
import time
# Buzzer settings
buzzer_pin = machine.Pin(5, machine.Pin.OUT)
buzzer = machine.PWM(buzzer_pin)
buzzer.freq(1047)
# 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[i]
wait = durations[i]
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
while True:
# Play the song
play_song()
2、运行当前代码,如下图所示。
任务4:连接WiFi网络(必做任务)
将Seeed Studio XIAO ESP32C3连接到WiFi网络,并访问互联网信息
搭配器件:Seeed Studio XIAO ESP32C3、Seeed Studio Expansion Board Base for XIAO、RF ANT 2.4GHZ/5.5GHZ PCB TRACE
1、编写代码,如下图所示。
# 得捷电子Follow me第3期
# 任务4:连接WiFi网络(必做任务)
# 将Seeed Studio XIAO ESP32C3连接到WiFi网络,并访问互联网信息
# 搭配器件:Seeed Studio XIAO ESP32C3、Seeed Studio Expansion Board Base for XIAO、RF ANT 2.4GHZ/5.5GHZ PCB TRACE
# 作者:豆爸
# 时间:2023-12-17
from machine import Pin, SoftI2C
import ssd1306
import network
import time
# Network settings
wifi_ssid = "xiaogui"
wifi_password = "88888888"
i2c = SoftI2C(scl=Pin(7), sda=Pin(6))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
def connect_wifi():
station = network.WLAN(network.STA_IF)
station.active(True)
while not station.isconnected():
print("Connecting...")
oled.fill(0)
oled.text("Connecting...", 10, 35)
oled.show()
station.connect(wifi_ssid, wifi_password)
time.sleep(10)
print("Connected!")
print("IP Address:", station.ifconfig()[0])
oled.fill(0)
oled.text(station.ifconfig()[0], 10, 35)
oled.show()
connect_wifi()
2、运行当前代码,如下图所示。
任务5:使用外部传感器(必做任务)
连接环境光传感器或温湿度传感器,获取传感器的数值,并转换成真实的物理量
搭配器件: Seeed Studio XIAO ESP32C3、Seeed Studio Expansion Board Base for XIAO、 Grove - AHT20 I2C Industrial Grade Temperature and Humidity Sensor、Grove - Light Sensor v1.2
1、分别将温湿度传感器Grove - AHT20、光线传感器Grove - Light Sensor连接到Seeed Studio Expansion Board Base for XIAO扩展板的I2C接口和A0接口,如下图所示。
2、编写代码,如下图所示。
# 得捷电子Follow me第3期
# 任务5:使用外部传感器(必做任务)
# 连接环境光传感器或温湿度传感器,获取传感器的数值,并转换成真实的物理量
# 搭配器件: Seeed Studio XIAO ESP32C3、Seeed Studio Expansion Board Base for XIAO、 Grove - AHT20 I2C Industrial Grade Temperature and Humidity Sensor、Grove - Light Sensor v1.2
# 作者:豆爸
# 时间:2023-12-17
from machine import Pin, ADC, SoftI2C
import utime as time
import ahtx0
import ssd1306
i2c = SoftI2C(scl=Pin(7), sda=Pin(6))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
adcPin = 2
sensor_dev = ADC(Pin(2))
sensor_dev.atten(ADC.ATTN_11DB) # 这里配置测量量程为0~3.6V
sensor = ahtx0.AHT10(i2c)
while True:
sensor_value = 0
for i in range(0,16):
sensor_value = sensor_value + sensor_dev.read()
light_value = sensor_value / 16
Vbattf = 2 * sensor_value / 1000.0
resistance = (float)(1023 - sensor_value) * 10 / sensor_value
print("\nTemperature: %0.2f C" % sensor.temperature)
print("Humidity: %0.2f %%" % sensor.relative_humidity)
print("\nVbattf: %0.2f V" % Vbattf)
print("sensor_value: %d" % light_value)
print("resistance: %0.2f" % resistance)
oled.fill(0)
oled.text("Temp:" + str(sensor.temperature) + "C", 10, 5)
oled.text("Humi:" + str(sensor.relative_humidity) + "%", 10, 30)
oled.text("Light:" +str(light_value), 10, 55)
oled.show()
time.sleep(2)
3、运行当前代码,如下图所示。
任务6:使用外部传感器——Grove - 5-Way Switch
概述:
Grove-5向开关可用于检测开关位置和事件,如单击/双击/长按等。它可以检测左/右/上/下/中心5个方向。5向开关将是多功能控制的绝佳选择。
引脚:
1、首次连接,按住BOOT键,插USB连接电脑。
2、启动Arduino应用程序,添加以下地址到首选项中。
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
3、开发板选择:XIAO_ESP32C3,并选择正确端口号,如下图所示。
4、加载库文件
项目-导入库-添加.zip库
5、编辑如下代码。
#include "Grove_Multi_Switch.h"
GroveMultiSwitch mswitch[1];
const char* grove_5way_tactile_keys[] = {
"KEY A",
"KEY B",
"KEY C",
"KEY D",
"KEY E",
};
const char* grove_6pos_dip_switch_keys[] = {
"POS 1",
"POS 2",
"POS 3",
"POS 4",
"POS 5",
"POS 6",
};
const char** key_names;
int deviceDetect(void) {
if (!mswitch->begin()) {
Serial.println("***** Device probe failed *****");
return -1;
}
Serial.println("***** Device probe OK *****");
if (PID_VAL(mswitch->getDevID()) == PID_5_WAY_TACTILE_SWITCH) {
Serial.println("Grove 5-Way Tactile Switch Inserted!");
key_names = grove_5way_tactile_keys;
} else if (PID_VAL(mswitch->getDevID()) == PID_6_POS_DIP_SWITCH) {
Serial.println("Grove 6-Position DIP Switch Inserted!");
key_names = grove_6pos_dip_switch_keys;
}
// enable event detection
mswitch->setEventMode(true);
// report device model
Serial.print("A ");
Serial.print(mswitch->getSwitchCount());
Serial.print(" Button/Switch Device ");
Serial.println(mswitch->getDevVer());
return 0;
}
void setup() {
Serial.begin(115200);
Serial.println("Grove Multi Switch");
// Initial device probe
if (deviceDetect() < 0) {
Serial.println("Insert Grove 5-Way Tactile");
Serial.println("or Grove 6-Position DIP Switch");
for (;;);
}
return;
}
void loop() {
GroveMultiSwitch::ButtonEvent_t* evt;
delay(1);
evt = mswitch->getEvent();
if (!evt) {
// dynamic device probe
deviceDetect();
delay(1000);
return;
}
if (!(evt->event & GroveMultiSwitch::BTN_EV_HAS_EVENT)) {
#if 0
Serial.print("No event, errno = ");
Serial.println(mswitch->errno);
#endif
return;
}
for (int i = 0; i < mswitch->getSwitchCount(); i++) {
Serial.print(key_names[i]);
Serial.print(": RAW - ");
Serial.print((evt->button[i] & GroveMultiSwitch::BTN_EV_RAW_STATUS) ?
"HIGH " : "LOW ");
if (PID_VAL(mswitch->getDevID()) == PID_5_WAY_TACTILE_SWITCH) {
Serial.print((evt->button[i] & GroveMultiSwitch::BTN_EV_RAW_STATUS) ?
"RELEASED " : "PRESSED ");
} else if (PID_VAL(mswitch->getDevID()) == PID_6_POS_DIP_SWITCH) {
Serial.print((evt->button[i] & GroveMultiSwitch::BTN_EV_RAW_STATUS) ?
"OFF " : "ON ");
}
Serial.println("");
}
for (int i = 0; i < mswitch->getSwitchCount(); i++) {
if (evt->button[i] & ~GroveMultiSwitch::BTN_EV_RAW_STATUS) {
Serial.println("");
Serial.print(key_names[i]);
Serial.print(": EVENT - ");
}
if (evt->button[i] & GroveMultiSwitch::BTN_EV_SINGLE_CLICK) {
Serial.print("SINGLE-CLICK ");
}
if (evt->button[i] & GroveMultiSwitch::BTN_EV_DOUBLE_CLICK) {
Serial.print("DOUBLE-CLICK ");
}
if (evt->button[i] & GroveMultiSwitch::BTN_EV_LONG_PRESS) {
Serial.print("LONG-PRESS ");
}
if (evt->button[i] & GroveMultiSwitch::BTN_EV_LEVEL_CHANGED) {
Serial.print("LEVEL-CHANGED ");
}
}
Serial.println("");
}
6、上传代码
7、打开串口监视器,按压5向开关,即可看到哪个按键被按下,如下图所示。
3 对本活动的心得体会(包括意见或建议)
首先感谢EEWORLD组织的此次活动。得益于Seeed XIAO-ESP32-C3开发板、Seeed Studio Expansion Board Base for XIAO扩展板及相关传感器精致的外观、良好性能、优秀的品控,齐全的wiki文档于示例,micropython的易用性、方便性,顺利完成了以此各项任务。唯独遗憾的地方在于没有找到Seeed I2C 5向开关的micropython库,5向开关只能用Arduino C来完成。希望日后找到合适的库,再编写5向开关的Micropython代码。
内容三:可编译下载的代码