亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

室内空气质量和垃圾监测系统

组件和用品

Raspberry Pi 3 B 型
× 1
Arduino UNO
× 1
NodeMCU ESP8266 分线板
× 1
DHT11 温湿度传感器(4 针)
× 1
Seeed Grove - 气体传感器(MQ2)
× 1
MQ-7 CO 气体传感器(通用)
× 1
超声波传感器 - HC-SR04(通用)
× 1
树莓派电源
× 1
HDMI 线
× 1
USB-A 转 B 线
× 1
跳线(通用)
× 1
5V 电池(通用)
× 1

应用和在线服务

IOTA Tangle
Node.js
Raspberry Pi Raspbian
Arduino IDE
MQTT

关于这个项目

一、简介

楼宇自动化 是通过楼宇管理系统或楼宇自动化系统(BAS)对建筑物的供暖、通风和空调、照明等系统进行自动集中控制。楼宇自动化的目标是提高居住者的舒适度、建筑系统的高效运行、降低能耗和运营成本以及改善公用事业的生命周期。

IOTA 是一种开源的分布式记账技术,其目标是在物联网中安全地交换信息和价值。 IOTA 的主要创新之一是,它使用自己的架构(Tangle)而不是传统的区块链,该架构基于称为有向无环图(DAG)的数学概念。这种架构使得没有佣金、网络延迟低和更好的可扩展性成为可能。 IOTA 目前正在开发中,预计在 2019 年全年,该技术将准备好大规模采用。

Raspberry Pi 3 B 的规格 包括:

  • CPU:主频为 1.2 GHz 的四核 64 位 ARM Cortex A53。
  • GPU:400MHz VideoCore IV 多媒体。
  • 内存:1GB LPDDR2-900 SDRAM(即 900MHz)
  • USB 端口:4 个。
  • 视频输出:HDMI、复合视频(PAL 和 NTSC),通过 3.5 毫米插孔。
  • 网络:10/100 Mbps 以太网和 802.11n 无线局域网。

Arduino UNO 的特点

  • 微控制器:ATmega328。
  • 工作电压:5V。
  • 输入电压(推荐):7-12V。
  • 输入电压(限制):6-20V。
  • 数字 I/O 引脚:14 个(其中 6 个提供 PWM 输出)
  • 模拟输入引脚:6 个。
  • 每个 I/O 引脚的直流电流:40 mA。
  • 3.3V 引脚的直流电流:50 mA。

NodeMCU ,特点:

  • 最后是可编程 WiFi 模块。
  • 类似 Arduino(软件定义)的硬件 IO。
  • 可以使用 Arduino IDE 进行编程。
  • 包括 USB-TTL,即插即用。
  • 10 个 GPIO D0-D10、PWM 功能、IIC 和 SPI 通信、1-Wire 和 ADC A0 等都在一块板上。

本项目分为三个版本。为了更好地理解该项目,我们将其分为以下几章:

  • 1.简介
  • 2.软件安装
  • 3.室内空气质量监测系统 v1
  • 4.室内空气质量监测系统 v2
  • 5.垃圾监控系统
  • 6.结论

2. 软件安装

a) 在 Raspberry PI 3 B 上安装 Raspbian

我安装了 NOOBS ,下载链接和说明在:https://www.raspberrypi.org/downloads/

b) 安装 Node.JS

$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
$ sudo apt-get install -y nodejs

c) 在 Raspberry Pi 上下载并构建 BCM2835 库。这个库帮助我们使用 DHT11 传感器。

$ wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.56.tar.gz
$ tar zxvf bcm2835-1.56.tar.gz
$ cd bcm2835 -1.56
$ ./configure
$ make
$ sudo make check
$ sudo make install

d) 在树莓派上下载并安装indoor-air-quality-iota项目

$ cd ~
$ git clone https://github.com/guillengap/indoor-air-quality-and-garbage-monitoring-system.git
$ cd室内空气-质量和垃圾监控系统
$ npm install

e) 下载并安装串口

$ nmp install serialport 

f) 下载并安装 Arduino IDE:

https://www.arduino.cc/en/Main/Software

3. 室内空气质量监测系统 v1

使用 MAM 读取 DHT11 传感器数据并将其发布到 Tangle。

