PCBWay定制PCB
|
× 1 |
Arduino Nano RP2040 连接
|
× 1 |
5000ppm二氧化碳传感器红外模块
|
× 1 |
GP2Y1010AU0F 灰尘传感器
|
× 1 |
0.91" OLED液晶显示模组
|
× 1 |
5mm共阳极RGB LED
|
× 1 |
220µF 电容
|
× 1 |
150Ω电阻
|
× 1 |
2.2K电阻
|
× 1 |
3.3K电阻
|
× 1 |
电源插座
|
× 1 |
外接电池
|
× 1 |
The dust density and the carbon dioxide (CO2) density affect my sleep quality and health detrimentally due to the fact that I have allergic bronchitis. Allergic bronchitis is a chronic pulmonary disease, and exposure to allergy triggers like tobacco smoke, pollution, or dust can instigate it. When the dust density and the carbon dioxide density are higher, it becomes struggling for me to breathe, especially while sleeping. Therefore, I decided to create this project to track the dust density and the carbon dioxide density in my room remotely so as to get a prescient warning to extenuate my symptoms before going to bed.
由于 Telegram 是一个兼容 iOS 和 Android 的跨平台基于云的消息服务,我决定创建一个 Telegram 机器人来轻松监控多个设备上的灰尘和二氧化碳密度评估。在 Telegram 中,与任何其他消息传递应用程序不同,使用命令列表创建机器人很容易,这些消息应用程序是不需要额外电话号码来设置的特殊帐户。IoT Carbon Dioxide and Dust Monitor 是我为这个项目创建的 Telegram 机器人,它允许用户使用以下命令显示实时灰尘和二氧化碳密度评估:
我开发了一个 PHP Web 应用程序(传出)来与我的 Telegram 机器人通信。该应用程序从 Telegram Bot API 更新,将传感器生成的灰尘和二氧化碳密度评估(如下所述)保存到给定的 MySQL 数据库表中,并在请求时将密度评估发送到我的 Telegram bot。
为了准确获取灰尘密度和二氧化碳浓度,我使用了 MH-Z14A NDIR CO2 传感器和 GP2Y1010AU0F 灰尘传感器。我选择使用 Arduino Nano RP2040 Connect 来读取评估并将其传输到 Web 应用程序,因为它是具有内置 u-blox NINA-W102 无线电模块的高性能开发板。顾名思义,该板基于 Raspberry Pi Foundation 的 RP2040 微控制器。
为了在将评估发送到 Web 应用程序之前在设备上显示评估,我使用了 SSD1306 OLED (128x32) 屏幕。最后,我添加了一个 5mm 共阳极 RGB LED 来显示设备(通过 Nano RP2040 Connect)和 Web 应用程序之间的连接状态。
在完成面包板上的接线并测试代码后,Jigglypuff 启发我为这个项目设计了一个 PCB。由于 Jigglypuff 有一个臭名昭著的睡眠发作,我认为为一个项目设计一个 Jigglypuff PCB 会很可爱,这有助于我在睡觉前缓解我的过敏症状 :)
由于粉红色 PCB 并不普遍,您之前可能没有见过粉红色阻焊层选项。如果您想像我的 PCB 一样设计带有粉色阻焊层选项的 PCB,我强烈推荐 PCBWay。他们为独特的 PCB 颜色和要求提供快速、可靠且经济实惠的服务。您可以从这里检查 PCBWay 阻焊层和丝印选项 。
在对我的 PCB 设计进行原型设计之前,我使用 Arduino Nano RP2040 Connect 测试了所有连接和接线。
然后,我利用 KiCad 设计了物联网二氧化碳和灰尘监测器 PCB - 灵感来自可爱迷人的 Jigglypuff :) 我在下面附上了 PCB 的 Gerber 文件。因此,如果您愿意,您可以从 PCBWay 订购此 PCB,以创建一个可爱的设备来跟踪任何地方的灰尘密度和二氧化碳密度。
首先,通过使用烙铁,我连接了接头(母)、电阻器(150Ω、2.2K、3.3K)、MH-Z14A NDIR CO2 传感器、GP2Y1010AU0F 灰尘传感器、5mm 共阳极 RGB LED、电容器(220μF)和电源插孔。
PCB上的元件清单:
A1(用于 Arduino Nano RP2040 连接的接头)
SSD1306(SSD1306 OLED (128x32) 屏幕的接头)
MHZ14(MH-Z14A NDIR CO2 传感器)
GP2Y10(GP2Y1010AU0F灰尘传感器)
D1 (5mm 共阳极 RGB LED)
C1 (220μF电容)
R1(2.2K电阻)
R2(3.3K电阻)
R3(150Ω电阻)
J1(电源插孔)
为了让我的 PCB 设计更加精致,我在 PCB 背面安装了 GP2Y1010AU0F 灰尘传感器,并用热胶枪将其固定。我还添加了两个焊接跳线垫(JP1、JP2),将 Nano RP2040 Connect 连接到 MH-Z14A CO2 传感器的 UART 接口。
BotFather 是一个 Telegram 机器人,可让我们在 Telegram 上创建和管理机器人,而无需任何编码。
? 首先,在 Telegram 上打开 BotFather 并输入 /start 以查看可用的命令列表和手册。
? 使用 /newbot 命令创建一个新机器人。当 BotFather 要求您输入名称时,输入您的机器人的名称。它显示在联系方式和其他地方。
物联网二氧化碳和粉尘监测仪
? 然后,输入您的机器人的用户名。用户名长度为 5-32 个字符,不区分大小写,但只能包含拉丁字符、数字和下划线。它们必须以“bot”结尾,例如“tetris_bot”或“TetrisBot”。
co2_dust_bot
? 在这些步骤之后,BotFather 会为您的新机器人生成一个授权令牌。授权令牌是一个类似于 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11 的字符串,它是授权机器人并向 Telegram Bot API 发送请求所必需的。确保您的令牌安全并安全存储。
? 此外,您可以使用/setuserpic 命令更改机器人的个人资料图片 。
? 最后,输入 /setcommands 命令来定义最近创建的机器人支持的命令列表。用户在与机器人的聊天中键入 / 时,会将这些命令视为建议。
?? 我为 Telegram 机器人(IoT 二氧化碳和粉尘监测器)创建的命令列表:
成功创建 Telegram 机器人后,我需要从 Telegram Bot API 获取更新以与我的机器人通信。因此,我用 PHP 开发了一个 web 应用程序,名为 telegram_co2_and_dust_monitor,以便:
该应用程序包含一个文件 - index.php。我在 index.php 文件中创建了一个名为 telegram_co2_dust_monitor 的类,以保存 Nano RP2040 Connect 传输的信息到给定的 MySQL 数据库表,并在请求时将该信息发送到给定的 Telegram 机器人。
? 在 __init__ 函数中,该类需要四个参数来执行函数:
? 在 send_message 函数中,应用程序使用机器人的授权令牌通过 Telegram Bot API 将给定的文本发送给给定的机器人。
语法:https://api.telegram.org/bot
? 在 send_photo 函数中,应用程序使用机器人的授权令牌通过 Telegram Bot API 将给定的图片发送给给定的机器人。
语法:https://api.telegram.org/bot
? 在 send_video 函数中,应用程序使用机器人的授权令牌通过 Telegram Bot API 将给定的视频发送到给定的机器人。
语法:https://api.telegram.org/bot
{
->token = $token;
->web_path = $server.$token;
->conn = $conn;
->table = $table;
}
{
$new_message = -> web_path。 .$id. .urlencode($string);
file_get_contents($new_message);
}
{
$new_photo = -> web_path。 .$id. .$照片。 .$caption;
文件获取内容($new_photo);
}
{
$new_video = -> web_path。 .$id. .$视频。 .$caption;
文件获取内容($new_video);
}
? 在 update_database 函数中,将给定信息保存到给定 MySQL 数据库表中的给定列。
{
$sql = ;
mysqli_query( ->conn, $sql);
}
? 在 get_data_from_database 函数中,从给定 MySQL 数据库表的给定列中获取并返回请求的信息。
{
$sql = ;
$result = mysqli_query( ->conn, $sql);
($row = mysqli_fetch_assoc($result)){
$row[$_column];
}
}
? 定义所需的 MySQL 数据库连接设置和 co2_dust_monitor 对象及其所需参数。
$server = ( => , => , => , => , => ); $conn = mysqli_connect($server[ ], $server[ ], $server[ ], $server[ ]); $co2_dust_monitor = telegram_co2_dust_monitor(); $bot_token = ; $co2_dust_monitor->__init__($bot_token, , $conn, $server[ ]);
? 从 Telegram Bot API 获取更新。
$updates = json_decode(file_get_contents( ), );
? 如果应用程序从 Telegram Bot API 接收数据,则获取聊天 ID 和消息。
? 根据传入消息的类型 - 照片、视频、文档或文本 - 使用引发的聊天 ID 回复聊天。
? Web 应用程序与来自给定 Telegram 机器人的这些命令兼容:
? 如果收到 /start 命令,应用程序会将聊天 ID 注册到给定的 MySQL 数据库表,以便发送消息而无需从 Telegram Bot API 进行更新。
? 如果收到 /co2_density 命令,Web 应用程序会将存储在数据库表中的最新二氧化碳密度评估和更新时间发送给给定的 Telegram 机器人。
? 如果收到 /dust_density 命令,Web 应用程序会将存储在数据库表中的最新灰尘密度评估和更新时间发送给给定的 Telegram 机器人。
? 如果接收到 /help 命令,Web 应用程序会将带有描述的支持命令列表发送到给定的 Telegram 机器人。
? 默认情况下,如果没有收到支持的命令而是文本,Web 应用程序会发送:
等待你的命令:)
($updates[ ]){ $chat_id = $updates[ ][ ][ ]; $message = $updates[ ][ ]; ($updates[ ][ ]){ $co2_dust_monitor->send_message($chat_id, ); } ($updates[ ][ ]){ $co2_dust_monitor->send_message($chat_id, ); } ($updates[ ][ ]){ $co2_dust_monitor->send_message($chat_id, ); } { ($message){ : $co2_dust_monitor->update_database( , $chat_id); $co2_dust_monitor->send_message($chat_id, ); ; : $co2 = $co2_dust_monitor->get_data_from_database( ); $date = $co2_dust_monitor->get_data_from_database( ); $co2_dust_monitor->send_message($chat_id, ); ; : $dust = $co2_dust_monitor->get_data_from_database( ); $date = $co2_dust_monitor->get_data_from_database( ); $co2_dust_monitor->send_message($chat_id, ); ; : $co2_dust_monitor->send_message($chat_id, ); ; : $co2_dust_monitor->send_message($chat_id, ); ; } } }
? 如果 Nano RP2040 Connect 将灰尘和二氧化碳密度评估传输到 Web 应用程序,请将它们保存到给定的 MySQL 数据库表中。然后,使用 date 函数设置时区以精确得出最新的更新时间,并将其保存到数据库表中。
( ($_GET[ ]) && ($_GET[ ])){ $co2_dust_monitor->update_database( , htmlentities($_GET[ ])); $co2_dust_monitor->update_database( , htmlentities($_GET[ ])); date_default_timezone_set( ); $co2_dust_monitor->update_database( , date( )); ( ); }
在用 PHP 开发 Web 应用程序后,我在我的服务器上创建了一个新的 MySQL 数据库 (telegramco2dustmonitor)。然后,我在 telegramco2dustmonitor 数据库中创建了一个数据库表(条目),以收集 Nano RP2040 Connect 传输的灰尘和二氧化碳密度评估。最后,我在条目数据库表中为每个属性(列)插入了默认值:
telegramco2dustmonitor > 条目 > 属性:
( chat_id ()主 , co2 ( ) , 灰尘 ( ) , ( ) ); ( 、 ” 、 “dust” 、 “ )(、、、)
通过向 https://api.telegram.org/ 发出请求从 Telegram Bot API 获取更新需要 SSL 连接,因此我使用我网站的服务器来托管 Web 应用程序。
theamplituhedron.com
但是, Telegram Bot API 是开源的,可在 telegram-bot-api获得。您可以在本地运行它并将请求发送到您的服务器而不是 https://api.telegram.org。
???当 Web 应用程序获取信息并将该信息成功保存到数据库表中时,应用程序会打印:
数据注册成功!
在开发 Web 应用程序(传出 webhook)并创建 MySQL 数据库表之后,我需要使用setWebhook方法为我的 Telegram 机器人(IoT 二氧化碳和灰尘监视器)指定应用程序 URL, 以接收来自 Telegram Bot API 的传入更新。
https://api.telegram.org/bot
? 指定应用程序 URL 后,Telegram Bot API 会抛出此消息:Webhook 已设置。
? 要检查给定的 Telegram 机器人功能并将聊天 ID 注册到数据库表中,请打开机器人并输入 /start。
? 输入 /help 以查看支持的命令列表和说明。
由于我决定在这个项目中使用 Arduino Nano RP2040 Connect,我需要将 Mbed OS 内核安装到 Arduino IDE 中。
? 在 Arduino IDE 上,导航到 Tools > Board > Boards Manager。
? 然后,搜索 Arduino Mbed OS Nano Boards 内核并安装它。
? 成功安装所需内核后,转到 Tools > Board > Arduino Mbed OS Nano Boards 并选择 Arduino Nano RP2040 Connect。
在 Arduino IDE 上安装 Arduino Nano RP2040 Connect 所需的内核后,我设置了开发板以通过 SSL 连接连接到我网站的服务器。不幸的是,对于 Nano RP2040 Connect,通过 SSL 连接连接到服务器并不像其他 Arduino IoT 板那么简单。它需要预安装 SSL 证书,该证书不包含在开发板中。
因此,我需要将我网站服务器的 SSL 证书上传到 Nano RP2040 Connect。
? 首先,为了能够在 Nano RP2040 Connect 上使用 Wi-Fi 模块,请从 此处下载 WiFiNINA 库。
? 连接 Nano RP2040 通过 USB 数据线连接到 PC,然后在 Tools > Port and Tools > Board 中选择正确的端口和板。
? 在 Example > WiFi101 / WiFiNINA > Tools > Firmware Updater 中搜索固件更新程序草图并将其上传到开发板。
? 成功上传草图后,打开 Tools > WiFi101 / WiFiNINA Firmware Updater。
? 启动 固件更新程序 后,选择 Wi-Fi 模块(板)的端口。在第 2 部分中,选择 NINA 固件 (1.3.0) (Arduino MKR WiFi 1010, Arduino Nano 33 IoT)。
? 然后,在第 3 部分中,单击添加域并进入网站以获取其 SSL 证书。
theamplituhedron.com
? 最后,在列表中选择最近添加的网站,然后点击 Upload Certificates to WiFi module。
成功完成上述所有步骤后,我对 Arduino Nano RP2040 Connect 进行了编程。
? 包括所需的库。
? 定义所需的 Wi-Fi 网络连接设置和 Web 应用程序路径。
ssid[] = ; pass[] = ; keyIndex = ; status = WL_IDLE_STATUS; server[] = ; 字符串应用程序= ; WiFiSSLClient客户端;
? 定义 SSD1306 OLED (128x32) 屏幕设置。
;
? 启动计时器并启动 SSD1306 屏幕。
heat_timer = 毫秒(); display.begin(SSD1306_SWITCHCAPVCC, ); display.clearDisplay(); 显示.setTextSize( ); display.setCursor( , ); display.setTextColor(SSD1306_WHITE); display.println( ); 展示。(); 显示.显示(); 延迟();
? 检查Wi-Fi模块与Wi-Fi网络的连接状态。如果连接成功,则将 RGB LED 变为蓝色。
(WiFi.status() == WL_NO_MODULE) { adjustColor( , , ); ();} 状态 = WiFi.开始(ssid,通过); delay( ); } adjustColor( , , );
? 等待 5 分钟,直到 MH-Z14A NDIR CO2 传感器正常加热以生成准确的数据。
? 收集数据时将 RGB LED 变为紫色:
? 获取 MH-Z14A NDIR CO2 传感器每 20 秒产生的二氧化碳浓度评估。
? 引出 GP2Y1010AU0F 灰尘传感器生成的灰尘密度评估。
(millis() - heat_timer < ){ (millis() - timer > ){ timer = millis(); } } 调整 ( 255,0,255 ) (millis() - timer > ){ MH_Z14A_readings(); 计时器 = 毫秒();make_a_get_request(); } GP2Y10_dust_sensor_readings();
? 在 SSD1306 屏幕上打印灰尘和二氧化碳密度评估。
display.clearDisplay(); 显示.setTextSize( ); display.setCursor( , ); display.setTextColor(SSD1306_WHITE); 展示。(); 展示。(灰尘密度); 展示。(); 展示。(); 展示。(co2_level); 展示。(); 显示.显示();
? 在 GP2Y10_dust_sensor_readings 函数中,评估灰尘密度 (mg/m3) 并在必要时校准传感器。
我需要将灰尘传感器的评估校准 0.05 以获得准确的结果。您可能需要根据传感器的评估更改校准值。
calcVoltage = voMeasured*(3.3/1024);
灰尘密度 = 0.17*calcVoltage-0.1;
{
数字写入(ledPower,低);
延迟微秒();
voMeasured = 模拟读取(测量引脚);
延迟微秒();
数字写入(ledPower,HIGH);
延迟微秒();
calcVoltage = voMeasured*( / );
灰尘密度 = *calcVoltage ;
延迟();
}
? 在 MH_Z14A_readings 函数中,利用定时器和 MH-Z14A CO2 传感器的 PWM 接口计算二氧化碳浓度 (ppm)。
长 ppm = 5000L * (tH - 2) / (tH + tL - 4);
{
t0 = 毫秒();
(数字读取(MH_Z14A_PWM)==高){};
t1 = 毫秒();
(数字读取(MH_Z14A_PWM)==低){};
t2 = 毫秒();
tH = t1-t0;
tL = t2-t1;
ppm = * (tH - ) / (tH + tL - );
(数字读取(MH_Z14A_PWM)==高){};
co2_level = ( )ppm;
延迟();
}
? 在 make_a_get_request 函数中:
? 连接到名为 telegram_co2_and_dust_monitor 的 Web 应用程序。
? 如果与给定服务器的连接成功,则将 RGB LED 变为黄色并创建查询字符串,包括灰尘和二氧化碳密度评估。否则,将 RGB LED 变为红色。
? 然后,使用查询字符串发出 GET 请求,将给定的参数发送到 Web 应用程序。
? 如果有可用的传入字节,则从 Web 应用程序获取响应。
? 如果 Web 应用程序成功将传输的数据存储到 MySQL 数据库表中,则将 RGB LED 变为绿色并打印 Data Registered Successful!在 SSD1306 屏幕上。
{
adjustColor( , , );
String query = application + +co2_level+ +dustDensity;
client.println( + query + );
client.println( );
client.println( );
客户端.println();
}{调整
();
}
延迟();
字符串响应 = ;
(client.available()) { c = client.read(); 响应 += c; }
(response != && response.indexOf( ) > ){(
0,255,0 );
display.clearDisplay();
显示.setTextSize( );
display.setCursor( , );
display.setTextColor(SSD1306_WHITE);
display.println( );
display.println( );
显示.显示();
}
}
完成焊接并上传代码后,我通过接头将所有剩余组件连接到 PCB - Arduino Nano RP2040 Connect 和 SSD1306 OLED (128x32) 屏幕。
由于 Nano RP2040 Connect 的工作电压为 3.3V,而 MH-Z14A NDIR CO2 传感器需要 4.5V - 5.5V 的工作电压,因此我在 Nano RP2040 Connect 上启用并使用了内置的 5V 引脚 (VUSB)。
我利用 MH-Z14A CO2 传感器的 PWM 接口引出传感器生成的二氧化碳密度评估。但是,我添加了两个焊接跳线垫(JP1、JP2),将 Nano RP2040 Connect 连接到 MH-Z14A CO2 传感器的 UART 接口。因此,如果需要,可以使用传感器的 UART 接口。
如下图,我用热胶枪将GP2Y1010AU0F灰尘传感器固定在PCB背面。
???启动时,设备会在 SSD1306 OLED 屏幕上打印 Heating & Connecting 并尝试连接到给定的 Wi-Fi 网络。
???如果 Wi-Fi 模块与 Wi-Fi 网络连接成功,设备会将 RGB LED 变为蓝色并等待 5 分钟,直到 MH-Z14A NDIR CO2 Sensor 正常加热以生成准确的二氧化碳浓度评估。
???在从传感器(GP2Y1010AU0F 和 MH-Z14A)收集灰尘和二氧化碳密度评估时,该设备将 RGB LED 变为紫色并将结果打印在 SSD1306 OLED 屏幕上。
???如果 Wi-Fi 模块成功连接到 Web 应用程序的服务器,设备会将 RGB LED 变为黄色。否则,设备会将 RGB LED 变为红色。
???如果 Web 应用程序将传输的数据成功保存到 MySQL 数据库表中,则设备将 RGB LED 变为绿色并打印 数据注册成功! SSD1306 OLED屏幕上。
?? 在 Telegram 机器人(IoT 二氧化碳和粉尘监测器)上:
???如果输入 /co2_density 命令,机器人会显示存储在 MySQL 数据库表中的最新二氧化碳密度评估和更新时间。
???如果输入 /dust_density 命令,机器人将显示存储在 MySQL 数据库表中的最新灰尘密度评估和更新时间。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !