- 2024-09-24
-
加入了学习《趣味电子技术史话:通信技术发展史》,观看 从烽火台到电报机,各阶段的通信方式
- 2023-12-28
-
回复了主题帖:
【得捷Follow me第3期】+跟着各位网友一点一滴学习ESP32
源码下载链接:https://download.eeworld.com.cn/detail/poponianhua/630360
-
回复了主题帖:
入围名单:PDUSB MCU CH32X035为Type-C特色应用赋能,你准备用它DIY什么?
个人信息无误,确认可以完成评测计划
- 2023-12-26
-
上传了资料:
fellow me3 源代码
- 2023-12-13
-
加入了学习《2023得捷电子第一期总结视频》,观看 2023得捷电子第一期总结视频
-
加入了学习《基于Arduino玩转pico RP2040》,观看 基于Arduino玩转pico RP2040
-
回复了主题帖:
【得捷Follow me第3期】+跟着各位网友一点一滴学习ESP32
为何不能看到预览呢?
-
加入了学习《fellowme3 学习》,观看 fellow me 3 学习
- 2023-12-11
-
发表了主题帖:
【得捷Follow me第3期】+跟着各位网友一点一滴学习ESP32
准备:
开箱展示:五虎上将,开启征程。
任务1:使用MicroPython系统(必做任务)
熟悉Seeed Studio XIAO ESP32C3开发板基本操作,安装esptool,并给开发板刷写MicroPython系统,完成入门程序的运行
搭配器件:Seeed Studio XIAO ESP32C3
在学习Seeed Studio XIAO ESP32C3开发板过程中了解到Seeed Studio XIAO ESP32C3是一款基于 Espressif ESP32-C3 Wi-Fi/蓝牙双模芯片的 IoT 迷你开发板。
ESP32-C3 是一款32 位 RISC-V CPU,具有强大的计算能力,包含FPU(浮点运算单元),可进行32 位单精度运算。
它具有出色的射频性能,支持IEEE 802.11 b/g/n Wi-Fi和蓝牙 5 (LE)协议。正如其名,Seeed Studio XIAO ESP32C3具有小巧精致的外形,可通过表面贴装整合到更复杂的PCB上。在这个方面是实现了模块化的设计,能够充分利用最小核心板的概念,对于产品设计,快速生产成品具有很好的促进作用。
主要特性
• 强大的 CPU:ESP32-C3,32 位 RISC-V 单核处理器,运行频率高达 160 MHz
• 完整的WiFi子系统:符合IEEE 802.11b/g/n协议,支持Station模式、SoftAP模式、SoftAP+Station模式、混杂模式
• 蓝牙 LE 子系统:支持蓝牙 5 和蓝牙网状网络的功能
• 超低功耗:深度睡眠功耗约43μA
• 更好的射频性能:可连接外部射频天线
• 电池充电芯片:支持锂电池充放电管理
• 丰富的片上资源:400KB SRAM、4MB板载闪存
• 超小尺寸:小至拇指 (20x17.5mm) XIAO 系列经典外形,适用于可穿戴设备和小型项目
• 可靠的安全功能:支持 AES-128/256、哈希、RSA、HMAC、数字签名和安全启动的加密硬件加速器
• 丰富的接口:1xI2C、1xSPI、2xUART、11xGPIO(PWM)、4xADC、1xJTAG
• 单面元件布局、支持表面贴装设计
参考资料:
Seeed Studio XIAO ESP32C3 官方资料
开发环境搭建
1.下载esptool工具
然后就一直遇到无法打开的情况。未知的缘故阻碍了学习的进程。
只好使用pip安装。
pip install esptool
在后面学习的过程中发现,这个esptool也可以选择不安装,直接使用thonny下载固件。而且由于使用来esptool安装后,再使用thonny下载时,会一直显示串口忙,应该是esptool在下载完固件后一直占用着串口。网络上看别人说需要把相应的管脚手动拉低,而我直接采用了使用thonny下载固件解决了相关问题。
2.下载ESP32C3 MicroPython固件。
进入MicroPython官网搜索下载选择ESP32-C3,点击下载Releases v1.21.0 (2023-10-05) .bin
3.将MicroPython刷入到Seeed Studio XIAO ESP32C3开发板中
连接开发板到电脑上,
第一个问题,如何在查找到串口号。
经过对比 tty.usbmodem14201是这个设备的串口号。
下一步是下载到ESP32C3,因为是pip安装的esptool,所以下载前应先cd到固件文件目录,
cd
采用命令
esptool.py --chip esp32-c3 --port /dev/cu.usbmodem14201 --baud 460800 write_flash -z 0x1000 ESP32_GENERIC_C3-20231005-v1.21.0.bin
约等20s,实现下载。至此完成了固件下载
下载安装thonny。
下载安装thonny。
由于无法打开,只好还是使用pip工具来进行安装,安装过程中,由于开始没有选择国内源,导致速度很慢,换来国内源后秒好。
操作中不知道哪里出了问题,
显示
选择解释器。
解决方法就使用thonny重新下载来固件。
2.“工具”——“管理包”,安装ssd1306库。
测试官方示例。
OLED为自发光材料,视角广、画质均匀、反应速度快、较易彩色化、用简单驱动电路即可达到发光、符合轻薄短小的原则,通常用于中小尺寸面板。
显示方面:主动发光、视角范围大;响应速度快,图像稳定;亮度高、色彩丰富、分辨率高。
工作条件:驱动电压低、能耗低,可与太阳能电池、集成电路等相匹配。
适应性广:采用玻璃衬底可实现大面积平板显示;如用柔性材料做衬底,能制成可折叠的显示器。由于OLED是全固态、非真空器件,具有抗震荡、耐低温(-40℃)等特性有十分重要的应用。
显示文字的代码如下:
import time
from machine import Pin, SoftI2C
import ssd1306
import math
# ESP8266 Pin assignment
i2c = SoftI2C(scl=Pin(7), sda=Pin(6)) # Adjust the Pin numbers based on your connections
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
oled.fill(0) # Clear the screen
oled.text("Hello, Seeder!", 10, 15)
oled.text("/////", 30, 40)
oled.text("(`3`)y", 30, 55)
oled.show() # Show the text
显示动态图片的代码如下:
import time
from machine import Pin, SoftI2C
import ssd1306
import math
# ESP8266 Pin assignment
i2c = SoftI2C(scl=Pin(7), sda=Pin(6)) # Adjust the Pin numbers based on your connections
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
center_x = oled_width // 2
center_y = oled_height // 2
square_size = 6 # Size of each square
num_squares = 12 # Number of squares
angle_increment = 2 * math.pi / num_squares
while True:
oled.fill(0) # Clear the screen
for i in range(num_squares):
angle = i * angle_increment
x = int(center_x + (center_x - square_size-30) * math.cos(angle))
y = int(center_y + (center_x - square_size-30) * math.sin(angle))
# Draw all squares
for j in range(num_squares):
angle_j = j * angle_increment
x_j = int(center_x + (center_x - square_size-30) * math.cos(angle_j))
y_j = int(center_y + (center_x - square_size-30) * math.sin(angle_j))
oled.fill_rect(x_j, y_j, square_size, square_size, 1) # Draw the square
oled.fill_rect(x, y, square_size, square_size, 0) # Erase the current square
oled.show()
time.sleep_ms(100) # Pause before next iteration
任务三 控制蜂鸣器播放音乐
控制Seeed Studio XIAO ESP32C3板载蜂鸣器发出不同的音乐。
Buzzer(蜂鸣器)
蜂鸣器依靠PMW信号的频率来实现发出不同的声音,近似模拟出“音乐”。测试中没有发现如何调整音量大小。知道的朋友请告知下。
首先要解决的问题是如何让蜂鸣器发出声音。
蜂鸣器播放声音代码:
import time
from time import sleep
import machine
from machine import Pin, SoftI2C
# Buzzer settings
buzzer_pin = machine.Pin(5, machine.Pin.OUT)
buzzer = machine.PWM(buzzer_pin)
buzzer.freq(1047)
# Buzzer working
while True:
buzzer.duty(10)
time.sleep(1)
buzzer.duty(0)
time.sleep(1)
在官方示例代码中,实现来间隔发出声音的效果。
实现音乐的播放。
播放音乐示例:
import machine
import time
from machine import Pin, SoftI2C
import ssd1306
import math
# Buzzer settings
buzzer_pin = machine.Pin(5, machine.Pin.OUT)
buzzer = machine.PWM(buzzer_pin)
buzzer.freq(1047)
i2c = SoftI2C(scl=Pin(7), sda=Pin(6)) # Adjust the Pin numbers based on your connections
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
oled.fill(0)
oled.text("play music", 10, 15)
oled.text("He's a pirate ", 10, 40)
oled.text("fellow me 3", 10, 55)
oled.show() # Show the text
# 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()
连接Wi-Fi网络
将Seeed Studio XIAO ESP32C3连接到WiFi网络,并访问互联网信息。
EEWORLDIMGTK17
代码如下。
import network
import urequests
import utime as time
# Network settings
wifi_ssid = "******"
wifi_password = "*********"
def scan_and_connect():
station = network.WLAN(network.STA_IF)
station.active(True)
print("Scanning for WiFi networks, please wait...")
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()
while not station.isconnected():
print("Connecting...")
station.connect(wifi_ssid, wifi_password)
time.sleep(10)
print("Connected!")
print("My IP Address:", station.ifconfig()[0])
# Execute the functions
scan_and_connect()
连接外部传感器
连接环境光传感器或温湿度传感器,获取传感器的数值,并转换成真实的物理量。
本次测试采用AHT20新一代温湿度传感器。该设备内嵌双排扁平无引线SMD封装,适用于回流焊。
AHT20 配备了新设计的 ASIC 芯片:改进的 MEMS 半导体电容式湿度传感器和标准片上温度传感器。使用时需要安装、导入ahtx0库。
光照传感器集成了一个光敏电阻器(光敏电阻器)来检测光的强度。光敏电阻的电阻随着光强度的增加而减小。板载双运算放大器芯片 LM358 产生与光强度相对应的电压(即基于电阻值)。输出信号为模拟值,光线越亮,数值越大。利用该数值可以实现通过外部环境变化控制相关设备工作。
代码展示:
import time,ahtx0,ssd1306
from machine import Pin, I2C, SoftI2C,ADC
i2c = SoftI2C(scl=Pin(7), sda=Pin(6))
oled_width = 128
oled_height = 64
# 屏幕对象
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
# 温湿传感器对象
sensor = ahtx0.AHT20(i2c)
# 光线传感器对象
adc = ADC(Pin(2),atten=ADC.ATTN_11DB)
adc.width(ADC.WIDTH_12BIT)
while True:
# 清屏
oled.fill(0)
# 绘制边框
oled.hline(0,0,128,1)
oled.hline(0,63,128,1)
oled.vline(0,0,64,1)
oled.vline(127,0,64,1)
# 标题文字
oled.text("Follow me 3",20,5,1)
oled.text("by eeworld",10,50,1)
# 输出温度值
print("Temperature: %0.2f C" % sensor.temperature)
oled.text("T: %0.2f C" % sensor.temperature,20,15,1)
# 输出湿度值
print("Humidity: %0.2f %%" % sensor.relative_humidity)
oled.text("H: %0.2f %%" % sensor.relative_humidity,20,25,1)
# 读取ADC输入的电压值(0-4095之间)
value = adc.read()
# 转换为光照强度
lux = value / 4095 * 350
# 输出照度值
print("Light: %0.2f lux\n" % lux)
oled.text("L: %0.2f lux" % lux,20,35,1)
# 显示
oled.show()
time.sleep(1)
演示视频:https://training.eeworld.com.cn/video/38592
代码包:https://download.eeworld.com.cn/detail/poponianhua/630360
- 2023-12-07
-
回复了主题帖:
ESP32-C3 无线冒险:物联网综合指南
学习,感谢分享