[作品提交] 【得捷电子Follow me第3期】可以使用ESPNOW同步获取数据的家庭气象站

白菜虫虫   2023-11-28 19:54 楼主

【得捷电子Follow me第3期】可以使用ESPNOW同步获取数据的家庭气象站

 

视频:

总体介绍

任务1

任务二

任务三

任务四

任务5

任务六

 


 
 
任务1:使用MicroPython系统(必做任务)
 
熟悉Seeed Studio XIAO ESP32C3开发板基本操作,安装esptool,并给开发板刷写MicroPython系统,完成入门程序的运行
搭配器件:Seeed Studio XIAO ESP32C3
 
操作过程:
 
1.安装最新的python。
 
这个就不细讲了,各位大佬都会,不会的兄弟们可以上网搜索一下。
 
2.安装esptool。
2.1方法一:这种方法是大佬都推荐的使用命令行的方式。
首先用管理员权限打开命令行,然后输入
复制
  • pip install esptool

     

命令安装。
这种方式我尝试了多次,死活没有成功。
 
2.2方法二:github下载安装包进行安装。
首先打开github网址:https://github.com/espressif/esptool
195008lk2waar5aunzraa1.jpg
然后选择Code->Cownload ZIP,下载安装包。
将安装包解压到一个你喜欢的位置,路径上不要有中文,比如我就是解压到了桌面(不建议跟我学,然后文件夹名字我也改成了esptool),现在我的路径就是”C:\Users\HP\Desktop\esptool”。在这个目录下打开管理员权限的命令行(或者打开命令行之后切换到自己的文件夹),然后输入
复制
  • python setup.py install

     

回车进行安装。
195008dtmmiwd9ii9eyi28.jpg
 
3.烧录固件:
 
3.1下载固件:打开microPython官网,点击DOWNLOAD,选择SEEED,如果现在你发现有了XIAO C3的专用固件就下载他,还是没有的话就下载一个通用版的ESP32C3固件。
195008yztyqjwttcmvyvte.jpg
 
3.2烧录microPython固件:  
使用USB数据线连接SEEED XIAO C3到电脑,等待驱动安装完毕,查看串口号。
将下载bin固件放到esptool的文件夹中,还是打开命令行,按照网页说明输入
复制
  • esptool.py --chip esp32c3 --port com4 erase_flash

     

擦除flash,com4是你自己的XIAO C3的串口号。
195008pzghh6vzbjh1wbzt.jpg
等待擦除完毕,输入
复制
  • esptool.py --chip esp32c3 --port COM78 --baud 460800 write_flash -z 0x0 ESP32_GENERIC_C3-20231005-v1.21.0.bin

     

烧录MPY固件,com4同样是XIAO C3的串口号,esp32c3-20220117-v1.18.bin
是下载的固件的文件名。
 
3.3测试:
打开串口工具,选择XIAO C3的串口。按下XIAO C3的RST按钮,查看是否有microPython的提示字符,如果有的话输入help()进行测试,如果有提示文字回应,说明microPython环境搭建成功。
195008pswl6vkllslmbhkn.jpg
195008xgmqeg0jjgt1wx1t.jpg

 


 
任务2:驱动扩展板上的OLED屏幕(必做任务)
 
使用扩展板上的OLED屏幕显示文字和图形
搭配器件:Seeed Studio XIAO ESP32C3、Seeed Studio Expansion Board Base for XIAO
 
操作过程:
 
1.安装microPython编辑软件
我是使用的thoony软件,理由是文件的上传下载很方便。
下载地址:https://thonny.org/  (莫谈国事)
195008pqh1wbbw0wyz7551.png
同样的,也可以使用
pip install esptool

 

命令进行安装。
打开thonny,在右下角选择python解释器,选择ESP32+自己的串口号的选项
195008bmmmgug57smf1pbb.jpg
195008ceiiqbeeef91b111.png
在shell窗口看到类似如下显示,就说明连接成功了。
195008txruqes6coxvs3hv.png
 
2.下载SSD1306驱动库。
 