它是如何工作的?

a) 室内空气质量iota项目有3个java脚本文件:

  • sensor.js :读取并显示 DHT11 传感器数据:温度和湿度。
  • mam_sensor.js :使用 MAM 读取 DHT11 传感器数据并将其发布到 IOTA Tangle。
  • mam_receive.js :使用 MAM 从 IOTA Tangle 中提取存储的数据并显示数据。

b) 完整节点端点和侧键都硬编码在 javascript 文件中。要停止运行脚本,请按 CTRL+Z .

c) 连接到 Arduino UNO 板、DHT11 传感器。

d) 执行 nodesensor.js 检查树莓派是否可以从DHT11传感器模块读取温湿度数据。

$ node sensor.js 

在这里我们可以看到 DHT11 传感器捕获的湿度和温度数据。如果一切顺利,那么我们进入下一步。

e) 执行节点 mam_sensor.js .此脚本会将来自 DHT11 传感器模块的温度和湿度数据存储到 Tangle。

$ node mam_sensor.js 

我们用三个节点进行了测试,结果更好:https://potato.iotasalad.org:14265

//const iota =new IOTA({ provider:'https://nodes.testnet.iota.org:443' });
const iota =new IOTA({ provider:'https ://potato.iotasalad.org:14265' });
//const iota =new IOTA({ provider:'https://peanut.iotasalad.org:14265' });

您可以在以下位置查阅一些可用节点:https://iotasalad.org/nodes

我们正在发送以下信息:

  • 城市:墨西哥
  • 建筑:65
  • 日期和时间 (UTC):年份。月、日、小时。分和秒
  • 数据:以摄氏度和华氏度为单位的温度以及相对湿度百分比

f) 打开另一个终端并输入:node mam_receive.js your_root 并显示存储的传感器数据。例如:

$ node mam_receive.js AMBTIKZKEVEEQFCUGIDUOLDOXL9OZQ9GOMNBFYHVRAUCAMHDQQJBSNAMFZYRLTUVAHFDINHTTFKIPELIG 

管理接收数据的代码是:

// 从 TANGLE 接收数据
const executeDataRetrieval =async function(rootVal, keyVal) {
let resp =await Mam.fetch(rootVal, MODE, keyVal, function(data) {
let json =JSON.parse(iota.utils.fromTrytes(data));
console.log(`City:${json.city}, Building:${json.building}, Time :${json.dateTime} UTC, 数据:${json.data}`);
});
}

测试

图片

4. 室内空气质量监测系统 v2

使用 MAM 读取 DHT11、MQ-2 和 MQ-7 传感器数据并将其发布到 Tangle

它是如何工作的?

a) 室内空气质量iota项目有5个文件:

  • sensorArduino.ino :此代码用于捕获三个传感器的数据:DHT11 湿度和温度传感器、MQ-2 LPG 气体传感器和 MQ-7 CO 气体传感器。
  • listportsArduino.ino :它向我们展示了 Arduino UNO 板的可用端口。
  • sensorArduino.js :读取并显示 DHT11、MQ-2 和 MQ-7 传感器数据。
  • mam_sensorArduino.js :使用 MAM 读取 DHT11、MQ-2 和 MQ-7 传感器数据并将其发布到 Tangle。
  • mam_receiveArduino.js :使用 MAM 从 Tangle 中提取存储的数据并显示数据。

b) 完整节点端点和侧键都硬编码在 javascript 文件中。要停止运行脚本,请按 CTRL+Z .

c) 连接到 Arduino UNO 板,传感器:DHT11、MQ-2 和 MQ-7。

d) 在室内空气质量 iota 项目中的“sensorArduino”文件夹中,我们有传感器库:DHT11、MQ-2 和 MQ7。我们必须将它们安装在 Arduino 库中。

e) 上传草图 sensorArduino.ino , 到 Arduino UNO 板并运行它。选择与Arduino UNO板的通讯端口,我这里是:Tools> Port> /dev/ttyACM0

f) 打开终端并执行 node listportsArduino.js 验证我们的端口是否处于活动状态。

$ node listportsArduino.js 

g) 执行节点 mam_sensorArduino.js .该脚本会将来自 Arduino UNO 板的数据存储到 Tangle。

