491|0

97

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【得捷电子Follow me第3期】任务综合帖(任务1~任务5) [复制链接]

  本帖最后由 aramy 于 2023-12-5 09:39 编辑

【得捷电子Follow me第3期】综合贴:任务1~任务5

这次活动使用主控是:乐鑫家族的Seeed Studio XIAO ESP32C3。要求使用micropython,实现

任务1:使用MicroPython系统
任务2:驱动扩展板上的OLED屏幕
任务3:控制蜂鸣器播放音乐
任务4:连接WiFi网络
任务5:使用外部传感器

额外地任务6,属于选做任务,可以选做 :1:寻找WiFi发射源的位置  2:温湿度数据记录仪  3:开灯提醒器 。

乐鑫家族中的ESP32-C3 是一款安全稳定、低功耗、低成本的物联网芯片,搭载 RISC-V 32 位单核处理器,支持 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE),时钟频率高达 160 MHz。具有 22 个可编程 GPIO 管脚、内置 400 KB SRAM。非常适宜做物联网开发。


0、前传:开箱全家福。

 

核心部件:Seeed Studio XIAO ESP32C3。搭配了一个扩展板,扩展板上有oled液晶屏,有蜂鸣器。传感器:我选的是AHT20,温湿度传感器,使用IIC接口。搭了一根GROVE接口线。还买了个2.4G 天线(收到才发现,板子带了根天线,想必买的天线信号更好点吧!)。还有根type的线缆,没入镜。手头有排针,电烙铁伺候!


任务1、使用MicroPython系统

从micropython官方网站下载mpy固件:https://micropython.org/download/ESP32_GENERIC_C3/

 

然后从乐鑫网站上下载烧录工具https://www.espressif.com.cn/sites/default/files/tools/flash_download_tool_3.9.5_0.zip。将固件烧写到板子上即可。编辑器使用Thonny,在解释器中选择Micropython(通用)即可使用microPython了。

 


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

 

通过网络查询资料,可以得知,扩展板上的SSD1306是通过IIC与主控通讯的。IIC使用通讯的管脚是SCL-GPIO7;SDA-GPIO6。先检查一下IIC总线上的设备。
  • from machine import Pin, I2C
  • # construct an I2C bus
  • i2c = I2C(scl=Pin(7), sda=Pin(6))
  • print(i2c.scan())

 

可以看见有两个IIC设备,其中60的设备对应的就是SSD1306的地址了(0x3c)。接下来就去驱动OLED屏幕。这里使用前辈们造好的轮子。

链接已隐藏,如需查看请登录或者注册
驱动OLED显示。再参考这个页面
链接已隐藏,如需查看请登录或者注册
,使用了大小不同的字体。这里在屏幕上显示“hello”字符,然后绘制个实心方块。

  • from machine import Pin, SoftI2C
  • from ssd1306 import SSD1306_I2C
  • from font import Font
  • i2c = SoftI2C(scl=Pin(7), sda=Pin(6))
  • display = SSD1306_I2C(128, 64, i2c)
  • f=Font(display)
  • display.fill(0)
  • f.text("hello",38,0,24)
  • display.fill_rect(38, 30, 60, 32, 1)
  • display.show()

 

 


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

扩展板上有蜂鸣器,接在5脚。这应该是个无源蜂鸣器。意味着蜂鸣器自生是没有信号源的,必须要单片机提供震动信号给蜂鸣器,蜂鸣器才会发声,与扬声器相似。可以通过单片机控制蜂鸣器发出不同频率的音调。通过单片机的pwm功能,提供不同频率的方波,来驱动蜂鸣器发出指定频率的震动,形成音乐。

  • import machine
  • import utime
  • # 定义音调频率
  • tones = {'1': 262, '2': 294, '3': 330, '4': 349, '5': 392, '6': 440, '7': 494, '-': 0}
  • # 定义小星星旋律
  • melody = "1155665-4433221-5544332-5544332-1155665-4433221"
  • pizzo = machine.Pin(5)
  • pwm1 = machine.PWM(pizzo)
  • #frep1 = 500
  • #pwm1.freq(frep1)
  • #pwm1.duty_u16(32768)
  • for tone in melody:
  • freq = tones[tone]
  • if freq:
  • pwm1.init(duty=1000, freq=freq) # 调整PWM的频率,使其发出指定的音调
  • else:
  • pwm1.duty(0) # 空拍时一样不上电
  • # 停顿一下 (四四拍每秒两个音,每个音节中间稍微停顿一下)
  • utime.sleep_ms(400)
  • pwm1.duty(0) # 设备占空比为0,即不上电
  • utime.sleep_ms(100)

任务4:连接WiFi网络,并访问互联网信息

