城市噪声与大气污染监测装置的制作教程

电子说

1.3w人已加入

描述

第1步:工作原理

大脑该设备是粒子氩气。 Argon是一个功能强大的支持Wi-Fi的开发板,可以作为独立的Wi-Fi端点或用于粒子网络网络的Wi-Fi网关。它基于Nordic nRF52840,内置电池充电电路,因此可以轻松连接Li-Po并在几分钟内部署您的本地网络。氩气非常适合将现有项目连接到粒子设备云或作为连接整组本地端点的网关。

为了收集空气质量,温度,湿度和噪声水平,几个传感器连接到粒子氩气。 Argon从传感器收集数据并将数据上传到粒子云。一些Web服务用于数据可视化和分析。所有Web服务都通过webhook连接到粒子云。 Ubidots用于监视和可视化来自浏览器的数据,firebase用于存储数据并将数据显示给移动应用程序。 Zapier用于在电子表格中存储数据,电子表格可以通过IFTTT发送到任何电子邮件地址。

该设备由5W太阳能电池板供电。锂离子电池用于存储太阳能并且用于对电池DFRobot 5V充电,使用1A太阳能电源管理器。

步骤2:准备Grove电缆

监测装置

两个Grove传感器用于收集空气质量数据和温度和湿度数据。

Seeed Grove - 空气质量传感器v1.3:该传感器设计用于全面监控室内空气状况。它对各种有害气体都有反应,如一氧化碳,酒精,丙酮,稀释剂,甲醛等。由于测量机制,该传感器无法输出特定数据来定量描述目标气体的浓度。但它仍然足以用于仅需要定性结果的应用,如自动清新喷雾器和自动空气循环系统。

Seeed Grove - 温度和湿度传感器(DHT11): DHT11是Arduino和Raspberry Pi最常用的温度和湿度模块。它因其众多优点而受到硬件爱好者的广泛青睐。例如。低功耗和出色的长期稳定性。可以以非常低的成本获得相对高的测量精度。单总线数字信号通过内置ADC输出,节省了控制板的I/O资源。

所有树丛传感器通过树脂电缆连接到其他树丛连接器。不幸的是,树林连接器不是友好的。为了将树丛传感器连接到面包板,我在中间切割树丛电缆,每个部分焊接到面包板上以连接两个树丛传感器。

用于将氩板放置到PCB而不是直接焊接氩电路板到PCB我使用了母针头,这样就可以很容易地从PCB板上拔下氩板。

步骤3:用跳线连接

监测装置

监测装置

监测装置

将沟槽电缆焊接到PCB板上并焊接氩板的母针头后,我们需要将沟槽传感器引脚连接到氩气根据原理图的引脚。我使用额外的跳线连接信号引脚。为了连接电源引脚,使用相同的跳线。

GPS模块和模拟声级计通过公引脚接头连接到PCB。

步骤4:准备Solar Power Manager

监测装置

监测装置

监测装置

监测装置

监测装置

监测装置

DFRobot太阳能电源管理器5V是一款小型电源和高效太阳能电源管理模块,专为5V太阳能电池板而设计。它具有MPPT(最大功率点跟踪)功能,可最大限度地提高太阳能电池板的效率。该模块可通过USB充电器或太阳能电池板为3.7V锂电池提供高达900mA的充电电流。具有5V 1A输出的ON/OFF可控DC-DC转换器满足各种太阳能项目和低功率应用的需求。该模块还采用各种电池,太阳能电池板和输出保护功能,大大提高了太阳能项目的稳定性和安全性。

监测装置

模块配有一个散热片,4个带有4个螺丝的hax垫片。我使用双面硅胶带将散热器放在标记的位置。我还使用螺丝将hax垫片连接到每个孔。

步骤5:放置传感器

监测装置

监测装置

监测装置

使用三个传感器制作设备。在前一步骤中讨论了两个树丛传感器。为了收集噪声水平,使用了重力模拟声级计。这是一款Arduino和Particle兼容的声级计(也称为分贝计,噪音计)。它使用仪器电路和低噪声麦克风,使其能够精确测量周围环境的声级。本产品采用仪表电路,低噪音麦克风,使其非常珍贵。它支持3.3~5.0V宽输入电压,0.6~2.6V电压输出。分贝值与输出电压成线性关系,无需复杂算法即可实现简单的转换。该连接器即插即用,无需焊接,因此该产品可轻松应用于您的应用中。它可以应用于环境噪声测试,如公路噪声监测站,卧室噪声监测等。

