[作品提交] 【得捷电子Follow me第3期】基于ESP32-C3的阅读光线提示器设计

慕容雪花   2023-11-11 08:36 楼主

阅读光照提醒

 

核心板卡介绍:

特性

• 强大的 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
• 单面元件布局、支持表面贴装设计

 

官方维基:https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/

 

引脚图如下:

image-20231110121148-1.png  

 

扩展板硬件资源:

https://wiki.seeedstudio.com/Seeeduino-XIAO-Expansion-Board/

https://www.seeedstudio.com/Seeeduino-XIAO-Expansion-board-p-4746.html?queryID=bd1aef586d96a08ad9a2e813c1931aa7&objectID=4746&indexName=bazaar_retailer_

image-20231110121605-1.png  

 

 

555.png

 

 

任务1:使用MicroPython系统(必做任务)

电脑上的IDE使用的是THONNY。下面介绍如何给C3刷写最新的MICROPYTHON固件是:ESP32_GENERIC_C3-20231005-v1.21.0.bin

1. 去Micropython官网下载C3最新固件:https://micropython.org/download/ESP32_GENERIC_C3/

2.jpg
 

2. 检查电脑上Python的版本是否为3.4以上,因为接下来要用到pip安装刷新工具。

image-20231110155900-1.png  

 

3. 安装esptool刷新工具

pip install esptool -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
3.jpg

确认串口号是否安装正确:

esptool.py --h

image-20231110160249-1.png   

 

4. 开发板连接电脑,确认串口号

4.jpg

 

5.清空开发板FLASH

esptool.py  --chip esp32c3 --port COM23 erase_flash
5.jpg

 

 

6.给C3刷入最新的固件

esptool.py  --chip esp32c3 --port COM23 --baud 460800 write_flash -z 0x0 ESP32_GENERIC_C3-20231005-v1.21.0.bin

image-20231110160615-1.png  

 
7. 重新插拔USB,打开THONNY软件,右下角选择ESP32
image-20231110161006-2.png  
如上图所示,最新的Micropython固件已经刷入成功,并且可以进行正常的Python运算!

 

任务2:驱动扩展板上的OLED屏幕(必做任务)

1. 在THONNY IDE里面下载SSD1306的驱动

image-20231110162156-1.png  

2. 添加相关的初始化代码

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C

i2c=I2C(0,sda=Pin(6), scl=Pin(7), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)

oled.text("WELCOME!", 0, 0)
oled.text("This is EEWORLD", 0, 16)
oled.text("FOLLOW ME 3", 0, 32)
oled.text("JOIN US", 0, 48)
oled.show()

注意事项:

!
Before using it, it is required for me to state the software/firmware I'm using here is designed for the ESP32C3 chip. Hence when you are trying to use pin, make sure the General Purpose Input/Output instead of the pin on the board.
For example, when you are trying to use the pin in the first row on the left. Make sure it is GPIO2 instead of A0 or D0.

3. 实物效果:

实物.jpg
4. 代码:
TASK2-OLED.zip (1.98 KB)
(下载次数: 1, 2023-11-10 16:27 上传)

 

任务3:控制蜂鸣器播放音乐(必做任务)

扩展板上A3引脚连接了一个无源蜂鸣器。

image-20231110180910-1.png  

 

通过PWM的不同占空比和频率即可控制蜂鸣器发出不同的声音,甚至播放音乐!

# Buzzer settings
buzzer_pin = machine.Pin(5, machine.Pin.OUT)
buzzer = machine.PWM(buzzer_pin)
buzzer.freq(1047)

下面以比较简单的小星星乐谱为例来用C3扩展板上的蜂鸣器播放音乐。

image-20231110181052-2.png  

下面是C调音符与频率对照关系:

image-20231110181442-3.png  

# 定义音调频率
tones = {'1': 262, '2': 294, '3': 330, '4': 349, '5': 392, '6': 440, '7': 494, '-': 0}
# 定义小星星旋律
melody = "1155665-4433221-5544332-5544332-1155665-4433221"

while True:
    # Play the song
    for tone in melody:
        freq = tones[tone]
        if freq:
        # 调整PWM的频率,使其发出指定的音调
            buzzer.duty(1000)  # Set duty cycle for sound
            buzzer.freq(freq)  # Set frequency of the note
        else:
            buzzer.duty(0)  # 空拍时一样不上电
        # 停顿一下 (四四拍每秒两个音,每个音节中间稍微停顿一下)
        time.sleep_ms(400)
        buzzer.duty(0)  # 设备占空比为0,即不上电
        time.sleep_ms(100)

 

实物展示:

f154877482b2cfdc32d08855d9893029

 

代码:
TASK3-BUZZER-MUSIC-V2.py (1.21 KB)
(下载次数: 0, 2023-11-10 18:21 上传)

 

任务4:连接WiFi网络(必做任务)

使用Micropython连接网络是比较简单的:

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])

连接成功后,控制台输出相应的IP地址:

* TP-LINK_2804
   - Channel: 6
   - RSSI: -92
   - BSSID: 34:96:72:c2:28:04

* Hi32003Y7A1102300133002447F41513
   - Channel: 6
   - RSSI: -92
   - BSSID: 08:31:8b:62:7f:41

Connected!
My IP Address: 192.168.0.104

接下来我会通过url访问心知天气并获取上海本地的天气信息。其中,心知天气返回的json格式的数据:

image-20231110184733-1.png