microPython官方固件没有集成SSD1306的驱动,需要自己编写或者下载一个,编写就算了,咱是菜鸟没那个本事,所以我选择下载一个。打开活动界面的“XIAO ESP32C3 MicroPython库”(链接地址:https://github.com/IcingTomato/micropython_xiao_esp32c3
195008yrtzcaj4c3ndclf2.jpg
依次选择driver->display->ssd1306.py
复制代码或者直接下载py文件。
195008m1x1h5hm178k885r.jpg
 
3.上传ssd1306驱动文件:
在文件窗口选择下载的ssd1306.py驱动文件,右键、上传到/。或者新建一个空白文件,将复制的ssd1306.py的文件内容粘贴进去,点击保存,选择保存到microPython设备,文件名自然是“ssd1306.py”。
 
4.连接好电路,新建文件并输入以下程序
复制
  • import ssd1306
    from machine import SoftI2C,Pin,
    
    # 设置IIC
    i2c = SoftI2C(scl=Pin(7),sda=Pin(6),freq=100000)
    # 设置根据活动给出的引脚图可知IIC的scl引脚为D5,也就是7脚
    # 同样的IIC的sda引脚为D4,也就是6脚
    
    # 初始化SSD1306显示屏,分辨率为128X64
    oled = ssd1306.SSD1306_I2C(128, 64, i2c)
    
    # 清除屏幕
    oled.fill(0)
    
    # 显示文字
    oled.text("hello  seeed", 0, 20)
    oled.text("hello xiao C3", 0, 40)
    oled.show()

     

    点击运行按钮,如SSD1306有如下显示,说明本次任务圆满成功。
195008zqz8te5qt0vte5sa.jpg
9a68256832d9731f7f53b6c1095da5f.jpg (377.18 KB, 下载次数: 0)
前天 11:42 上传
 

 
任务3:控制蜂鸣器播放音乐(必做任务)
 
使用Seeed Studio XIAO ESP32C3控制蜂鸣器发出不同频率的声音,并播放一段音乐
搭配器件:Seeed Studio XIAO ESP32C3、Seeed Studio Expansion Board Base for XIAO
 
操作过程:
 
1.蜂鸣器播放音乐简单原理
 
大家都知道,声音源于震动,SEEED的扩展板上集成了一颗压电蜂鸣器,可以把电信号转换成相应频率的震动。
 
2.确定引脚
 
查看扩展板引脚图,得知蜂鸣器buzzer的引脚是A3,再结合XIAO C3的引脚图得知使用的引脚是GPIO5。
195008eigly8inuflc7lnj.jpg
195008fx62hxigjki3q9c3.png
 
3.初始化PWM引脚。
 
引用PWM库,初始化频率为440hz。
复制
  • from machine import PWM,Pin
    
    beep = PWM(Pin(5),freq=440,duty=500)

     

点击运行,我们就可以听到持续的蜂鸣器的响声。
 
4.播放音乐。
 
从网上寻找一个同年经典游戏超级玛丽的音乐,移植到我们的XIAO C3上面,废话不多说,直接贴代码。
复制
  • from machine import PWM,Pin
    
    import time
    
    import _thread
    
    beep = PWM(Pin(5),freq=50000,duty=500)
    
    #cdefgab
    
    s2 = [50000,262 ,294, 330 ,349 ,392 ,220 ,247 ]
    
    s3 = [50000,523,587,659,698,784,440,494]
    
    s4 = [50000,1044, 1175 ,1318, 1397 ,1568 ,880 ,988]
    
    def play(level,power = 1,deltatime = 200):
    
        if power == 0:
    
            beep.freq(s2[level])
    
        elif power == 1:
    
            beep.freq(s3[level])
    
        elif power == 2:
    
            beep.freq(s4[level])
    
        time.sleep_ms(deltatime)
    
        beep.freq(50000)
    
    def plays(l):
    
        for i in l:
    
            if len(i) == 3:
    
                play(i[0],i[1],i[2])
    
            else:
    
                play(i[0],i[1])
    
    def test():
    
        plays([(3,2),(3,2),(0,2),(3,2),(0,2),(1,2),(3,2),(0,2),(5,2),(0,2,500)])
    
        plays([(1,2,600),(5,1,600),(3,1,600),(6,1,400),(7,1,400),(7,1),(6,1,400)])
    
        plays([(5,1),(3,2,400),(5,2),(6,2,400),(4,2),(5,2,400),(3,2,400),(1,2),(2,2),(7,1)])
    
        plays([(1,2,600),(5,1,600),(3,1,600),(6,1,400),(7,1,400),(7,1),(6,1,400)])
    
        plays([(5,1),(3,2,400),(5,2),(6,2,400),(4,2),(5,2,400),(3,2,400),(1,2),(2,2),(7,1)])
    
    _thread.start_new_thread(test,())

     

播放音乐

 
 
 
 

 
任务4:连接WiFi网络(必做任务)
 
将Seeed Studio XIAO ESP32C3连接到WiFi网络,并访问互联网信息
搭配器件:Seeed Studio XIAO ESP32C3、Seeed Studio Expansion Board Base for XIAO、RF ANT 2.4GHZ/5.5GHZ PCB TRACE 
 
操作过程:
 
1.简单的说明
XIAO C3使用microPython连接wifi网络还是比较简单的,我们先来梳理一下步骤。
①引用network库。
②声明wifi工作方式,因为我们需要连接wifi,所以工作方式选择STA_IF模式。
③连接到wifi。
2.连接到WIFI
输入以下代码,将SSID和password修改成你自己的wifi的名称和密码。
复制
  • import utime
    
    import network
    
    #引用库
    
    ssid = "baicaichongchong" #设置你的WiFi名称
    
    password = "12345678" #设置你的WiFi密码
    
    
    
    station = network.WLAN(network.STA_IF)#设置工作方式
    
    station.active(True)#打开XIAO C3无线网络
    
    station.connect(ssid, password)#连接wifiwhile station.isconnected() == False:
    
        pass
    
    print("Connection successful")
    
    print(station.ifconfig())

     

点击运行,如果得到类似下面的输出,说明已经成功将你的XIAO C3连接到了你的wifi。
195008i46r8i0ifvn0zqzp.png
  1. 简易网络时钟。
通过几个步骤,我们可以制作一个简单的网络时钟:
①连接WiFi网络使得XIAO C3可以连接到互联网。
②通过ntptime库连接网络授时服务器,获取网络事件并更新给扩展版板载的pcf8563 RTC芯片。
③读取时间并在SSD1306上进行显示。
复制
  • 
    import utime
    
    import network
    
    from machine import RTC
    
    import time
    
    from machine import I2C
    
    import ntptime
    
    import pcf8563
    
    import ssd1306
    
    
    
    ssid = "bai'cai'chong'chong"
    
    password = "12345678"
    
    
    
    station = network.WLAN(network.STA_IF)
    
    station.active(True)
    
    station.connect(ssid, password)
    
    while station.isconnected() == False:
    
        pass
    
    print("Connection successful")
    
    print(station.ifconfig())
    
    
    
    rtc = RTC()
    
    ntptime.settime()
    
    
    
    time.sleep(1)
    
    
    
    print('sync success')
    
    utime.localtime()
    
    
    
    i2c = I2C(scl=7, sda=6)
    
    r = pcf8563.PCF8563(i2c)
    
    oled = ssd1306.SSD1306_I2C(128, 64, i2c)
    
    
    
    print('rtc time')
    
    r.datetime()
    
    print(r.datetime()[3])
    
    time.sleep(1)
    
    print('sync system to pcf8563')
    
    r.write_now()
    
    station.active(False)
    
    
    
    while True:
    
        nt = r.datetime()
    
        oled.fill(0)
    
        oled.text(f"{nt[0]}-{nt[1]}-{nt[2]}", 20, 20)
    
        oled.text(f"{nt[4]}:{nt[5]}:{nt[6]}", 40, 40)
    
        print(f"{nt[0]}-{nt[1]}-{nt[2]}  {nt[4]}:{nt[5]} {nt[6]}")
    
        #显示日期时间
    
    
    
        oled.show()
    
    
    
        time.sleep(1)

     

点击运行 
195008x7wtjt7wojmbw7jt.png
 
显示时间

 
 
 
 

任务5:使用外部传感器(必做任务)
 
连接环境光传感器或温湿度传感器,获取传感器的数值,并转换成真实的物理量
搭配器件: Seeed Studio XIAO ESP32C3、Seeed Studio Expansion Board Base for XIAO、 Grove - AHT20 I2C Industrial Grade Temperature and Humidity Sensor、Grove - Light Sensor v1.2
 
操作过程:
 
1.下载驱动文件
通过help(‘modules’)命令查看,可以知道ESP32C3的标准microPython固件里面没有包含aht20的驱动文件,大家可以自行选择喜欢的aht20驱动文件,我是在github上搜索并下载了一个文件,地址如下:
 
2.尝试获取温湿度
同时,在这个GitHub界面也给出了一个例程,让我们复制并测试一下。
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)

 

