【得捷电子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=8, server='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的使用,和诸多技巧。希望活动越办越好,能够开放更多名额,大家一起玩才好玩!
|