连接wifi网络,这几乎是esp家族的传统技能了。mpy与esp配合,连接wifi几乎是顺手拈来。这里用手机做了个热点,显示一下连接后获得的IP信息。获取互联网时间,与互联网校时。

  • import network
  • import utime
  • import ntptime
  • import time
  • import machine
  • def sync_ntp():
  • """通过网络校准时间"""
  • while True: #时间校准
  • try:
  • ntptime.settime()
  • break;
  • except:
  • print('time no')
  • time.sleep(1)
  • sta_if = network.WLAN(network.STA_IF) # 配置wifi模式为station
  • if not sta_if.isconnected(): # 判断有无连接
  • print('connecting to network...')
  • sta_if.active(True) # 激活wifi接口
  • sta_if.connect('weile', 'weile120') # 连接现有wifi网络,需要替换为已知的热点名称和密码
  • while not sta_if.isconnected():
  • utime.sleep(1) # 未连接上就等待一下,直到连接成功
  • print('network config:', sta_if.ifconfig()) # 输出当前wifi网络给自己分配的网络参数
  • sync_ntp()
  • currtime=time.localtime()
  • print(type(currtime),currtime)
  • while True:
  • mytime=time.localtime()
  • mytime='%d-%d-%d %d:%d:%d'%(mytime[0],mytime[1],mytime[2],mytime[3]+8,mytime[4],mytime[5])
  • print(mytime)
  • time.sleep(5)

这个自动校时有点没搞清楚 。通过查询,可以知道ntptime有指定一个默认的校时服务器'pool.ntp.org'。参考官方的文档:ntptime.settime(timezone=8server='ntp.ntsc.ac.cn'),是可以设置修改ntp服务器和时区的。但是我设置用阿里的ntp服务器,或者设置时区,就无法校时成功,不是很清楚是怎么回事。所以,退而求其次,在获得到时间后手工调整时区。

 


任务5:使用外部传感器

首先将AHT20接上。通过昂贵的GROVE线接到了扩展板的IIC接口上。两个IIC接口是一样的,所以任意接一个即可。

 

接着再次跑一下之前的IIC扫描程序,可以看见多了个IIC的设备 81,这就是对应的AHT20设备。

 

然后上网寻找对应的轮子,在micropython官网上https://pypi.org/project/micropython-ahtx0/ 有着AHTX0系列的驱动包。将其下载下来。

 

只需要取这个压缩包中的ahtx0.py文件,放入lib文件夹下,然后运行官方的例程(修改一下IIC对应的管脚):

  • import utime
  • from machine import Pin, I2C
  • import ahtx0
  • # I2C for the Wemos D1 Mini with ESP8266
  • i2c = I2C(scl=Pin(7), sda=Pin(6))
  • # Create the sensor object using I2C
  • sensor = ahtx0.AHT10(i2c)
  • while True:
  • print("\nTemperature: %0.2f C" % sensor.temperature)
  • print("Humidity: %0.2f %%" % sensor.relative_humidity)
  • utime.sleep(5)

 

最后整理一下,联网获取时间,然后读取温湿度传感器,让温度湿度信息,在OLED屏幕上显示。

  • from machine import Pin, SoftI2C
  • from ssd1306 import SSD1306_I2C
  • from font import Font
  • import utime,machine,time,network,ahtx0,ntptime
  • i2c = SoftI2C(scl=Pin(7), sda=Pin(6))
  • display = SSD1306_I2C(128, 64, i2c)
  • f=Font(display)
  • display.fill(0) #清屏
  • sensor = ahtx0.AHT10(i2c) #温湿度传感器
  • def sync_ntp():
  • """通过网络校准时间"""
  • while True: #时间校准
  • try:
  • ntptime.settime()
  • break;
  • except:
  • print('time no')
  • time.sleep(1)
  • def dispoled():
  • display.fill(0) #清屏
  • '''显示日期,时间'''
  • mytime=time.localtime()
  • mytime='%d/%d/%d %02d:%02d:%02d'%(mytime[0]-2000,mytime[1],mytime[2],mytime[3]+8,mytime[4],mytime[5])
  • f.text(mytime,0,0,8)
  • '''显示温湿度'''
  • temperature="%0.2f C" % sensor.temperature
  • humidity="%0.2f %%" % sensor.relative_humidity
  • f.text(temperature,0,9,32)
  • f.text("o",90,11,8)
  • f.text(humidity,0,36,32)
  • display.show()
  • sta_if = network.WLAN(network.STA_IF) # 配置wifi模式为station
  • if not sta_if.isconnected(): # 判断有无连接
  • print('connecting to network...')
  • sta_if.active(True) # 激活wifi接口
  • sta_if.connect('weile', 'weile120') # 连接现有wifi网络,需要替换为已知的热点名称和密码
  • while not sta_if.isconnected():
  • print("*")
  • utime.sleep(1) # 未连接上就等待一下,直到连接成功
  • #print('network config:', sta_if.ifconfig()) # 输出当前wifi网络给自己分配的网络参数
  • sync_ntp() #连接网络校时
  • while True:
  • dispoled()
  • #print(type(t),t)
  • print("\nTemperature: %0.2f C" % sensor.temperature)
  • print("Humidity: %0.2f %%" % sensor.relative_humidity)
  • utime.sleep_ms(800)

 

这里在OLED屏幕上显示温度时,“℃”这个符号,偷懒,没有额外做字库,而是使用8号字体的“o”,配合上32号字体的“C”,构成的摄氏度。.最后将代码放入code.py不过没有按预想的启动就运行代码。倒是放入boot.py中能启动就执行。


心得体会:感谢电子工程世界与得捷电子举办的活动。在这里遇到了很多老师。也学会了micropython的使用,和诸多技巧。希望活动越办越好,能够开放更多名额,大家一起玩才好玩!

followme3.zip

950.96 KB, 下载次数: 3

点赞 关注
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
中星联华&ADI明日直播
直播主题:大咖面对面,轻松玩转高速ADC性能测试
直播时间:3月25日(周二)14:00
活动奖励:京东卡、双肩包

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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

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

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

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