472|0

11

帖子

4

TA的资源

一粒金砂(中级)

楼主
 

【得捷Follow me第3期】任务提交 [复制链接]

  本帖最后由 eew_gz8e7C 于 2023-12-9 17:03 编辑

第一部分

    

 

 

 

 

  

第二部分

  • 任务1:使用MicroPython系统

本节任务目标:熟悉Seeed Studio XIAO ESP32C3开发板基本操作,安装esptool,并给开发板刷写MicroPython系统,完成入门程序的运行。

  1. 安装好python环境,需要安装的包esptool、mpremote
  2. 通过USB接入Seeed Studio XIAO ESP32C3,查看新增COM口,使用esptool刷入固件v1.21.0 (2023-10-05) .bin
    esptool.py --chip esp32-c3 -p COM* write_flash -z 0x0 ESP32_GENERIC_C3-20231005-v1.21.0.bin
  3. 重启ESP32后,使用mpremote 连接ESP32进入REPL
    mpremote connect COM*
  4. 打印系统信息,看到输出的mpy版本,至此mpy刷入成功,且可正常运行代码!
    print(os.uname())

     

  5. 心得体会建议

        在ESP32接入电脑前,提前打开设备管理器以便及时确认对应COM口。

 

  • 任务2:驱动扩展板上的OLED屏幕

本节任务目标:使用扩展板上的OLED屏幕显示文字和图形。

  1. 首先确定扩展板上的屏幕引脚信息,从第一部分硬件介绍可以确认IIC引脚6:SDA,7:SCL。
  2. 为了能便捷高效调用OLED屏幕,这里调用
    链接已隐藏,如需查看请登录或者注册
    大神的
    链接已隐藏,如需查看请登录或者注册
    库来实现屏幕的各种显示功能,它是一个轻量化的
    链接已隐藏,如需查看请登录或者注册
    显示界面库,基于FrameBuffer驱动的屏幕均可使用,包含了label、dial、textbox等多种显示控件可供调用。
  3. 链接已隐藏,如需查看请登录或者注册
    下载好后,使用thony将按下图文件夹将文件上传至esp32:

  1. 使用
    链接已隐藏,如需查看请登录或者注册
    需要在color_setup.py中配置屏幕引脚及宽高信息:
    from machine import Pin, I2C
    import gc
    
    from drivers.ssd1306.ssd1306 import SSD1306_I2C as SSD
    
    # seeed studio ESP32-C3,OLED连接到 I2C0
    i2c = I2C(0, scl=Pin(7), sda=Pin(6), freq=400000)
    
    # 屏幕大小定义
    oled_width = 128
    oled_height = 64
    
    # 内存回收清理
    gc.collect()
    
    # 实例SSD对象
    ssd = SSD(oled_width, oled_height, i2c)
  2. 如果要显示中文,需要提前将显示的中文字符转为mpy专用字库以便调用,采用
    链接已隐藏,如需查看请登录或者注册
    可以快速生成所需字库,并上传至lib/gui/fonts文件夹以供调用。
  3. 创建3个Lable实例化对象显示中英文,调用FrameBuffer基类中的图形方法绘制图形。
    # 1. 屏幕调用基础配置
    from color_setup import ssd
    
    from gui.core.nanogui import refresh
    from gui.core.writer import Writer
    from gui.widgets import label
    from gui.widgets.label import Label
    
    # 2.字库调用
    import gui.fonts.arial10 as arial10
    import gui.fonts.font10 as font10
    import gui.fonts.font6 as font6
    import gui.fonts.cn16 as zh
    import time 
    
    # 3.任务2
    def task2_1():
        # 清屏
        ssd.fill(0)
        refresh(ssd)
        # 在屏幕上显示中英文字符
        wri1 = Writer(ssd, font6, verbose=False)
        txt1 = Label(writer=wri1, row=2, col=0, text=127,invert=True,align=label.ALIGN_CENTER) #此处text参数为Label的宽度
    
        
        wri2 = Writer(ssd, font10, verbose=False)
        txt2 = Label(writer=wri2, row=20, col=0,text=127,align=label.ALIGN_CENTER)
    
    
        wri3 = Writer(ssd, zh, verbose=False)
        txt3 = Label(writer=wri3, row=40, col=0, text=127,align=label.ALIGN_CENTER)
    
        txt1.value("Task2")
        
        txt2.value("EEWorld")
        txt3.value("得捷第三期")
        
       # 输出显示
        refresh(ssd)
        
        
        
    
    def task2_2():    
       #清除屏幕
        ssd.fill(0)
        refresh(ssd)
        
        #图形显示
        ssd.rect(2,2,20,20,1)
        ssd.ellipse(40,12,10,10,1)
        ssd.ellipse(80,12,20,10,1)
        
    
        # 输出显示
        refresh(ssd)
     
     
        
    if __name__=="__main__":
        task2_1()
        time.sleep(5)
        task2_2()
    
    

     

  4. 效果展示:
    2
  5. 心得体会建议:通过调用
    链接已隐藏,如需查看请登录或者注册
    库可以大幅缩短屏幕类应用开发所需时间。

 

  • 任务3:控制蜂鸣器播放音乐

本节任务目标:使用Seeed Studio XIAO ESP32C3控制蜂鸣器发出不同频率的声音,并播放一段音乐。

  1. 从第一部分硬件介绍可以确认蜂鸣器的引脚为GPIO5
  2. 声音的大小与发生体的振幅有关,声音的音调与发声体的振动频率有关。使用PWM控制蜂鸣器,通过调节PWM波的频率来控制音调,调节PWM波的占空比来调整声音大小,将蜂鸣器引脚设置为PWM输出
    from machine import Pin, PWM
    import utime
    
    # 设置D3(GPIO 5)口为PWM
    beeper = PWM(Pin(5))

     

  3. 常见的音调频率见下图

 

  1. 创建字典保存音调与频率对应关系
    # 定义音调频率
    tones = {'1': 262, '2': 294, '3': 330, '4': 349, '5': 392, '6': 440, '7': 494, '-': 0,
             'a':523, 'b': 587, 'c': 659, 'd': 698, 'e': 784, 'f': 880, 'g': 988,' ':0,',':0,
             'A':1046, 'B': 1175, 'C': 1318, 'D': 1397, 'E': 1568, 'F': 1760, 'G': 1976}

     

  2. 创建乐谱
    # 定义小星星旋律
    melody = "1155665-4433221-5544332-5544332-1155665-4433221"
    # 定义沧海一声笑旋律
    chysx="fecba-cba65-5656abcefecbab-65321-cba65-5656abcefecba"
  3.  定义播放函数,并运行试听
    def buzzer(disc):
        for tone in disc:
            freq = tones[tone]
            if freq:
                beeper.init(duty=20, freq=freq)  # 调整PWM的频率,使其发出指定的音调
            else:
                beeper.duty(0)  # 空拍时一样不上电
            # 停顿一下 (四四拍每秒两个音,每个音节中间稍微停顿一下)
            utime.sleep_ms(400)
            beeper.duty(0)  # 设备占空比为0,即不上电
            utime.sleep_ms(100)
    
        beeper.deinit()  # 释放PWM
    
    if __name__=="__main__":
        buzzer(melody)
        utime.sleep_ms(500)
        buzzer(chysx)
  4. 效果展示
    3
  5. 心得体会建议:通过本次任务不仅熟悉了蜂鸣器的使用,对ESP32的PWM输出也有了基本掌握。
  • 任务4:连接WiFi网络

本节任务目标:将Seeed Studio XIAO ESP32C3连接到WiFi网络,并访问互联网信息。

  1.  通过micropython库连接wifi网络非常简单,使用network模块可以方便地进行WIFI网络/AP热点的配置
  2.  使用network.WLAN()进行wifi连接或者ap热点的配置
    import network
    import time
        
    class WLAN():
        def __init__(self,mode='ap',ssid='ESP-AP',key='esp32666'):
            if mode=='ap':
                self.setAp(ssid,key)
            elif mode=='wlan':
                self.connect(ssid,key)
        
        
        def connect(self,ssid:str,key:str):
            self.wlan = network.WLAN(network.STA_IF)
            self.wlan.active(True)
            msg=""
            if self.wlan.isconnected():
                self.wlan.disconnect()
                time.sleep(1)
            if not self.wlan.isconnected():
                print('connecting to network...')
                self.wlan.connect(ssid, key) 
                wait_time=0
                while not self.wlan.isconnected():
                    time.sleep(1)
                    wait_time+=1
                    msg=f"wait for {wait_time} s"
                    print(msg)
                    if wait_time>10:
                        msg=f"connect failed!"
                        print(msg)
                        return msg
                msg=f"connected! ssid={ssid} ip={self.wlan.ifconfig()[0]}"
                print(msg)
                return msg
     
        def scan(self):
            return self.wlan.scan()
        
        def setAp(self,apssid='ESP-AP',apkey='esp32666'):
            self.ap=network.WLAN(network.AP_IF)
            if apkey:
                self.ap.config(ssid=apssid,password=apkey,authmode=4)
            else:
                self.ap.config(ssid=apssid,authmode=0)
            self.ap.active(True) 
            
    
            
    if __name__=='__main__':
        w=WLAN('wlan','xxx','xxxxxx')
            
    
    

     

 

  1.  进行https访问测试
        import urequests
        response = urequests.get("https://www.baidu.com/")
        print(response.text)
    

       

  2. 效果展示

    4

  3. 心得体会建议:换用本次活动推荐的PCB天线能够取得更好的WIFI信号效果。

  • 任务5:使用外部传感器