为了将所有传感器放置在PCB板上,我使用了泡沫型双面胶带。在不损坏传感器或任何迹线的情况下,很容易将设备从PCB板上移除。

步骤6:放置电源管理器电路和GPS

监测装置

监测装置

监测装置

监测装置

监测装置

NEO-6M GPS模块如下图所示。它配有一个外部天线,没有插头引脚。所以,你需要得到并焊接一些。

该模块有一个外置天线和一个内置EEPROM。

接口:RS232 TTL

电源:3V至5V

默认波特率:9600 bps

使用标准NMEA句子

NEO-6M GPS模块还兼容其他微控制器板。 NEO-6M GPS模块有四个引脚:VCC,RX,TX和GND。该模块使用TX和RX引脚通过串行通信与Arduino进行通信,因此布线不会更简单:

Neo 6 GPS也通过双面胶带连接。为了放置电源管理器我使用了螺丝。 请勿使用任何胶带作为电源管理器,因为它会产生足够的磁头,您应该留出一些空间来循环空气以防止损坏。

第7步:连接电线

监测装置

监测装置

监测装置

一大使用DFRobot太阳能管理器的优势在于它可以通过USB电缆直接为其他设备供电。因此,您可以通过USB电缆将氩板直接连接到电源管理器电路。另一个优点是您还可以通过USB电缆将太阳能电池板连接到充电器电路。因此不需要跨接线或焊接。

项目中使用的太阳能电池板是PET封装的高性能,轻便,便携式单晶硅太阳能电池板,集成稳压器输出电压为5V,带有工作指示灯,USB A型母 - 端口输出,即插即用。它可以在各种环境中提供充足的电力,以防止系统关闭,即使在下雨天。与DFRobot太阳能电源管理板配合使用时,太阳能电池板的能量将特别高效。面板上有开孔和铜扣,因此可以直接安装在背包上,便于携带和使用。超薄,轻巧的设计仅重90克。它比传统玻璃包装中的太阳能电池板轻得多。

步骤8:进行电池连接

监测装置

监测装置

监测装置

监测装置

监测装置

从太阳能中收集的能量存储在两个并联的锂离子充电电池中。并联连接会增加您的额定电流,但电压将保持不变。在“并联”连接中,2个3.7伏电池将提供3.7V输出,但放大器增加到2倍。重要的是要注意,由于电池的安培数增加,您可能需要使用较重的电缆来防止电缆烧坏。

要并联电池,请使用跳线连接两者。正极端子和另一根跨接线将两个电池的负极端子相互连接。消极负面和积极正面。您可以将负载连接到其中一个电池,它将同样耗尽两个电池。但是,保持电池均衡的首选方法是连接电池组一端的正极,另一端连接负极。

太阳能管理器可以给两个电池充电在距离5W太阳能电池板的四小时内。电池连接到专用于电池输入的绿色连接器。 spdt开关用于给出电路的开/关选项。

步骤9:制作外壳

监测装置

监测装置

监测装置

对于任何室外设备来说,外壳对于保护雨水和其他环境危害非常重要。我选择胶合板制作封面。您可以使用3D打印的外壳。制作一个完整的盒子需要7个胶合板。

两块胶合板的切角为60度。这是我的城市达卡的平均倾斜角度。顶部有一个孔,可从面板上拔出USB线。

使用木质环氧树脂溶液和指甲将不同的木块连接在一起。您可以使用砂纸来完成外观。您可以制作任何尺寸的外壳,方便但请确保您有足够的空间将电路板放入盒子内。您还应该允许盒子内的空气和声音准确读取传感器。

步骤10:放置太阳能电池板

放置太阳能电池板的定位与在特定情况下使用哪种类型的太阳能电池板同样重要。当太阳光线垂直射到其表面时,太阳能电池板将利用最大的功率。确保太阳能电池板面向正确的方向并具有适当的倾斜度将有助于确保它们在最长时间内暴露在最高强度的阳光下时产生最大能量。