$ node mam_sensorArduino.js 

我们正在发送以下信息:

  • 城市:纽约
  • 建筑:13
  • 日期和时间 (UTC):年份。月、日、小时。分和秒
  • 数据:LPG 气体(以 ppm 为单位)、CO 气体(以 ppm 为单位)、温度(以摄氏度为单位)、相对湿度百分比,

h) 打开另一个终端并输入:node mam_receiveArduino.js your_root 并显示存储的传感器数据。例如:

管理接收数据的代码是:

// 从 TANGLE 接收数据
const executeDataRetrieval =async function(rootVal, keyVal) {
let resp =await Mam.fetch(rootVal, MODE, keyVal, function(data) {
let json =JSON.parse(iota.utils.fromTrytes(data));
console.log(`City:${json.city}, Building:${json.building}, Time :${json.time} UTC, Data:${json.data}`);
});
executeDataRetrieval(resp.nextRoot, keyVal);
}

测试

图像

5.垃圾监控系统

使用 NodeMCU 和 MQTT 将 SRF05 传感器数据发送到使用 MAM 的 IOTA Tangle

它是如何工作的?

a) 这个项目有 3 个文件:

  • trashcan.ino :此代码计算垃圾桶内的垃圾量,以 % 为单位。然后,使用 MQTT 协议将数据发送到 Raspberry Pi 3B 板。
  • nodemcu_mqtt_mam .js :使用 MAM 读取 SRF05 传感器数据并将其发布到 Tangle。
  • nodemcu_mam_receive.js :使用 MAM 从 Tangle 中提取存储的数据并显示数据。

b) 完整节点端点和侧键都硬编码在 javascript 文件中。要停止运行脚本,请按 CTRL+Z .

c) 连接到 NodeMCUboard,SRF05 超声波传感器。

d) 使用 Boards Manager 安装 esp8266 包。打开 Arduino IDE 首选项窗口并在 Additional Board Manager URLs 字段中输入:http://arduino.esp8266.com/stable/package_esp8266com_index.json

选择菜单:Tools> Board> Board Manager... 在搜索栏中输入:esp8266并安装最新版本。

e) 现在让 NodeMCU 与 mosquitto 服务器通信。首先将 PubSubClient 库添加到 Arduino IDE。该库用于 MQTT 消息传递,支持 NodeMCU。

  • 选择菜单:Sketch> 包含库> 管理库
  • 搜索:PubSub
  • 选择 PubSubClient (Nick O'Leary) 并安装最新版本

f) 接下来安装 Mosquitto (MQTT) 在树莓派 3B 上。 MQTT 协议提供了一种使用发布/订阅模型执行消息传递的轻量级方法。这使其适用于物联网消息传递,例如低功耗传感器或移动设备(如电话、嵌入式计算机或微控制器)。登录您的 Raspberry Pi,打开终端并输入:

$ cd~ 
$ wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
$ apt-key 添加 mosquitto-repo.gpg.key
$ cd /etc/apt/sources.list.d/$ wget http://repo.mosquitto.org/debian/mosquitto-stretch.list

现在安装以下内容:

$ cd~
$ wget http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u11_armhf .deb
$ sudo dpkg -i libssl1.0.0_1.0.1t-1+deb8u11_armhf.deb
$ wget http://ftp.nz.debian.org/debian/pool/main/libw/ libwebsockets/libwebsockets3_1.2.2-1_armhf.deb
$ sudo dpkg -i libwebsockets3_1.2.2-1_armhf.deb

libss...最新版本,你可以在这里找到:http://security.debian.org/debian-security/pool/updates/main/o/openssl/

安装 MQTT 代理和蚊子客户端。

$ sudo apt-get install mosquitto mosquitto-clients 

如果您在安装MQTT时遇到问题,可以尝试:

$ npm install mqtt --save 

重启树莓派。打开终端并验证蚊子版本:

$蚊子 -v 

您可以启动和停止蚊子服务器:

$ sudo /etc/init.d/mosquitto start
$ sudo /etc/init.d/mosquitto stop

我们验证树莓派的IP:

$ ifconfig 