注意IIC引脚要和SSD1306一样替换成我们的XIAO C3的引脚。
将SEEED的aht20模块连接到扩展版上,点击运行程序,如果有类似下面的输出内容,则说明aht20模块驱动成功。
195008hxjrc33fxsrcylpn.png
 
3.使用SSD1306显示温湿度。
下面我们对历程进行扩展,使用SSD1306来显示温湿度。
程序如下:
复制
  • import machine
    import ssd1306
    import utime
    import ahtx0
    from machine import SoftI2C,Pin,
    i2c = SoftI2C(scl=Pin(7),sda=Pin(6),freq=100000)
    
    Pin(4).value(0)
    Pin(5).value(1)
    # 初始化SSD1306显示屏
    oled = ssd1306.SSD1306_I2C(128, 64, i2c)
    sensor = ahtx0.AHT10(i2c)
    # 清除屏幕
    
    while True:
    oled.fill(0)
    oled.text("Temperature:", 0, 10)
    oled.text("{:.2f} C".format(sensor.temperature), 40, 20)
    print("\nTemperature: %0.2f C" % sensor.temperature)
    oled.text("Humidity: ", 0, 40)
    oled.text("{:.2f} %".format(sensor.relative_humidity), 40, 50)
    print("Humidity: %0.2f %%" % sensor.relative_humidity)
    oled.show()
    utime.sleep(2)
    
    
    # 在屏幕上显示文本
    
    
    

     