在北半球,太阳能电池板放置的一般规则是,太阳能电池板应该面向真南(以及南部,真正的北部)。通常,这是最佳方向,因为太阳能电池板将全天接收直射光。但是,必须考虑磁南和真南之间的差异。磁南是使用指南针时显示的“南”,这个南指向地球的南磁极。然而,太阳能电池板需要面向太阳能或地理南部,这是朝向南极的方向。根据相同的推理,如果太阳能电池板位于南半球,则面板应朝向正北方向。

太阳能电池板的角度或倾斜也是一个重要的考虑因素。应该设定太阳能电池板以在给定年份产生最多能量的角度由地理纬度决定。最佳年度能量产生的一般规则是将太阳能电池板倾斜角度设定为等于地理纬度。例如,如果太阳能电池阵列的位置在50°纬度,则最佳倾斜角也是50°。基本上,太阳能电池板越靠近赤道,电池板应该越向上指向。面板离极点越近,它们越向赤道倾斜。

太阳能电池板的角度也会因气候和环境因素影响功率输出。在北方气候中,低倾斜面板上的积雪可以减少或完全阻挡太阳光线在冬季到达太阳能电池板。

步骤11:将设备放置在机柜内

制作盒子后,是时候将电路板放在封闭器内。将电路板放在底部后,加上螺丝将电路固定在盒子上。使用热胶将GPS天线和wifi天线固定。

步骤12:开发和刻录固件

该设备的程序是使用Particle Web IDE开发的。要使用Particle web IDE开发程序,您需要登录粒子控制台。登录后打开一个新项目并粘贴以下代码:

//All external libraries are added here

#include “Particle.h”

#include “Adafruit_DHT.h”

#include

#include “Arduino.h”

#include

#define DHTPIN 2 // what pin DHT11 sensor is connected to

#define DHTTYPE DHT11 // Type of DHT sensor

#define SoundSensorPin A1 //this pin read the analog voltage from the sound level meter

#define VREF 5.0 //voltage on AREF pin, default:operating voltage

//Object declaration for DHT sensor

DHT dht(DHTPIN, DHTTYPE);

//Object declaration for air quality sensor

//AirQuality airqualitysensor;

//Object declaration for GPS

TinyGPSPlus gps;

//Global variables for the sensor data

char air_quality[20] = “”;

float temperature = 0.0;

float humidity = 0.0;

float dbValue = 0.0;

float latitude = 0.0;

float longitude = 0.0;

float startTime;

int current_quality =-1;

bool requestSent = false;

void hookResponseHandler(const char *event, const char *data);

void setup() {

Serial1.begin(9600); //default buad rate for NEO-6M gps is 9600

dht.begin(); //initialize dht sensor

airqualitysensor.init(A0);//initialize air quality sensor

//receive response after publishing data to particle cloud

Particle.subscribe(“hook-response/Ubidots”, hookResponseHandler, MY_DEVICES);

startTime = millis(); //time count start

}

void loop() {

if (millis() 》 startTime + 30000) { //publish data every 30 second

startTime = millis();

//all the global variables are automatically updated on functions call

read_dht_value();

read_air_quality();

read_sound_level();

publish_data();

delay(1000);

}

while (Serial1.available() 》 0){

if (gps.encode(Serial1.read())){

if (gps.location.isValid()){

latitude = gps.location.lat(); //get latitude and longitude

longitude = gps.location.lng();

}

delay(10000); //Check for gps data every 10 seconds

}

}

}

void hookResponseHandler(const char *event, const char *data) {

float elevation = atof(data);

}

//this function reads temperature and humidity from dht11 sensor

void read_dht_value() {

//Reading temperature or humidity takes about 250 milliseconds!

//Sensor readings may also be up to 2 seconds ‘old’ (its a

// very slow sensor)

float h = dht.getHumidity();

//Read temperature as Celsius

float t = dht.getTempCelcius();

// Check if any reads failed and exit early (to try again)。

if (isnan(h) || isnan(t)) {

return;

}

else {

temperature = t;

humidity = h;

}

}

