创客项目秀|基于XIAO ESP32S3 的可以检测困倦的海绵宝宝!

科技   2024-10-24 18:03   广东  

今天为大家带来的是来自Hackster创作者Mondal3011的作品:可以检测困倦的海绵宝宝.这个装置主要是使用二氧化碳传感器去进行二氧化碳浓度测试,通过识别二氧化碳来判断环境是否会造成人体困倦。通常,房间里的高 CO2 会导致嗜睡。当房间里的 CO2 水平上升时,这个海绵宝宝会变得困倦,这样你就可以打开窗户了!

材料清单

硬件


  • Seeed Studio XIAO ESP32S3 Sense

  • Mq135

  • 跳线

  • 丝杆电机

  • M4螺栓

软件


  • Arduino IDE

  • JLCPCB易达


故事背景

最近,你可能注意到自己在课堂上感到很困。也许你并不觉得课程无聊,而且晚上睡得很好,所以这不是原因。经过一些在线研究(主要是通过 Google 和 ChatGPT),你发现这种困倦可能是由于教室里积累了过多的二氧化碳。这让人觉得有道理,因为最近天气很冷,教室的门窗大部分时间都关着。

同样的问题也可能出现在你的宿舍。当你学习时,可能会感到昏昏欲睡,因为一直关着窗户,导致房间内二氧化碳浓度过高。于是,你想出了一个创意,制作一个看起来很酷且直观易懂的 CO2 监测器!这个监测器的设计灵感来源于海绵宝宝,眼睑会根据二氧化碳水平的变化而上下移动,显示他有多困。当 CO2 水平较低时,海绵宝宝的眼睛会睁得大大的,眼睑高高翘起;随着二氧化碳浓度的升高,眼睑会逐渐降低。如果眼睛完全闭上,意味着房间里的二氧化碳浓度过高,你最好让一些新鲜空气进来!

加工流程

该项目的主要组件是 MQ135 空气质量传感器和小 esp32 微控制器。该装置还包含 5 个霍尔效应传感器,每个传感器都映射到特定的 CO2 ppm 水平。电机通过 L293D 电机驱动器 IC 连接到微控制器。该电机是一种 DIY 丝杆电机,可根据旋转方向上下移动眼睑。眼睑的长端包含一个磁铁,霍尔传感器可以检测到该磁铁。微控制器读取 MQ135 传感器的模拟输出,并通过一些数学运算将其转换为 CO2 ppm 水平。这是在特定的持续时间内完成的(在我的代码中为 5 分钟),并且 ppm 值是该持续时间的平均值。然后,微控制器打开丝杆电机,直到磁体位于霍尔传感器前面,该传感器对应于相同的 ppm(在容差范围内)。这样眼睑就会移动以匹配 ppm 水平。

电路设计

对于这个项目,决定设计一个 PCB 并组装起来是个很好的选择。尽管之前没有过这样的经验,但这正是一个探索新领域的机会。许多创作者在 Instructables 和 YouTube 上展示了他们自己的 PCB 制作过程,这为这个项目提供了很好的灵感和指导。

使用 EasyEDA 设计电路和 PCB 是一个不错的选择。虽然可能还有其他更优秀的工具,但 EasyEDA 因其易于学习和使用而受到许多 YouTuber 的青睐。通过这个平台,可以有效地设计出所需的电路图和印刷电路板,从而使整个项目更加顺利地进行。

设计PCB

PCB 由 Seeed Fusion 制造,因此在设计之前,确保仔细阅读了他们的所有指南。

首先,用户在设计菜单中选择了“将原理图转换为 PCB”选项,立创EDA 随即生成了一个新的 PCB 文件,其中包含了原理图中的所有元器件。接下来,用户开始设计 PCB,并生成了 Gerber 文件。目前的设计以海绵宝宝为特色,虽然没有他的 SquarePants,但欢迎其他人添加裤子,完全没有规定禁止这样做!

在材料选择上,决定使用 Sunboard,这是一种低密度 PVC 板。Sunboard 非常易于使用,同时仍然具备较好的耐用性,十分适合这种手工艺项目。

制作海绵宝宝

这个项目中使用 Sunboard,一种低密度 PVC 板。它非常易于使用,同时仍然非常耐用,非常适合这种工艺。

组装

组装好 PCB 后,把它全部组装在一起。并将 CO2 传感器放在后面以将其隐藏起来。如果您也这样做,请确保框架不要放置在没有空气流通的房间角落。否则你的海绵宝宝可能总是昏昏欲睡!移动时眼睑确实会有点晃动,但这根本不是问题。由于它们仅在 CO2 水平存在显著差异时才会移动,因此您几乎不会看到它们移动。但是,它在移动时确实会发出一些噪音。主要是因为旧减速电机磨削。所以认为微型 N20 电机会是更好的选择。