本节任务目标:连接环境光传感器或温湿度传感器,获取传感器的数值,并转换成真实的物理量。

  1. AHT20温湿度传感器采用IIC总线传输数据,光线传感器通过ADC采集,光线传感器接入扩展板A0接口,温湿度传感器接入IIC接口。
  2. AHT20温湿度需要ahtx0驱动可以通过两个渠道下载安装:
    链接已隐藏,如需查看请登录或者注册
     https://pypi.org/project/micropython-ahtx0/
  3. 另外需要注意,ESP32 adc默认采集电压范围0~1.1V,可以通过配置衰减来扩大量程。
    from machine import Pin, I2C, ADC
    import utime
    from ahtx0 import AHT20
    import gui.fonts.font6 as font6
    import gui.fonts.cn16 as cn
    from gui.core.nanogui import refresh
    from gui.core.writer import Writer
    from gui.widgets import label
    from gui.widgets.label import Label
    from color_setup import ssd
    import _thread
    
    adcLight=ADC(Pin(2),atten=ADC.ATTN_11DB)#atten=ADC.ATTN_11DB配置衰减
    i2cHumiture=I2C(0, scl=Pin(7), sda=Pin(6), freq=400000)
    huSensor = AHT20(i2cHumiture)
    
        
    wri1 = Writer(ssd, font6, verbose=False)
    txt1 = Label(writer=wri1, row=2, col=0, text=127,invert=True,align=label.ALIGN_CENTER) #此处text参数为Label的宽度
    
        
    wri2 = Writer(ssd, cn, verbose=False)
    txt2 = Label(writer=wri2, row=17, col=0,text=127,align=label.ALIGN_LEFT)
    
    
    wri3 = Writer(ssd, cn, verbose=False)
    txt3 = Label(writer=wri3, row=32, col=0, text=127,align=label.ALIGN_LEFT)
    
    wri4 = Writer(ssd, cn, verbose=False)
    txt4 = Label(writer=wri3, row=47, col=0, text=127,align=label.ALIGN_LEFT)
    
    
    lightVal=None
    def sensorLoop():
        global lightVal
        while True:
            light_adc = adcLight.read_uv()
            lightVal = light_adc / 1000.0
            print("Light{:.2f} mV".format(lightVal))
            print("Temperature{:.2f}".format(huSensor.temperature))
            print("Humidity{:.2f}\n".format(huSensor.relative_humidity))
            utime.sleep(1)
            
    def sensorLoopThread():
        _thread.start_new_thread( sensorLoop, () )
    
    def showSensorData():
        while True:
            ssd.fill(0)
            
            txt1.value("Task5")
            txt2.value("光:{:.1f}".format(lightVal))
            txt3.value("温:{:.1f}℃".format(huSensor.temperature))
            txt4.value("湿:{:.1f}%".format(huSensor.relative_humidity))     
            refresh(ssd)
            utime.sleep(2)
        
            
            
    
    def task5():
        sensorLoopThread()
        utime.sleep(0.5)
        showSensorData()
        
        
    if __name__=="__main__":
        task5()
    
    
  4.  效果展示:
    5
  5. 心得体会建议:温湿度信号采集频率不要超过1s/次,否则自身发热可能导致温度采集结果偏差。
  • 任务6:综合实践-开灯提醒器

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

  1. 实现思路:循环读取光线传感器电压值,并在屏幕显示,当传感器输出电压值低于50mv时,通过蜂鸣器及屏幕提示开灯并点亮LED,当传感器输出电压高于200mV时关闭LED。
  2. 关键代码
    from machine import Pin, I2C, ADC, PWM     
    import utime
    from ahtx0 import AHT20
    import gui.fonts.font6 as font6
    import gui.fonts.cn16 as cn
    from gui.core.nanogui import refresh
    from gui.core.writer import Writer
    from gui.widgets import label
    from gui.widgets.label import Label
    from color_setup import ssd
    import _thread
    
    adcLight=ADC(Pin(2),atten=ADC.ATTN_11DB)
    i2cHumiture=I2C(0, scl=Pin(7), sda=Pin(6), freq=400000)
    huSensor = AHT20(i2cHumiture)
    
    # 设置D3(GPIO 5)口为PWM
    beeper = PWM(Pin(5),duty=0)
    
    # 设置D2(GPIO 4)口为LED负载
    led=Pin(4,Pin.OUT)
    led.off()
        
    wri1 = Writer(ssd, font6, verbose=False)
    txt1 = Label(writer=wri1, row=2, col=0, text=127,invert=True,align=label.ALIGN_CENTER) #此处text参数为Label的宽度
    
        
    wri2 = Writer(ssd, cn, verbose=False)
    txt2 = Label(writer=wri2, row=17, col=0,text=127,align=label.ALIGN_LEFT)
    
    
    wri3 = Writer(ssd, cn, verbose=False)
    txt3 = Label(writer=wri3, row=32, col=0, text=127,align=label.ALIGN_LEFT)
    
    wri4 = Writer(ssd, cn, verbose=False)
    txt4 = Label(writer=wri3, row=47, col=0, text=127,align=label.ALIGN_LEFT)
    
    
    lightVal=None
    def sensorLoop():
        global lightVal
        while True:
            light_adc = adcLight.read_uv()
            lightVal = light_adc/1000.0
            print("Light:{:.2f}".format(lightVal))
    #         print("Temperature:{:.2f}".format(huSensor.temperature))
    #         print("Humidity:{:.2f}\n".format(huSensor.relative_humidity))
            utime.sleep(0.5)
            
    def sensorLoopThread():
        _thread.start_new_thread( sensorLoop, () )
    
    def showSensorData():
        while True:
            ssd.fill(0)
            
            txt1.value("Task6")
            txt2.value("光:{:.1f}".format(lightVal))
            if lightVal<50.0:
                txt3.value("光线暗!请开灯!")
                beeper.init(duty=20, freq=1000)
                utime.sleep_ms(200)
                beeper.duty(0)
                utime.sleep_ms(50)
                beeper.init(duty=20, freq=1000)
                utime.sleep_ms(200)
                beeper.duty(0)
                led.on()
            else:
                if lightVal>200.0:
                    led.off()
                txt3.value("")
            refresh(ssd)
            utime.sleep(2)
        
            
            
    
    def task6():
        sensorLoopThread()
        utime.sleep(0.5)
        showSensorData()
        
        
    if __name__=="__main__":
        task6()
    
    
    
  3.  效果展示
    task6
  4. 心得体会建议:PIN口负载能力有限,控制灯带开关可以通过三极管开关电路实现。