//this function reads the quality of the air

void read_air_quality()

{

current_quality=airqualitysensor.slope();

if (current_quality 》= 0)// if a valid data returned.

{

if (current_quality==0)

air_quality = “Very High pollution”;

else if (current_quality==1)

air_quality = “High pollution”;

else if (current_quality==2)

air_quality = “Low pollution”;

else if (current_quality ==3)

air_quality = “Fresh air”;

}

}

//interrupt service routine for air quality sensor

ISR(TIMER2_OVF_vect)

{

if(airqualitysensor.counter==122)//set 2 seconds as a detected duty

{

airqualitysensor.last_vol=airqualitysensor.first_vol;

airqualitysensor.first_vol=analogRead(A0);

airqualitysensor.counter=0;

airqualitysensor.timer_index=1;

PORTB=PORTB^0x20;

}

else

{

airqualitysensor.counter++;

}

}

// This function read the data from sound sensor and convert the value into decibel.

void read_sound_level()

{

float voltageValue;

voltageValue = analogRead(SoundSensorPin) / 1024.0 * VREF;

dbValue = voltageValue * 5.0; //convert voltage to decibel value

}

void publish_data(){

char data[256];

char data1[256];

//I made two data array because ubidots required position value with a context, firebase doesn‘t

snprintf(data, sizeof(data), “{”position“: {”value“:1, ”context“:{”lat“: %.6f, ”lng“: %.6f}}, ”temp“:%.2f, ”noise“:%.2f, ”air“: {”value“:1, ”context“:{”quality“: ”%s“}}, ”humid“:%.2f}”,

latitude, longitude, temperature, dbValue, air_quality, humidity);

snprintf(data1, sizeof(data1), “{”lat“: %.6f, ”lng“: %.6f, ”temp“:%.2f, ”noise“:%.2f, ”air“:”%s“, ”humid“:%.2f}”,

latitude, longitude, temperature, dbValue, air_quality, humidity);

Particle.publish(“Ubidots”, data, PRIVATE); //trigger webhooks for Ubidots

Particle.publish(“Google_Sheet”, data1, PRIVATE); //trigger webhook to Zapier for uploading to Google Sheet

Particle.publish(“Firebase”, data1, PRIVATE); //Store data to firebase

Particle.publish(“Firebase_put”, data1, PRIVATE); //Update data to firebase.

//The main difference here is that the requestType is PUT, not POST. The PUT method doesn’t create a table of values;

//it just creates a single element to hold the data, overwriting any previous data at that location.

}

步骤13:为Ubidots配置粒子Webhook

项目中使用了多个Web服务。我使用Ubidots来显示数据,使用Firebase实时数据库存储数据并通过智能手机应用程序访问数据,Zapier使用数据制作Google Sheet,使用IFTTT将Google Sheet发送到用户的电子邮件。所有Web服务都通过Webhook连接到粒子云。

webhook(也称为Web回调或HTTP推送API)是一种应用程序为其他应用程序提供实时信息的方式。 webhook会在发生时将数据传递给其他应用程序,这意味着您可以立即获取数据。与典型的API不同,您需要非常频繁地轮询数据才能实时获取数据。这使得webhooks对提供者和消费者都更有效。使用粒子控制台为粒子设备配置webhook非常容易。在接下来的几个步骤中,我将向您展示如何为此项目中使用的不同Web服务配置webhook。

要开始您的Particle - Ubidots连接,首先需要设置粒子设备(氩气,光子,粒子帐户中的Core或Electron)。点击此处了解使用Particle设备平台设置设备的简单步骤。

您还需要一个Ubidots帐户。 Ubidots允许免费教育帐户,并免费提供5000积分。

第1步:从https://ubidots.com/education/创建一个Ubidots帐户登录您的帐户。

第2步:从右上角点击API凭据并记下默认令牌。

第3步:登录您的粒子帐户

第4步:转到粒子控制台,选择“集成”,然后单击“新集成”

第5步:选择“Webhook”

第6步:提供事件名称( 1)。此名称必须与Ubidots的Perticle.publish()方法的事件名称相同。我把这个名字命名为“Ubidots”。