g) 上传草图 trashcan.ino , 到 NodeMCU 板。验证下一个数据:

  • NodeMCU 1.0 开发板
  • 串口
  • Serial.begin(115200);
  • const char* wifi_ssid ="ARRIS-WXYZ";
  • const char* wifi_password ="XXXXXXXXXXXX";
  • const char* mqtt_server ="192.168.0.12"; // 树莓IP
  • inttrashcan =25;// 我的垃圾桶有 25 厘米长

h) 执行 nodemcu_mqtt_mam.js ,这个脚本会将NodeMCU板的数据存储到Tangle中。

$ nodemcu_mqtt_mam.js 

我们正在发送以下信息:

  • 城市:柏林
  • 建筑:7
  • 日期和时间 (UTC):年份。月、日、小时。分和秒
  • 数据:垃圾桶百分比。

i) 打开另一个终端并输入:node mam_receiveArduino.js your_root 并显示存储的传感器数据。例如:

管理接收数据的代码是:

// 从 TANGLE 接收数据
const executeDataRetrieval =async function(rootVal, keyVal) {
let resp =await Mam.fetch(rootVal, MODE, keyVal, function(data) {
let json =JSON.parse(iota.utils.fromTrytes(data));
console.log(`City:${json.city}, Building:${json.building}, dateTime :${json.dateTime} UTC, Data:${json.data}`);
});
executeDataRetrieval(resp.nextRoot, keyVal);
}

在这种情况下,可用节点不同:https://iotasalad.org/nodes

const iota =new IOTA({ provider:'https://durian.iotasalad.org:14265' }); 

测试

图像

6. 结论

室内空气质量监测系统 v1:

该项目运作良好,我们监测建筑物内部的空气质量,如我们在获得的结果中所见。我们在位于墨西哥城的建筑物中模拟这个项目。这是使用 DHT11 温湿度传感器和 Raspberry Pi 3B 板、Java 脚本代码和 IOTA 协议的基本测试。

室内空气质量监测系统 v2:

在这个项目中,我们使用了 DHT11、MQ-2 (LPG) 和 MQ-7 (CO) 传感器。在这种场合。我们模拟在位于纽约市的建筑物中捕获数据,并使用 Arduino UNO 和 Raspberry Pi 板将这些数据发送到使用掩码身份验证消息 (MAM) 的 IOTA Tangle。这是添加更多传感器的实用且快速的方法。该版本可用于智能建筑和使用液化石油气和火灾产生一氧化碳的行业。

垃圾监控系统:

该项目的目标是控制位于柏林市或任何地区的智能建筑中的垃圾存放处。垃圾的堆积,分解时会产生难闻的气味,但现在我们可以知道,垃圾船有多久的垃圾以及这些垃圾的百分比。


代码

  • sensor.js
  • mam_sensor.js
  • mam_receive.js
  • mam_sensorArduino.js
  • mam_receiveArduino.js
