473|0

78

帖子

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/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表