- 2024-10-27
-
发表了主题帖:
【2024 DigiKey 创意大赛】睡眠环境监测屏
睡眠环境监测屏
作者:林太太
一、作品简介
BME680 传感器集成了多个功能,可以测量气体,湿度,压力,温度,结合ESP32-S3-LCD-EV-BOARD开发板,非常适合制作成一个摆在床头的电子监视器。通过读取BME680中的数据,可以获取到常规的温度,湿度,气压数据。结合这些数据,可以计算一个舒适指数,通过观察舒适指数可以检测卧室的睡眠环境好坏。
二、系统框图
系统分为两部分,第一部分是BME680模块,用来获取环境信息;第二部分是ESP32-S3-LCD-EV-BOARD开发板,用来显示各种信息,以及时间。
三、各部分功能说明
开发环境我使用的是circuitpython。先去官网下载对应固件。这里注意一定要下载1.5版本的,因为1.5版本的电路和之前版本的不一样,因此无法兼容。
https://circuitpython.org/board/espressif_esp32s3_lcd_ev_v1.5/
在页面中无需下载固件,可以直接插上开发板进行安装。需要注意的是板子上有两个USB口,我们要使用的是写着USB的那个口,而不是UART的口。并且需要在上电时按住板上的BOOT按键。
点击在线安装后,选择第二个选项:
如果一切顺利,接下来就可以看到安装进度条:
安装好后,按一下板上的RST按键,电脑应该就会自动识别出一个U盘,并且开发板屏幕也会亮起来,并打印出一些终端信息。到这就完成了circuitpython的固件刷写。
在开始编写代码前,首先需要联网。在U盘中的settings.toml文件中写入下面的配置信息,填写好自己家的WiFi信息,保存后然后再按一下板子上的RST按键,板子重启后应该就可以自动连接上网络。
CIRCUITPY_WIFI_SSID=""
CIRCUITPY_WIFI_PASSWORD=""
下面编写代码。代码主要实现了两个功能,一个是从网络上获取时间,另一个是读取BME680的数据。所有数据得到后把它们显示在屏幕上。
代码中的关键部分是每个循环更新的信息。我在里面添加了一个舒适指数,计算方法是看当前温度,湿度,气压和一般舒适范围的偏离程度,偏离程度越大则舒适程度越低。
def update_labels():
t = ntp.datetime
time_label.text = "{}:{:02}:{:02}".format(t.tm_hour, t.tm_min, t.tm_sec)
date_label.text = f"{days[int(t.tm_wday)]}, {t.tm_mday}/{t.tm_mon}/{t.tm_year}"
print(f"\nThe date is {days[int(t.tm_wday)]} {t.tm_mday}/{t.tm_mon}/{t.tm_year}")
print("The time is {}".format(time_label.text))
temperature = bme680.temperature
relative_humidity = bme680.relative_humidity
pressure = bme680.pressure
temperature_value_label.text = "{:0.1f}°C".format(temperature)
relative_humidity_value_label.text = "{:0.1f}%".format(relative_humidity)
pressure_value_label.text = "{:0.1f}hPa".format(pressure)
print("\nTemperature: {}".format(temperature_value_label.text))
print("Humidity: {}".format(relative_humidity_value_label.text))
print("Pressure: {}".format(pressure_value_label.text))
comf_index = (
1
- (
abs(temperature / 25 - 1)
+ abs(relative_humidity / 50 - 1)
+ abs(pressure / 1000 - 1)
)
) * 100
if comf_index < 50:
comfortable_value_label.color = 0xFF0000
elif comf_index < 75:
comfortable_value_label.color = 0xFFFF00
else:
comfortable_value_label.color = 0x00FF00
comfortable_value_label.text = "Comf Index: {:0.0f}".format(comf_index)
print("\n{}".format(comfortable_value_label.text))
写好程序后运行,把模块接在开发板上,IO47,48是I2C接口。然后运行程序,就可以看到程序正常运行起来。
四、作品源码
五、作品功能演示视频
[localvideo]4a3c0a6aab5f9f45d20691974c5dd5f1[/localvideo]
六、项目总结
这个项目中使用了一块非常高质量的开发板。由于是最后一批入围,时间非常紧,加上水平有限,这次对开发板的开发程度相当有限。但在活动结束后依旧可以对这块开发板进行反复把玩,一定会慢慢发挥出它的实力。
- 2024-10-06
-
发表了主题帖:
【2024 DigiKey 创意大赛】物料开箱
大赛的物料收到了,包装非常严密。大赛物料主要包含ESP32-S3-LCD-EV-BOARD和BME680。其中BME680我看到必选物料中既有模块,也有芯片,那自然就直接选择使用模块了,避免了焊接的麻烦。
- 2024-09-29
-
上传了资料:
【Follow me第二季第2期】
-
发表了主题帖:
【Follow me第二季第2期】任务提交
本帖最后由 林太太 于 2024-9-29 17:29 编辑
这一期Follow Me活动选的开发板是Arduino UNO R4 WiFi,Arduino十年磨一剑的产品,发布不久,第一时间做活动给大家体验。我在本次活动中主要使用了两块开发板,一块自然是Arduino UNO R4 WiFi,而另一块是Raspberry Pi Zero2 W,作为Home Assistant服务端来使用。
由于活动中有多个任务需要完成,因此我使用时间控制的方式,在代码中逐一完成任务。
入门任务:搭建环境并开启第一步Blink / 串口打印Hello EEWorld!
使用时间循环的方式,闪烁板载Led灯,并在灯每次闪烁完成后,在串口中打印Hello EEWorld!
void task1() {
unsigned long start_time = millis();
while (millis() - start_time < 20000) {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
Serial.println("Hello, EEWorld!");
}
}
基础任务:驱动12x8点阵LED;用DAC生成正弦波;用OPAMP放大DAC信号;用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
LED矩阵使用起来非常方便,只需要在程序中定义出一个矩阵来,矩阵的形状和板子上的实际矩阵一致。接下来只需要把想要点亮的led标记为1就可以。
byte frame[8][12] = {
{ 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
循环里,只需要不停的把A3,也就是运算放大器输出引脚的数据在串口中打印出来就可以。
void task2() {
unsigned long start_time = millis();
while (millis() - start_time < 20000) {
Serial.println(analogRead(A3));
}
}
运放连线我使用的是电压跟随器的方式,也就是只需要短路A0,A1,以及A2,A3就可以。A0是DAC输出的正弦波, 从A1运放的正向输入端输入;反相输入端A2与输出A3短接,形成电压跟随器。
进阶任务+扩展任务二:通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant);通过外部SHT40温湿度传感器,上传温湿度到HA,通过HA面板显示数据
在这个任务中,要使用几个第三方库,需要自行去库管理器里安装。
#include <ArduinoHA.h>
#include <ArduinoJson.h>
#include <Adafruit_SHT4x.h>
首先要创建一些实例,然后初始化。
WiFiClient client;
HADevice device(MQTT_ID);
HAMqtt mqtt(client, device);
HASensorNumber tmpt("uno_r4_tmpt");
HASensorNumber hmdt("uno_r4_hmdt");
Adafruit_SHT4x sht4 = Adafruit_SHT4x();
void wifi_init() {
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
while (true) {}
}
if (WiFi.firmwareVersion() < WIFI_FIRMWARE_LATEST_VERSION) {
Serial.println("Please upgrade the firmware");
}
// Serial.print("Attempting to connect to Network named: ");
// Serial.println(WIFI_UUID);
WiFi.begin(WIFI_UUID, WIFI_PWD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nWiFi Connected!");
// Serial.println(WiFi.localIP());
}
接着循环里把传感器获取到的数据发布出去就可以了。
void task_last() {
static unsigned long last_time;
if (millis() - last_time > 1000) {
last_time = millis();
sensors_event_t humidity, temp;
sht4.getEvent(&humidity, &temp);
tmpt.setValue(temp.temperature);
hmdt.setValue(humidity.relative_humidity);
}
}
到此为止仅完成了Arduino部分的代码。不要忘记还有一个树莓派,Home Assistant的服务器需要搭建在上面。
先下载树莓派官方的Imager工具。
下面图片使用了官方的动图,因此我们需要根据实际情况做一些调整,比如要把设备选择成Raspberry Pi Zero2W。接着按照下图选择Home Assistant固件,然后选好目标TF卡后,直接烧录。
烧录完成后,把TF卡插入树莓派。
上电后,进入HA的管理界面,在ADD-ON STORE里添加Mosquitto broker。接着在Devices & Services里面添加MQTT,填入本机IP,就完成了全部配置。
先给Arduino接好线,SCL 和SDA对应连接。
然后给Arduino上电,再打开HA面板,就可以看到传感器数据。
至此,所有任务就全部完成了。
这一期Follow Me活动选的开发板是Arduino UNO R4 WiFi,Arduino十年磨一剑的产品,发布不久,第一时间做活动给大家体验。非常好玩。希望往后的活动也能多有这样趣味性比较高,但难度较低的开发板,让大家学习体验。
项目下载:
https://download.eeworld.com.cn/detail/%E6%9E%97%E5%A4%AA%E5%A4%AA/634527
-
加入了学习《【Follow me第二季第2期】任务汇总贴》,观看 【Follow me第二季第2期】任务汇总贴
- 2024-02-03
-
回复了主题帖:
【得捷电子Follow me第4期】基础任务一(补充):ping通互联网站点
看你代码中的LCD CLASS,里面似乎没有text和fill方法呀,是不是代码不全?