第三部分

可执行的任务代码

总结

通过本期活动,学习了ESP32 Micropython的基本使用方法,掌握了SSD1306的LCD屏幕的中英文及图形显示、PWM驱动蜂鸣器播放简单的音乐、ESP32的WIFI连接与网络访问、光线及温湿度传感器的信号读取。最后感谢得捷电子和EEWORLD举办的本次活动。

 

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
【EEWORLD模块整理】+tlc2543(A/D)

今年我用的模块资料 已经证实好用

FPGA DCM时钟管理单元的理解

看Xilinx的Datasheet会注意到Xilinx的FPGA没有PLL,其实DCM就是时间管理单元。 --------------------------------------------- ...

电烙铁的使用小技巧

本人原创——乃自己当时查阅的资料和自己的一点点经验而写成,如有错误请多指教! 首先要说明的是,使用电烙 ...

ubuntu下修改内核发生“ncurses libraries“错误(解决方法)

BSEC@bsec-server:~/kernel/Kernel$ make menuconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/docproc HOSTCC script ...

在屏幕上显示大写字母DMH的VGA控制器

本帖最后由 PuesueDream 于 2015-7-22 17:18 编辑 基于ise14.7平台,用Nexys3开发板弄了一个显示程序。程序包含六部分 首 ...

msp430f149波特率设置

本帖最后由 灞波儿奔 于 2020-1-10 23:14 编辑 TI MSP430系列单片机,usart模块的波特率值设定是通过以下三个寄存器决定的 ...

为什么给一个变量赋值0时,直接写=0,而给它赋值0xffffffff时要写成=0xffffffffu

为什么给一个变量赋值0时,直接写*ram=0即可,而给它赋值0xffffffff时要写成*ram=0xffffffffu, 以下是具体的代码 /****** ...

报名提醒:最后几小时,100套价值390元平头哥RISC-V生态开发板免费送~

最后几小时啦,想要的网友速速来~100套价值390元平头哥RISC-V生态开发板——RVB2601来袭,现在提交创意,即有机会免费 ...

在现代计算机上运行虚拟Mac Quadra 900

682909 macintosh.js 是一个模拟 1991 年 Macintosh Quadra 900 和摩托罗拉 CPU 的虚拟机,它完全用 JavaScript 编写(因此请 ...

反激电源辅助供电绕组串联电阻

看到很多反激电源辅助绕组串联电阻的,如下图电阻Rvcc,想问一下这个电阻的作用是什么?

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表