第7步:将您的网址放在网址文字框中。您的Ubidots的webhook URL将如下所示:(放置您自己的令牌,不带双引号)

我们将自动调用并分配粒子设备的设备ID以确保Ubidots中的设备标签仍然是独特的为此,我们将使用Particle提供的预定义密钥:{{{PARTICLE_DEVICE_ID}}}此调用将自动为URL分配触发webhook的设备的ID。

其他字段应与图中所示相同。

步骤8:选择“高级设置”并使用以下文本完成文本编辑器:

注意:有关配置此项目中使用的所有Web服务,请访问以下链接:https://www.hackster.io/taifur/urban-noise-air-pollution- monitoring-d14088

步骤14:为Firebase配置Webhook(实时数据库)

Firebase实时数据库是一个云托管数据库,支持Android,iOS和Web多平台。所有数据都以JSON格式存储,数据的任何变化都会立即通过在所有平台和设备上执行同步来反映。这使我们可以轻松轻松地构建更灵活的实时应用程序。

第1步:使用您的Gmail帐户登录Firebase控制台console.firebase.google.com/console/login。点击“添加项目”。

步骤2:提供项目名称并接受条款,然后单击“创建项目”。

步骤3:创建项目后,进入数据库选项卡,选择创建数据库。

步骤4:在测试模式下选择“开始”,然后单击“确定”。下一步。

步骤5:从数据库下拉列表中选择Realtime Databse。

步骤6:记下数据库的URL。稍后将需要从粒子控制台配置Webhook以及制作Android应用程序。

步骤7:从Rules选项卡设置读写权限为真。

步骤8:转到服务帐户。

步骤9:选择数据库机密。

步骤10:点击添加秘密然后复制它。

步骤11:转到粒子控制台,从集成开始新的webhook集成。填写所有字段,如下所示。用您自己的网址替换网址。

步骤12:点击高级设置,选择自定义选项并粘贴以下json代码:

{

“temperature”: “{{temp}}”,

“humidity”: “{{humid}}”,

“air quality”: “{{air}}”,

“sound level”: “{{noise}}”,

“latitude”: “{{lat}}”,

“longitude”: “{{lng}}”,

“published_at”: “{{PARTICLE_PUBLISHED_AT}}”

}

传感器数据将作为此JSON数据发送到Firebase。它将如下所示。

最后,点击创建webhook使其成为最终版。 Webhook for Firebase现已准备好。

步骤15:为Zapier配置粒子Webhook

Zapier将用于将粒子数据保存到Google表格。每次将新数据发布到粒子云时,Zapier都会在Google表格中创建一个新行,并使用适当的数据值填充列。要做到这一点,我们首先需要在Google云端硬盘中制作Google表格。

第1步:转到您的云端硬盘,然后选择空白电子表格。

第2步:第一行将是数据字段(列)的名称。根据您的数据输入每列的名称。在第二行中,只为每个数据放置一个样本值。它将帮助Zapier正确识别数据字段。

第3步:如果您已经创建了帐户,请访问https://zapier.com/并登录。否则先创建帐户。开始一个新的Zap。从连接这个应用程序。..下拉选择Zapier的Webhooks和从这个!下拉菜单选择Google表格。

第4步:点击Make a Zap!

步骤5:选择Catch Hook并单击Save + Continue。

第6步:将为您创建一个唯一的网络访问网址。将URL复制到剪贴板。在不关闭选项卡的情况下,打开浏览器的新选项卡并打开粒子控制台。

第7步:从集成标签启动新的网络快速创建。

第8步:填写所有字段。将Zapier webhook URL粘贴到剪贴板的URL文本框中。对于请求格式,请选择JSON。

步骤9:从“高级设置”中选择“自定义”选项,然后在文本框中粘贴以下JSON代码。此JSON与您用于Firebase的JSON相同。 {

“temperature”: “{{temp}}”,

“humidity”: “{{humid}}”,

“air quality”: “{{air}}”,

“sound level”: “{{noise}}”,

“latitude”: “{{lat}}”,

“longitude”: “{{lng}}”,

“published_at”: “{{PARTICLE_PUBLISHED_AT}}”

}

