【得捷电子Follow me第3期】可以使用ESPNOW同步获取数据的家庭气象站
视频:
pip install esptool
python setup.py install
esptool.py --chip esp32c3 --port com4 erase_flash
esptool.py --chip esp32c3 --port COM78 --baud 460800 write_flash -z 0x0 ESP32_GENERIC_C3-20231005-v1.21.0.bin
pip install esptool
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()
from machine import PWM,Pin
beep = PWM(Pin(5),freq=440,duty=500)
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,())
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())
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)
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)
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)
# 在屏幕上显示文本
任务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的活动试试。
下次有合适的活动希望还能有机会参加。
最后,附上全部六个任务的代码,方便兄弟们测试。