【得捷Follow me第3期】远程无线开灯提醒器
[复制链接]
本帖最后由 eew_dy9f48 于 2023-12-12 20:58 编辑
必做任务1:使用MicroPython系统
esptool是乐鑫的官方刷机程序,可以从baidu上下载到,下载完成后,通过以下命令来清空当前flash内的内容,其中COMx是开发板对应的串口号。
python esptool.py -p COMx -b 460800 --before default_reset --chip esp32c3 erase_flash
随后去micropython官网下载ESP32_GENERIC_C3-20231005-v1.21.0.bin, 并使用命令即可完成固件刷写。
python esptool.py -p COMx -b 460800 --before default_reset --chip esp32c3 write_flash --flash_mode dio --flash_size detect 0x0 ESP32_GENERIC_C3-20231005-v1.21.0.bin
接着写一个简单的小程序,验证一下micropython是否刷写成功:
必做任务2:驱动扩展板上的OLED屏幕
先按照下图方式安装所需的库文件:
安装好后将OLED屏与开发板进行连接,scl与sda引脚分别连接GPIO10和GPIO9,供电使用3.3V进行供电。
屏幕初始化的代码十分简单,先初始化I2C对象,接着把这个I2C对象作为参数初始化一个oled对象即可。我们试着在屏幕上写一段文字,并画一个方框作为外框,可以看到一切正常。
i2c = machine.SoftI2C(machine.Pin(10), machine.Pin(9))
oled = SSD1306_I2C(128, 64, i2c, vfilp=1, hfilp=1)
oled.fill(0)
oled.rect(5, 25, 116, 15, 1)
oled.text('Hello EEWORLD!', 8, 29, 1)
oled.show()
必做任务3:控制蜂鸣器播放音乐
这里我使用的是一颗无源蜂鸣器,直接把他插在面包板上,正极接3.3V,负极接GPIO8。这样当GPIO8为LOW时电路导通,为HIGH时电路断开。这样接线的好处是一般情况下单片机的开漏输出能力都会高于推挽,可以更好的驱动蜂鸣器进行工作。
驱动方法使用的是PWM方法,只需要设置合适的PWM占空比,接着按照乐谱的顺序,调整相应的PWM频率即可。在播放音乐时,屏幕会显示playing字样。
oled.fill(0)
oled.text('Playing', 30, 29, 1)
oled.show()
tones = {'1': 262, '2': 294, '3': 330, '4': 349, '5': 392, '6': 440, '7': 494, '-': 0}
melody = "334554321123322-334554321123211-"
beeper = machine.PWM(machine.Pin(8, machine.Pin.OUT))
for tone in melody:
freq = tones[tone]
if freq:
beeper.init(duty=1000, freq=freq)
else:
beeper.duty(0)
time.sleep_ms(400)
beeper.duty(0)
time.sleep_ms(100)
beeper.deinit()
必做任务4:连接WiFi网络
Micropython内置了一个network库,可以用几行代码很方便的连接到wifi。连接成功后,会获取到本机的ip,并将ip地址显示在屏幕上。
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.disconnect()
wifi.connect(ssid, password)
while not wifi.isconnected():
pass
oled.fill(0)
oled.text('IP Address:', 2, 20, 1)
oled.text(wifi.ifconfig()[0], 2, 35, 1)
oled.show()
必做任务5:使用外部传感器
外部传感器我选用的是一颗光敏电阻传感器,光敏电阻传感器有暗电阻和亮电阻两种状态,我选用的这颗是5506,亮电阻差不多2-6k欧姆,暗电阻0.15M欧姆。使用一颗10K左右的电阻进行分压后,接入GPIO2引脚,这个引脚在C3上是有ADC功能的,因此可以测量模拟量。用micropython 内置的ADC方法测量到读数后,会得到一个0-4095的值,我们把这个值显示在OLED上,并持续测量5秒钟。
adc = machine.ADC(2)
t=time.time()
while time.time() - t < 5:
oled.fill(0)
oled.text('Brightness:', 2, 20, 1)
oled.text(str(adc.read()), 2, 35, 1)
oled.show()
可选任务6:远程无线开灯提醒器
完成这个任务需要一些额外的硬件,首先xiao在这里用作传感器,用来获取光亮度数据;另外一片单片机作为执行单元,负责进行开灯提醒,或是直接自动控制开灯关灯。只要是带有网络功能的单片机都可以使用,这里我用了一块esp32s3,一样也是运行micropython。他们之间的通讯使用物联网常用的MQTT协议进行。而MQTT还需要一个服务器,作为MQTT Broker,这个服务器使用树莓派进行制作。
在活动中我还申请了一块树莓派CM4计算模块,它的硬件配置与4B相当,但不能直接使用,因为只是一块核心板,需要搭配底板一起使用。
底板的选用在这个项目上范围非常大,几乎没有任何限制。因为作为MQTT broker,我们只需要确保系统能正常运行,以及WIFI能连接即可。因此对底板的要求只有两个,一是供电,二是TF卡槽,负责储存固件。而下至第三方b型底板,上至reterminal,都可以做到以上两点要求。这里我们就选用一块最普通的bigtree 的底板来使用。
第一步是插入TF卡烧录固件。这一步只需要下载Pi imager即可完成傻瓜式烧录。为了尽可能低功耗长期稳定使用,我们最好烧录Lite版本的固件,这样对系统资源消耗最少。
接着,我们要确保系统是最新的。为此,输入以下命令来更新系统:
sudo apt update
sudo apt upgrade
这将更新系统并安装任何可用的更新。
接下来就可以正式安装Mosquitto。在终端中运行以下命令:
sudo apt install mosquitto mosquitto-clients
在安装过程中,包管理器会自动配置Mosquitto服务器在开机时启动,这是以systemctl的方式进行控制的。
安装完成后,设备上将启动并运行Mosquitto MQTT代理。
为了验证Mosquitto是否已成功安装并正在运行,可以使用以下命令:
sudo systemctl status mosquitto
这将显示Mosquitto服务的状态。如果服务已经成功启动,应该会在输出中看到"active (running)"字样。
但是到目前为止这个broker还仅支持本机发送的指令,如果想要真正作为服务器,让其他客户设备接入,需要进行一下配置。
首先打开并编辑配置文件mosquitto.conf
sudo nano /etc/mosquitto/mosquitto.conf
在里面加入以下内容
listener 1883
allow_anonymous true
最后再重启服务,就可以完成配置。
sudo systemctl restart mosquitto
最后实现的效果,可以参考演示视频的最后部分。
下载链接:https://download.eeworld.com.cn/detail/eew_dy9f48/630258
|