第10步:点击创建WEBHOOK

步骤11:创建挂钩后,单击TEST将测试请求发送给Zapier。

如果一切顺利,您将收到以下消息。

第12步:从浏览器转到上一个标签,然后点击“确定”,当您从粒子云发送测试请求时,我执行了此按钮。

步骤13:选择挂钩A并单击继续以转至操作选项卡。

第14步:选择Google表格作为您的应用。

步骤15 :从Google表格操作选择创建电子表格行,我们希望将所有值保存在一个工作表中。

步骤16:选择工作表的Google帐户,然后点击保存+继续。

步骤17 :从电子表格下拉列表中选择您为此目的创建的工作表。

步骤18:为工作表字段选择Sheet1。您将看到在工作表上创建的所有列字段。

步骤19:从“插入字段”选项中为每个列字段选择适当的变量。您将从之前发送的下拉列表中找到所有变量作为粒子云的测试请求。

步骤20:对所有字段执行相同操作,然后单击继续。

步骤21:点击发送测试到Google表格以测试它是否正常工作。

第22步:如果一切顺利,您将收到成功的消息。

步骤23 :从云端硬盘打开工作表,您将看到已创建新行。没有时间,所有其他字段都是空的,因为我们没有在测试请求上发送任何值。

第24步:请点击在完成

步骤25:最后打开Zap。

步骤16:配置IFTTT发送电子邮件

IFTTT将用于将Google表格发送给想要获取它的用户电子邮件。它将从Android应用程序触发。

步骤1:登录IFTTT帐户并单击“我的小程序”。单击New Applet。

第2步:点击 + this 。

第3步:搜索webhook并选择何时显示。

第4步:继续接收网络请求。

第5步:输入一个事件名称,然后单击“创建触发器”。

步骤

第6步:点击 +

第7步:选择Gmail作为操作服务。

第8步:选择发送电子邮件

第9步:对于To address字段,从Add ingredient

添加值1

第10步:根据您的要求填写主题和正文。将Google表格的链接粘贴到文本框附件网址。该文件将随电子邮件附上。

步骤11:单击以保存以创建小程序。

步骤17:使用MIT App Inventor开发Android应用程序

在这个阶段,我们将构建一个Android应用程序来监控来自的数据一部智能手机用户还可以向他/她的电子邮件发送将数据发送的请求。

使用MIT App Inventor制作应用程序非常简单。无需编码。我们将使用该应用程序从firebase读取数据。 MIT App Inventor具有内置扩展,可与firebase进行交互。我们只需要在项目中添加扩展名。

对于使用firebase,您将需要您的firebase URL(我们在配置webhook时使用的URL相同) ),firebase令牌和存储桶名称。存储桶名称实际上是firebase中的表名。

块编辑器解释了不同UI元素之间的交互。为上传到firebase的每个新数据触发Firebase.DataChanged方法。应用程序实时反映的变化。

为了发送电子邮件,使用IFTTT制造商渠道。用户将把他的电子邮件地址放在文本框中,然后单击“发送”按钮。将触发以下块,IFTTT频道将收到webhook请求,以将电子邮件发送到用户提供的地址。

下面附有完整的源代码和apk文件。您可以下载源代码,将其导入您的应用程序创建者帐户并根据您的要求进行修改。

步骤18:结果

Web服务的配置将在下一节中讨论。完成配置后,上载固件并打开设备电源。您将从Ubidots设备选项卡中观察到以下结果:

如果您配置任何仪表板,您可以在图表中观察数据,如下图所示。/p》

空气质量和GPS数据作为上下文发送。空气质量数据背景如下。

您将观察Firebase控制台的以下输出。这是在webhook中配置的PUT方法。不创建任何行数据只是更新。

对于POST请求,观察到以下结果。每次firebase接收新数据时,它都会存储在新行中。如果您想导出数据,这可能会有所帮助。

Zapier将数据保存在Google表格中,并且对于收到的每个数据,都会创建一个新行。您还可以在工作表上显示图表。

Android应用程序的视图如下。

如果用户发送完整的数据请求,他将收到一封电子邮件并收到电子邮件将如下所示:

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分