url = "https://api.seniverse.com/v3/weather/now.json?key=请替换自己的KEY&location=shanghai&language=zh-Hans&unit=c"
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
        weather = ujson.loads(response.text)
        print(weather)
        # Extract the "datetime" field for New York
        current_weather = weather["results"][0]["now"]

        # Get the Temperature
        current_temperature = current_weather["temperature"]
        
        # Clear the OLED display
        oled.fill(0)
        
        # Display the New York date and time on separate lines
        oled.text("Shanghai Temperature:", 0, 0)
        oled.text(current_temperature, 0, 10)
        # Update the display
        oled.show()
    else:
        oled.text("Failed to get the weather")
        # Update the display
        oled.show()
    time.sleep(30)

控制台的输出结果如下:

{'results': [{'location': {'name': '\u4e0a\u6d77', 'path': '\u4e0a\u6d77,\u4e0a\u6d77,\u4e2d\u56fd', 'timezone': 'Asia/Shanghai', 'timezone_offset': '+08:00', 'id': 'WTW3SJ5ZBJUY', 'country': 'CN'}, 'last_update': '2023-11-10T18:30:32+08:00', 'now': {'text': '\u591a\u4e91', 'code': '4', 'temperature': '14'}}]}

实物展示:

获取天气

 

代码:
TASK4-ConnectToWiFi-V2 - eeworld.py (2.14 KB)
(下载次数: 0, 2023-11-10 18:57 上传)

  

 

任务5:使用外部传感器(必做任务)

本次驱动温湿度传感器AHT20:

 

 

image-20231110192602-1.png  

安装驱动:

image-20231110192913-1.png

 

核心代码:

from ahtx0 import AHT20

# Oled init
i2c=machine.I2C(0,sda=Pin(6), scl=Pin(7), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)

oled.text("This is TASK5", 0, 0)
oled.text("aht20", 0, 16)
oled.text("Temp:", 0, 32)
oled.text("Humi:", 0, 48)
oled.show()

#aht20
aht = AHT20(i2c)

def ahtxx():
    temp = aht.temperature
    humi = aht.relative_humidity
    
    print("\n")
    print(temp)
    print("\n")
    print(humi)
    
    #print("\n");
    #print('{:.2f}'.format(humi))
    oled.fill_rect(50,32,40,30,0) # 局部清屏
    oled.text('{:.2f}'.format(temp), 50, 32)
    oled.text('{:.2f}'.format(humi), 50, 48)
    oled.show()   
    time.sleep(1)

 实物展示:

image-20231110195758-2.png
 

实物展示:

1ad2087c64b309fd3f4a281e58dea393_raw

 

代码: 
TASK5-AHT20.py (1.15 KB)
(下载次数: 1, 2023-11-10 20:02 上传)
 
 
 

任务6:分任务3:开灯提醒器
监测环境光强度,如果光线太暗,通过屏幕和蜂鸣器提醒用户开灯,达到保护视力的效果。本次任务使用到了

  • Grove Light Sensor v1.2这是一个模拟光传感器,最大350lux对应ADC的4095
  • 还有一个红色的led,Grove接口,非常方便使用
  • oled,用于显示当前lux值,如果光照亮度低于50,则表示很暗,蜂鸣器报警并且红色LED亮并且OLED屏幕输出警告:TOO DARK!

 

image-20231110205822-1.png  

 

主要代码:

#led
led_red = machine.Pin(20, Pin.OUT)
led_red.off()

#adc
adc = machine.ADC(Pin(2))
adc.atten(machine.ADC.ATTN_11DB)
adc.width(machine.ADC.WIDTH_12BIT)  #4095

# Buzzer settings
buzzer_pin = machine.Pin(5, machine.Pin.OUT)
buzzer = machine.PWM(buzzer_pin)
buzzer.freq(1047)

def lightSensor():
    
    temp = adc.read()
    print("\n")
    print("lightsensor value: ")
    print(temp)
    
    lux_float = temp*350*1.0/4095;
    oled.fill_rect(50,32,77,30,0) # 局部清屏
    oled.text('{:.2f}'.format(lux_float), 50, 32)
    if lux_float < 50:
        oled.text("Too dark!", 50, 48)
        buzzer.duty(512)  # Turn off the sound
        led_red.on()
    else:
        buzzer.duty(0)  # Turn off the sound
        led_red.off()
        
    oled.show()
    
    time.sleep(1)

 

实物展示:

cffaf02510560984a05834e543dcae18_raw

 

代码:
TASK6-lightSensor-V2.py (1.12 KB)
(下载次数: 1, 2023-11-10 20:59 上传)

 

总结:

非常开心能够参加这一期的FOLLOW ME活动,通过本次活动,我从micropython固件刷入esp32c3,到驱动OLED,联网,获取天气信息以及驱动aht20温湿度传感器,到最后做出来一个简易阅读提醒器。自己学习到了非常多的知识,也提升了自己的知识,希望follow me活动越办越好!

 

参考文档:

1. https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/

2. https://wiki.seeedstudio.com/XIAO_ESP32C3_MicroPython/

本帖最后由 慕容雪花 于 2023-11-11 08:36 编辑

回复评论 (6)

太卷了吧,今天我才把针脚焊上

点赞  2023-11-11 09:58
ssd1306,你的库可以下载到吗,我是试了N次都不行。
点赞  2023-11-11 10:14
引用: lugl4313820 发表于 2023-11-11 10:14 ssd1306,你的库可以下载到吗,我是试了N次都不行。

来点魔法

点赞  2023-11-11 18:46
引用: EPTmachine 发表于 2023-11-11 09:58 太卷了吧,今天我才把针脚焊上

我是昨天上午焊的,

点赞  2023-11-11 18:47

感谢楼主提供的技术分享,先收藏学习再发表个人意见,顶起来

点赞  2023-11-21 18:32
引用: lugl4313820 发表于 2023-11-11 10:14 ssd1306,你的库可以下载到吗,我是试了N次都不行。

可以试试看更新Thonny到4.1.4版本或者直接拷贝个ssd1306.py文件丢进去

点赞  2023-11-22 10:43
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复