sensor.jsJavaScript
室内空气质量监测系统 v1
测试 DHT11 传感器的代码
const sensor =require('node-dht-sensor');const TIMEINTERVAL =10; // SECONDSconst SENSORTYPE =11; // 11=DHT11, 22=DHT22const GPIOPIN =4; // 来自 DHT11 传感器的 RASPBERRY GPIO PIN 函数 readSensor(){ sensor.read(SENSORTYPE, GPIOPIN, function(err, temperature, height) { if (!err) { console.log('temp:' + temperature.toFixed(1) ) + 'C, ' + '湿度:' + 湿度.toFixed(1) + '%'); } else { console.log(err); } });}readSensor();// 每次自动更新传感器值10 SECONDSsetInterval(readSensor, TIMEINTERVAL*1000);
mam_sensor.jsJavaScript
室内空气质量监测系统 v1
此代码将来自 DHT11 传感器模块的温度和湿度数据存储到 Tangle
const sensor =require('node-dht-sensor');const Mam =require('./lib/mam.client.js');const IOTA =require('iota.lib.js');const moment =require('moment');//const iota =new IOTA({ provider:'https://nodes.testnet.iota.org:443 ' });const iota =new IOTA({ provider:'https://potato.iotasalad.org:14265' });//const iota =new IOTA({ provider:'https://peanut.iotasalad.org :14265' });const MODE ='restricted'; // 公共、私有或受限const SIDEKEY ='mysecret'; // 仅用于受限模式const SECURITYLEVEL =3;常量时间间隔 =30; // SECONDSconst SENSORTYPE =11; // 11=DHT11, 22=DHT22const GPIOPIN =14; // 来自 DHT11 传感器的 RASPBERRY GPIO PIN // 初始化 MAM 状态let mamState =Mam.init(iota, undefined, SECURITYLEVEL);// CHANNEL MODEif (MODE =='restricted') { const key =iota.utils.toTrytes(SIDEKEY); mamState =Mam.changeMode(mamState, MODE, key);} else { mamState =Mam.changeMode(mamState, MODE);}// PUBLISH TO TANGLEconst publish =async function(packet) { // CREATE MAM PAYLOAD const trytes =iota .utils.toTrytes(JSON.stringify(packet)); const message =Mam.create(mamState, trytes); // 保存新的 MAMSTATE mamState =message.state; console.log('Root:', message.root); console.log('地址:', message.address); // 附加有效载荷 await Mam.attach(message.payload, message.address); return message.root;}function readSensor(){ sensor.read(SENSORTYPE, GPIOPIN, async function(err, temperature,湿度) { if (!err) { const city =('MEXICO'); const building =('65 '); const dateTime =moment().utc().format('YYYY/MM/DD hh:mm:ss'); const data =`{Temperature:${temperature.toFixed(1)}°C ($ {(温度.toFixed(1)*1.8)+32}°F), 湿度:${humity.toFixed(1)}%}`; const json ={"data":data, "dateTime":dateTime, " building":building, "city":city}; const root =await publish(json); console.log(`City:${json.city}, Building:${json.building}, Time:${json. dateTime} UTC, Data:${json.data}, root:${root}`); } else { console.log(err); } });}// START ITreadSensor();// AUTOMATICALLY UPDATE SENSOR VALUE每 30 秒setInterval(readSensor, TIMEINTERVAL*1000);
mam_receive.jsJavaScript
室内空气质量监测系统 v1
显示存储的传感器数据。
const Mam =require('./lib/mam.client.js');const IOTA =require('iota.lib.js');//const iota =new IOTA( { provider:'https://nodes.testnet.iota.org:443' });const iota =new IOTA({ provider:'https://potato.iotasalad.org:14265' });//const iota =new IOTA({ provider:'https://peanut.iotasalad.org:14265' });const MODE ='restricted'; // 公共、私有或受限const SIDEKEY ='mysecret'; // 仅用于受限模式let root;let key;// 检查参数const args =process.argv;if(args.length !=3) { console.log('Missing root as argument:node mam_receive.js  '); process.exit();} else if(!iota.valid.isAddress(args[2])){ console.log('您输入的根目录无效:'+ args[2]); process.exit();} else { root =args[2];}// INITIALISE MAM STATElet mamState =Mam.init(iota);// SET CHANNEL MODEif (MODE =='restricted') { key =iota.utils .toTrytes(SIDEKEY); mamState =Mam.changeMode(mamState, MODE, key);} else { mamState =Mam.changeMode(mamState, MODE);}// 从缠结中接收数据const executeDataRetrieval =async function(rootVal, keyVal) { let resp =await Mam .fetch(rootVal, MODE, keyVal, function(data) { let json =JSON.parse(iota.utils.fromTrytes(data)); console.log(`City:${json.city}, Building:${json .building},时间:${json.dateTime} UTC,数据:${json.data}`); }); }executeDataRetrieval(root, key);
mam_sensorArduino.jsJavaScript
室内空气质量监测系统 v2
使用 MAM 读取 DHT11、MQ-2 和 MQ-7 传感器数据并将其发布到 Tangle。
const SerialPort =require('serialport');const moment =require('moment');const IOTA =require ('iota.lib.js');const Mam =require('./lib/mam.client.js');//const iota =new IOTA({ provider:'https://nodes.testnet.iota. org:443' });const iota =new IOTA({ provider:'https://potato.iotasalad.org:14265' });const MODE ='restricted'; // 公共、私有、受限const SIDEKEY ='mysecret'; // 只有 ASCII 字符const SECURITYLEVEL =3; // 1, 2, 3const PORTNAME ='/dev/ttyACM1'; // 输入有效端口 const port =new SerialPort(PORTNAME, { baudRate:9600, autoOpen:true});const Readline =SerialPort.parsers.Readline;const parser =port.pipe(new Readline({ delimiter:'\r\ n' }));// INITIALIZE MAM STATElet mamState =Mam.init(iota, undefined, SECURITYLEVEL);// SET CHANNEL MODEif (MODE =='restricted') { const key =iota.utils.toTrytes(SIDEKEY); mamState =Mam.changeMode(mamState, MODE, key);} else { mamState =Mam.changeMode(mamState, MODE);}// PUBLISH TO TANGLEconst publish =async function(packet) { // CREATE MAM PAYLOAD const trytes =iota .utils.toTrytes(JSON.stringify(packet)); const message =Mam.create(mamState, trytes); // 保存新的 MAMSTATE mamState =message.state; console.log('Root:', message.root); console.log('地址:', message.address); // 附加有效载荷 await Mam.attach(message.payload, message.address); return message.root;}// SERIAL PORT LIBRARY EVENTSport.on('open', showPortOpen);parser.on('data', readSerialData);port.on('close', showPortClose);port.on('error) ', showError);// 回调函数function showPortOpen() { console.log('串口打开。数据速率:' + port.baudRate);}async function readSerialData(data){ let json ={}; const time =moment().utc().format('YYYY/MM/DD hh:mm:ss'); const city =('NY'); const 建筑 =('13'); json['时间'] =时间; json['city'] =`${city}`; json['building'] =`${building}`; json['data'] =`{${data}}`; console.log('json =',json); const root =await publish(json);}function showPortClose() { console.log('串口关闭。');}function showError(error) { console.log('串口错误:' + error);} 
mam_receiveArduino.jsJavaScript
室内空气质量监测系统 v2
使用 MAM 从 Tangle 中提取存储的数据并显示数据。
const Mam =require('./lib/mam.client.js');const IOTA =require('iota.lib.js');/ /const iota =new IOTA({ provider:'https://nodes.testnet.iota.org:443' });const iota =new IOTA({ provider:'https://potato.iotasalad.org:14265' });const MODE ='受限'; // 公共、私有或受限const SIDEKEY ='mysecret'; // ENTER ONLY ASCII CHARACTERSlet root;let key;// CHECK THE ARGUMENTSconst args =process.argv;if(args.length !=3) { console.log('Missing root as argument:node mam_receive.js '); process.exit();} else if(!iota.valid.isAddress(args[2])){ console.log('You have entered an invalid root:'+ args[2]); process.exit();} else { root =args[2];}// INITIALIZE MAM STATElet mamState =Mam.init(iota);// SET CHANNEL MODEif (MODE =='restricted') { key =iota.utils.toTrytes(SIDEKEY); mamState =Mam.changeMode(mamState, MODE, key);} else { mamState =Mam.changeMode(mamState, MODE);}// RECEIVE DATA FROM THE TANGLEconst executeDataRetrieval =async function(rootVal, keyVal) { let resp =await Mam.fetch(rootVal, MODE, keyVal, function(data) { let json =JSON.parse(iota.utils.fromTrytes(data)); console.log(`City:${json.city}, Building:${json.building}, Time:${json.time} UTC, Data:${json.data}`); }); executeDataRetrieval(resp.nextRoot, keyVal);}executeDataRetrieval(root, key);

示意图

原理图,示意图 Schematic diagram Schematic diagram

制造工艺

  1. DIY 环境和空气质量监测器
  2. 使用 Raspberry Pi 和 Nagios 监测室温
  3. Python 和 Raspberry Pi 温度传感器
  4. 使用 Moteino 和 Raspberry Pi 监测室温
  5. 用于 Raspberry Pi 的 DIY 红外运动传感器系统
  6. Raspberry Pi Photocell 日志和警报系统
  7. Raspberry Pi 温度和光传感器
  8. 使用 Raspberry Pi 和 Twilio 的支持语音和 SMS 的光传感器
  9. Raspberry Pi 传感器和执行器控制
  10. 带有 Raspberry Pi 和湿度传感器的 Aeroponics
  11. 带摄像头和 PIR 传感器的 Raspberry Pi 家庭安全系统
  12. 氦空气质量传感器