代码

//  为霍尔传感器、电机驱动器和 MQ135 传感器定义引脚const int hallSensors[] = {D1, D2, D3, D4, D5};const int motorEnable = D8;const int motorInput1 = D6;const int motorInput2 = D7;const int mq135Pin = A0;
MQ135 gasSensor = MQ135(mq135Pin);
// 为每个霍尔传感器定义 CO2 ppm 范围const int ppmRanges[][2] = { {800, 1000}, {1001, 1200}, {1201, 1400}, {1401, 1600}, {1601, 1800}};
//存储 CO2 ppm 读数const int maxReadings = 30; // 5 minutes / 10 secondsfloat ppmReadings[maxReadings];int readingIndex = 0;
void setup() { Serial.begin(115200);
// 将霍尔传感器初始化为输入端 for (int i = 0; i < 5; i++) { pinMode(hallSensors[i], INPUT); }
// 将电机驱动器引脚初始化为输出端 pinMode(motorEnable, OUTPUT); pinMode(motorInput1, OUTPUT); pinMode(motorInput2, OUTPUT);
// 初始化电机,使其停止 digitalWrite(motorEnable, LOW);}
void loop() { // 从 MQ135 传感器读取二氧化碳ppm 含量 float ppm = gasSensor.getPPM();
// 存储 CO2 ppm 读数 ppmReadings[readingIndex] = ppm; readingIndex = readingIndex + 1; if(readingIndex >= 30) { //计算二氧化碳的平均ppm含量 int avgPPM = calculateAveragePPM();
// 根据 CO2 ppm 平均水平确定目标大厅传感器 int targetSensor = determineTargetSensor(avgPPM);
// 将电机移至目标霍尔传感器处 moveMotorToTargetSensor(targetSensor);
readingIndex = 0; }
delay(10000); // 等待 10 秒}
// 根据存储的读数计算二氧化碳的平均ppm含量int calculateAveragePPM() { int sum = 0; for (int i = 0; i < maxReadings; i++) { sum += ppmReadings[i]; } return sum / maxReadings;}
// 根据 CO2 ppm 平均水平确定目标大厅传感器int determineTargetSensor(int avgPPM) { for (int i = 0; i < 5; i++) { if (avgPPM >= ppmRanges[i][0] && avgPPM <= ppmRanges[i][1]) { return i; } } return 0; //如果 avgPPM 超出范围,则默认为第一个传感器}
// 将电机移至目标霍尔传感器处void moveMotorToTargetSensor(int targetSensor) { int currentSensor = getCurrentSensor(); if (currentSensor != targetSensor) { int direction = (targetSensor > currentSensor) ? 1 : -1; while (currentSensor != targetSensor) { moveMotor(direction); currentSensor = getCurrentSensor(); } stopMotor(); }}
// 获取当前霍尔传感器int getCurrentSensor() { for (int i = 0; i < 5; i++) { if (digitalRead(hallSensors[i]) == LOW) { return i; } } return 0; // 如果没有传感器处于活动状态,则默认为第一个传感器}
// 按指定方向移动电机void moveMotor(int direction) { digitalWrite(motorEnable, HIGH); if (direction == 1) { digitalWrite(motorInput1, HIGH); digitalWrite(motorInput2, LOW); } else { digitalWrite(motorInput1, LOW); digitalWrite(motorInput2, HIGH); }}
// 停止电机void stopMotor() { digitalWrite(motorEnable, LOW);}





 Seeed Studio XIAO币76xiao ESP32S3 








|XIAO

Doly

|Wio Termial

-MBO

|XIAO 

| Raspberry Pi 5 

|Raspberry Pi Zero

STM32500KHz

|LVGLOLEDFFT

|XIAO ESP32C3 

创客项目秀|基于Seeed XIAO 的智能宠物猫砂盆

创客项目秀|基于Wio Terminal的Meshwork

创客项目秀|基于Grove Vision AI2模块的边缘计算机视觉项目

创客项目秀|基于XIAOESP32S3 Sense的在线语音助手

创客项目秀|基于Seeed XIAO ESP32S3 sense的HA自动化鱼缸

创客项目秀|基于XIAO ESP32 sense的宠物猫检测项目



新一代信息技术赋能|人才升级|产业创新



柴火课程合集!

柴火驻场会员火热招募中!

Seeed Studio物联网设备试用中心落地柴火!


----END----

  Chaihuo x.factory|深圳,河北 






柴火创客空间
深度服务产业升级的国际化双创平台
 最新文章