点击运行,就可以同步在SSD1306屏幕显示温湿度了。
气象站

 

 

任务6:综合实践(选做,非必做)

 

自选任务:可以使用ESPNOW同步获取数据的家庭气象站

 

本次我想要实现的功能是简单的家庭气象站。

使用的硬件有XIAO C3 两个,相应的扩展板一个,aht20温湿度传感器一个。

首先利用XIAO C3驱动aht20读取当前环境温湿度,然后使用SSD1306进行显示,最后通过网络使用ESPNOW共享给其他的XIAO C3设备,这样就不用每次都跑到设备跟前去查看了。

 

具体就不讲了,直接上程序

气象站+发送端程序:

import utime
import network
from machine import RTC
import time
from machine import I2C
import ntptime
import pcf8563
import ssd1306

import ahtx0
import espnow

ssid = "baicaichongchong"
password = "12345678"

station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
while station.isconnected() == False:
    pass
print("Connection successful")
print(station.ifconfig())

rtc = RTC()
ntptime.settime() 


time.sleep(1)

print('sync success')
utime.localtime()

i2c = I2C(scl=7, sda=6)
r = pcf8563.PCF8563(i2c)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
sensor = ahtx0.AHT10(i2c)

print('rtc time')
r.datetime()
print(r.datetime()[3])
time.sleep(1)
print('sync system to pcf8563')
r.write_now()

station.active(False)
time.sleep(1)
station.active(True)
e= espnow.ESPNow()
e.active(True)
peer1 = b'4\x85\x18\x06\xca\x18'
e.add_peer(peer1)

while True:
    nt = r.datetime()
    oled.fill(0)
    oled.text(f"{nt[0]}-{nt[1]}-{nt[2]}", 4, 2)
    oled.text(f"{nt[4]}:{nt[5]}:{nt[6]}", 50, 12)
    e.send(peer1,f"{nt[0]}-{nt[1]}-{nt[2]}  {nt[4]}:{nt[5]} {nt[6]}".encode())
    print(f"{nt[0]}-{nt[1]}-{nt[2]}  {nt[4]}:{nt[5]} {nt[6]}")
    #显示日期时间
    
    oled.text("Temperature:", 4, 23)
    oled.text("{:.2f} C".format(sensor.temperature), 60, 33)
    e.send(peer1,"\nTemperature: %0.2f C" % sensor.temperature)
    print("\nTemperature: %0.2f C" % sensor.temperature)
    #显示温度
    
    oled.text("Humidity: ", 4, 44)
    oled.text("{:.2f} %".format(sensor.relative_humidity), 60, 54)
    e.send(peer1,"Humidity: %0.2f %%" % sensor.relative_humidity)
    print("Humidity: %0.2f %%" % sensor.relative_humidity)
    #显示湿度
    
    oled.rect(0, 0, 128, 64, 1)
    oled.rect(0, 21, 128, 21, 1)
#     oled.hline(3, 20, 1, 124)
#     oled.hline(3, 40, 1, 124)
    
    oled.show()
    
    time.sleep(1)


 

 

要记得把WIFI账号密码改成自己的,然后要获取一下接收端的MAC地址也在这里修改一下。

 

 

接收端程序:

 

import network
import espnow
from machine import Pin

sta = network.WLAN(network.STA_IF)
sta.active(True)

e = espnow.ESPNow()
e.active(True)

while True:
    host, msg = e.recv()
    if msg:
        print(host,msg)
    else:
        time.sleep(0.1)

 

 

接收端的程序相比就简单很多了,有多余的屏幕的兄弟们可以在这个基础上添加上OLED显示,不会的同学翻看前面的任务。

 


心得体会

感谢电子工程世界和得捷举办的这次活动,这是第一次参加类似的活动,感觉收获颇丰。
通过本次活动,加深了对ESP32C3的了结,掌握了不少以前不知道的硬件细节。
学会了ssd1306,温湿度传感器,espnow等等新的新的硬件和功能。
深入学习了MPY的使用,感觉MPY真的很方便,能够很方便的调试程序,不像arduino那样修改一个参数也要等好久重新编译。
参加活动更好的一点感受就是,有了活动时限的要求,感觉可以很大程度上的消除惰性,更主动更积极的去学习。和我一样有拖延症又想学东西的兄弟们强烈建议也来参加eeworld的活动试试。
下次有合适的活动希望还能有机会参加。

 

最后,附上全部六个任务的代码,方便兄弟们测试。

followme第三期.zip (7.72 MB)
(下载次数: 1, 2023-11-28 20:32 上传)

 

 

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复