2015-7-21 11:34:44 [显示全部楼层]
7518浏览
查看: 7518|回复: 6

[intel程序猿笔记] 【intel程序猿笔记】使用英特尔® Edison探索空气质量监测

[复制链接]
本帖最后由 Juice 于 2015-7-14 12:14 编辑



1. intel独家授权转载【intel开发人员专区】文章。
2. 定期为创客小主po上最全最细最专业的intel项目教程或另类态度。
3. DF创客社区“创客召集令”带你玩转intel,更多惊喜,颠覆你想象。


周二福利帖又来了!首先,我们来揭晓上周【intel程序猿笔记】智能物联网婴儿车 的获奖情况。


上周有奖问答题目是:下面四个选项中,哪个不是步骤里面牵涉到的选项?

【intel程序猿笔记】使用英特尔® Edison探索空气质量监测图1

正确答案是c.好紧脏!好紧脏!有哪些小伙伴答对了呢?看下图:

【intel程序猿笔记】使用英特尔® Edison探索空气质量监测图2

哇喔~~恭喜@丄帝De咗臂 @Cain @luna @pinocchio @ hnyzcj @Qubot @Ash @heinau
貌似有几个答题专业户已经从第一期就带着100%的正确率一路杀过来了,保持好状态,大满贯在等着你们哟!~~~
奖品将在系列活动结束后统一寄出,奖品实行累积制,各位,再接再厉!没有获奖的小伙伴,今天机会又来了喔!

废话不多说,上干货: 原文戳这里


空气质量监测是一个关注度较高的主题,其研究领域主要包括污染增长、过敏、健康与健身意识 ,以及技术创新。 消费市场显示,市场上推出的创新性产品提高了人们监测家庭空气质量的意识。 其中有一类产品为智能表。 这类智能表可监测各种与健康相关的参数,以及空气质量。 空气质量数据发送至云系统,应用为您提示空气质量的变化,以便您了解哪 个区域需要通风。 具备空气质量意识有助于改善生活质量。 本文将探讨如何通过使用 Arduino* 生态系统测量二氧化碳、挥发性有机化合物和灰尘的浓度,并将数据发送至云服务提供商来进行空气质量监测。
英特尔® Edison 平台配备了快速处理器、大容量内存,以及面向 WiFi 和蓝牙的集成连接性,非常适合启动新原型,或迁移现有原型。 Arduino 生态系统可提供一系列硬件和固件库, 支持使用英特尔® Edison 计算模块和英特尔® Edison Arduino Breakout 开发板进行试验。

硬件组件:
该项目的空气质量监测系统主要使用下列硬件组:
  • 英特尔® Edison 计算模块
  • 英特尔® Edison Arduino Breakout 开发板
  • 共阴极 RGB LED + 3 个 1kΩ 电阻器
  • GP2Y1010AU0F 光学灰尘传感器 + 150Ω 电阻器 + 220 µF 电解质电容器
  • MQ-135 气体传感器
  • K-30 CO2 传感器
  • PIR 运动传感器
【intel程序猿笔记】使用英特尔® Edison探索空气质量监测图3

工作原理:
如上图 所示为硬件组件与英特尔® Edison Arduino Breakout 开发板的连接。 该系统将 RGB LED 用作简单的目测指示系统来显示空气质量。
为确定某区域的整体空气质量,该系统使用三个传感器:
1. 光学灰尘传感器:用于测量某区域的灰尘。
2. 气体传感器:用于测量烟雾等挥发性有机化合物。
3.  CO2 传感器:借助 I2C 接口测量二氧化碳浓度。
此外, 该系统还配备运动传感器,通过过滤掉由运动引起的暂时性灰尘浓度上升以及由于人们靠近传感器呼吸所引起的暂时性 CO2 浓度上升,以最大程度地真实反映某区域的整体空气质量。
如果未检测到运动,固件将读取空气质量传感器、分析传感器数据、更新目测指示系统,并将空气质量数据发送至云。 有关该系统的详细内容将会在“固件”部分做进一步介绍。

配置 I2C 时钟频率:
需注意 的一点是,在撰写本文时,英特尔® Edison 的默认 I2C 时钟频率高于 100kHZ,超过了 K-30 CO2 传感器的规格。 K-30 CO2 传感器所支持的最高 I2C 时钟频率 (SCL) 为 100kHz。 英特尔® Edison I2C 时钟频率可通过下列几个步骤更改为 100kHZ:
- 确保安装了最新的英特尔® Edison Yocto 固件映像:
- 打开 Edison Linux 终端,并以根用户身份登录:
-cd /sys/devices/pci0000:00/0000:00:09.1/i2c_dw_sysnode
-echo std > mode
-cat mode

固件:
下列代码显示了空气质量系统包含的组件、宏和函数。 下面将介绍针对初始化、主循环 、读取运动传感器、读取空气质量传感器、分析整体空气质量、更新目测指示 LED,以及将数据发送至云服务提供商的函数。
包含:
  1. #include <Wire.h>
复制代码

宏:
  1. //Pin Defines #define gasSensorPin A1 #define
  2. dustSensorPin A0 #define dustSensorLEDPin 2 #define redRGBLEDPin 3 #define
  3. greenRGBLEDPin 4 #define blueRGBLEDPin 5 #define motionSensorPin 6 //Air
  4. Quality Defines #define AIR_QUALITY_OPTIMAL 2 #define
  5. AIR_QUALITY_GOOD    1 #define
  6. AIR_QUALITY_BAD     0 #define AIR_QUALITY_UNKNOWN -1
  7. #define MAX_SENSOR_READINGS        10
  8. #define SENSOR_READING_DELAY 1000 //Motion Sensor Defines  
  9. #define MOTION_NOT_DETECTED 0 #define MOTION_DETECTED     
  10. 1 #define MOTION_DELAY_TIME   1000 //Dust Sensor Timing Parameters
  11. (from p.5 of datasheet) #define
  12. SAMPLE_DELAY        280  //Sampling
  13. #define PULSEWIDTH_DELAY    40   //Pw #define
  14. PERIOD_DELAY        9680 //T //Gas Sensor
  15. Thresholds #define GAS_SENSOR_OPTIMAL 140 #define
  16. GAS_SENSOR_GOOD    200 //Dust Sensor Thresholds #define
  17. DUST_SENSOR_OPTIMAL 125 #define DUST_SENSOR_GOOD    250 //CO2
  18. Sensor Thresholds #define CO2_SENSOR_OPTIMAL 800 #define
  19. CO2_SENSOR_GOOD    2000
复制代码

函数:
初始化: 该函数可初始化串行调试接口、I/O 针脚和 I2C 接口。
  1. void setup() {
  2.   Serial.begin(9600);
  3.   pinMode(gasSensorPin, INPUT);
  4.   pinMode(dustSensorPin, INPUT);
  5.   pinMode(dustSensorLEDPin, OUTPUT);
  6.   pinMode(redRGBLEDPin, OUTPUT);
  7.   pinMode(greenRGBLEDPin, OUTPUT);
  8.   pinMode(blueRGBLEDPin, OUTPUT);
  9.   pinMode(motionSensorPin, INPUT);
  10.   Wire.begin(); }
复制代码

主循环: 主循环可初始化系统、检查运动、读取空气质量传感器、分析整体空气质量、更新指示 LED,并将数据发送至云服务。
  1. void loop() {
  2.   // -- Init
  3.   int airQuality = 0;
  4.   int motion = 0;
  5.   int sensorAirQuality[3] = {0,0,0}; //0-Gas Sensor, 1-CO2 Sensor, 2-
  6. DustSensor
  7.   Serial.println("");
  8.     // -- Check for motion
  9.   motion = readMotionSensor();
  10.     if (motion == MOTION_NOT_DETECTED) {
  11.     // -- Read Air Quality Sensors
  12.     readAirQualitySensors(sensorAirQuality);
  13.         // -- Analyze Total Air Quality
  14.     airQuality = analyzeTotalAirQuality(sensorAirQuality
  15. [0],sensorAirQuality[1],sensorAirQuality[2]);
  16.         // -- Update Indication LED
  17.     updateIndicationLED(airQuality);
  18.         // -- Update Air Quality Value for Cloud
  19. Datastream
  20.     updateCloudDatastreamValue(CHANNEL_AIR_QUALITY_ID,
  21. airQuality);
  22.       // -- Send Data To Cloud Service
  23.     sendToCloudService();
  24.   } }
复制代码

读取运动传感器: 通过取样传感器的数字输出针脚可读取运动传感器。 如果检测到运动,传感器输出针脚将跳变至“高电平”。 该函数尝试过滤故障,并反馈是否检测到运动。
  1. int readMotionSensor() {
  2.   // -- Init
  3.   int motionSensorValue = MOTION_NOT_DETECTED;
  4.   int motion = MOTION_NOT_DETECTED;
  5.     Serial.println("-Read Motion Sensor");
  6.     // -- Read Sensor
  7.   motionSensorValue = digitalRead(motionSensorPin);
  8.     // -- Analyze Value
  9.   if (motionSensorValue == MOTION_DETECTED) {
  10.     delay(MOTION_DELAY_TIME);      
  11. motionSensorValue = digitalRead(motionSensorPin);
  12.         if (motionSensorValue ==
  13. MOTION_DETECTED) {
  14.       motion = MOTION_DETECTED;
  15.       Serial.println("--Motion Detected");
  16.       updateIndicationLED(AIR_QUALITY_UNKNOWN);
  17.     }
  18.   }
  19.   return motion; }
复制代码

读取空气质量传感器: 该函数调用单独的气体、co2 和灰尘传感器函数。 函数将指针带入整数数组,以保存各传感器的空气质量结果。
  1. void readAirQualitySensors(int* sensorAirQuality) {
  2.   Serial.println("-Read Air Quality Sensors");
  3.     sensorAirQuality[0] = readGasSensor();
  4.   sensorAirQuality[1] = readCO2Sensor();
  5.   sensorAirQuality[2] = readDustSensor(); }
复制代码

读取气体传感器: 气体传感器可检测 NH3、NOx、乙醇、 苯,烟雾等气体。 气体传感器包含一个模拟电压输出,该输出与空气中的气体浓度成正比。 执行 A/D 换算可读取该传感器。 该函数可读取传感器、求取读数的平均值、分析传感器数据,并返回该传感器的空气质量。
  1. int readGasSensor() {
  2.   // -- Init
  3.   int airQuality = 0;
  4.   int gasSensorValue = 0;
  5.     // -- Read Sensor
  6.   for (int i=0; i < MAX_SENSOR_READINGS; i++) {
  7.     gasSensorValue += analogRead(gasSensorPin);
  8.     delay(SENSOR_READING_DELAY);
  9.   }
  10.   gasSensorValue /= MAX_SENSOR_READINGS; //Average the sensor readings
  11.     // -- Update Cloud Datastream
  12.   Serial.print("--gasSensorValue = ");
  13.   Serial.println(gasSensorValue);
  14.   updateCloudDatastreamValue(CHANNEL_GAS_SENSOR_ID, gasSensorValue);
  15.     // -- Analyze Value
  16.   if (gasSensorValue < GAS_SENSOR_OPTIMAL) {
  17.     airQuality = AIR_QUALITY_OPTIMAL;
  18.   }
  19.   else if (gasSensorValue < GAS_SENSOR_GOOD) {
  20.     airQuality = AIR_QUALITY_GOOD;
  21.   }
  22.   else {
  23.     airQuality = AIR_QUALITY_BAD;
  24.   }
  25.   return airQuality; }
复制代码

读取灰尘传感器: 灰尘传感器包含光学传感系统,该系统借助数字输出针脚通电。 通电后执行 A/D 换算可对传感器的模拟电压输出(与空气中的 灰尘成正比)进行取样。 该函数可读取传感器、求取读数的平均值、分析传感器数据, 并返回该传感器的空气质量。
  1. int readDustSensor() {
  2.   // -- Init
  3.   int airQuality = 0;
  4.   int dustSensorValue = 0;
  5.       // -- Read Sensor
  6.   for (int i=0; i < MAX_SENSOR_READINGS; i++) {
  7.     digitalWrite(dustSensorLEDPin,LOW);  //Enable LED
  8.     delayMicroseconds(SAMPLE_DELAY);
  9.     dustSensorValue += analogRead(dustSensorPin);
  10.     delayMicroseconds(PULSEWIDTH_DELAY);
  11.     digitalWrite(dustSensorLEDPin,HIGH); //Disable LED
  12.     delayMicroseconds(PERIOD_DELAY);
  13.     delay(SENSOR_READING_DELAY);
  14.   }
  15.   dustSensorValue /= MAX_SENSOR_READINGS; //Average the sensor readings
  16.     // -- Update Cloud Datastream
  17.   Serial.print("--dustSensorValue = ");
  18.   Serial.println(dustSensorValue);
  19.   updateCloudDatastreamValue(CHANNEL_DUST_SENSOR_ID, dustSensorValue);
  20.     // -- Analyze Value
  21.   if (dustSensorValue < DUST_SENSOR_OPTIMAL) {
  22.     airQuality = AIR_QUALITY_OPTIMAL;
  23.   }
  24.   else if (dustSensorValue < DUST_SENSOR_GOOD) {
  25.     airQuality = AIR_QUALITY_GOOD;
  26.   }
  27.   else {
  28.     airQuality = AIR_QUALITY_BAD;
  29.   }      return airQuality; }
复制代码

读取 CO2 传感器: CO2 传感器返回 CO2 浓度值(单位:ppm)。 CO2 传感器通过 I2C 接口读取。 该函数可读取传感器、求取读数的平均值、分析传感器数据,并返回该传感器的空气质量。
  1. int readCO2Sensor() {
  2.   // -- Init
  3.   int airQuality = 0;
  4.   int co2SensorValue = 0;
  5.   int tempValue=0;
  6.   int invalidCount=0;
  7.     // -- Read Sensor
  8.   for (int i=0; i < MAX_SENSOR_READINGS; i++) {
  9.     tempValue = readCO2();  // see
  10. http://cdn.shopify.com/s/files/1/0019/5952/files/Senseair-Arduino.pdf?
  11. 1264294173 for this function
  12.     (tempValue == 0) ? invalidCount++ : co2SensorValue +=
  13. tempValue;
  14.     delay(SENSOR_READING_DELAY);
  15.   }
  16.     if (invalidCount != MAX_SENSOR_READINGS) {
  17.     co2SensorValue /= (MAX_SENSOR_READINGS - invalidCount);
  18. //Average the sensor readings
  19.   }
  20.     // -- Update Cloud Datastream
  21.   Serial.print("--co2SensorValue = ");
  22.   Serial.println(co2SensorValue);
  23.   updateCloudDatastreamValue(CHANNEL_CO2_SENSOR_ID, co2SensorValue);
  24.     // -- Analyze Value
  25.   if (co2SensorValue < CO2_SENSOR_OPTIMAL) {
  26.     airQuality = AIR_QUALITY_OPTIMAL;
  27.   }
  28.   else if (co2SensorValue < CO2_SENSOR_GOOD) {
  29.     airQuality = AIR_QUALITY_GOOD;
  30.   }
  31.   else {
  32.     airQuality = AIR_QUALITY_BAD;
  33.   }      return airQuality; }
复制代码

分析整体空气质量: 该函数可通过分析传来的气体、co2 和灰尘等空气质量值确定该地区的整体空气质量。 该函数可返回该地区的整体空气质量水平。
  1. int analyzeTotalAirQuality(int gasAirQuality, int
  2. co2AirQuality, int dustAirQuality) {
  3.     int airQuality = 0;
  4.     Serial.println("-Analyze Total Air Quality");
  5.     if (gasAirQuality==AIR_QUALITY_BAD    \
  6.         || dustAirQuality==AIR_QUALITY_BAD
  7. \
  8.         || co2AirQuality==AIR_QUALITY_BAD)
  9. {
  10.       Serial.println("--Air Quality Is
  11. BAD");
  12.       airQuality = AIR_QUALITY_BAD;
  13.     }
  14.     else if (gasAirQuality == AIR_QUALITY_OPTIMAL \
  15.             
  16. && dustAirQuality == AIR_QUALITY_OPTIMAL \
  17.             
  18. && co2AirQuality==AIR_QUALITY_OPTIMAL) {
  19.       Serial.println("--Air Quality Is
  20. OPTIMAL");
  21.       airQuality = AIR_QUALITY_OPTIMAL;
  22.     }
  23.     else  {
  24.       Serial.println("--Air Quality Is
  25. Good");
  26.       airQuality = AIR_QUALITY_GOOD;
  27.     }
  28.     return airQuality; }
复制代码

更新目测指示 LED: 该函数可将指示 LED 更新至与传来的空气质量值相对应的颜色。 LED 变成蓝色表示空气质量水平达到最佳、绿色表示空气质量良好、红色表示空气质量差。 如果检测到运动,LED 将变成品红色。
  1. void updateIndicationLED(int airQuality) {
  2.   Serial.println("-Update Indication LED");
  3.   // --Turn off all colors
  4.   digitalWrite(redRGBLEDPin,LOW);
  5.   digitalWrite(greenRGBLEDPin,LOW);
  6.   digitalWrite(blueRGBLEDPin,LOW);
  7.         // --Update Indication LED
  8.   if (airQuality == AIR_QUALITY_UNKNOWN) {
  9.     digitalWrite(redRGBLEDPin,HIGH);
  10.     digitalWrite(greenRGBLEDPin,HIGH);
  11.     digitalWrite(blueRGBLEDPin,HIGH);
  12.   }
  13.   else if (airQuality == AIR_QUALITY_OPTIMAL) {
  14.     digitalWrite(blueRGBLEDPin, HIGH);
  15.   }
  16.   else if (airQuality == AIR_QUALITY_GOOD) {
  17.     digitalWrite(greenRGBLEDPin, HIGH);
  18.   }
  19.   else {
  20.     digitalWrite(redRGBLEDPin, HIGH);
  21.   } }
复制代码

将数据发送至云服务提供商:
【intel程序猿笔记】使用英特尔® Edison探索空气质量监测图4
在本示例中, xively.com 将用作接收空气质量数据的云服务提供商。 图 2 所示为由四条通道组成的示例馈送。 “函数” 部分将对这些通道做进一步介绍。 集成 xively.com 要求将 Http Client 和 Xively 库添加至 Arduino IDE。
下列代码显示了可添加至空气质量系统的组件、宏和函数示例,可因此添加 xively.com 支持。

包含:
  1. #include <WiFi.h>
  2. #include <HttpClient.h>
  3. #include <Xively.h>
复制代码

宏:
  1. //Xively.com Defines #define XIVELY_FEED <enter
  2. your feed number here>
  3. #define XIVELY_KEY <enter your key string here>
  4. #define XIVELY_HTTP_SUCCESS 200 #define CHANNEL_AIR_QUALITY
  5. "AIR_QUALITY" #define CHANNEL_AIR_QUALITY_ID    0
  6. #define CHANNEL_GAS_SENSOR "GAS_SENSOR" #define
  7. CHANNEL_GAS_SENSOR_ID     1 #define CHANNEL_CO2_SENSOR
  8. "CO2_SENSOR" #define CHANNEL_CO2_SENSOR_ID     2
  9. #define CHANNEL_DUST_SENSOR "DUST_SENSOR" #define
  10. CHANNEL_DUST_SENSOR_ID    3 #define
  11. MAX_CHANNELS           
  12.    4
复制代码

全局变量:
  1. //Xively Datastream XivelyDatastream datastreams[] = {
  2.     XivelyDatastream(CHANNEL_AIR_QUALITY, strlen
  3. (CHANNEL_AIR_QUALITY), DATASTREAM_FLOAT),
  4.     XivelyDatastream(CHANNEL_GAS_SENSOR, strlen
  5. (CHANNEL_GAS_SENSOR), DATASTREAM_FLOAT),
  6.     XivelyDatastream(CHANNEL_CO2_SENSOR, strlen
  7. (CHANNEL_CO2_SENSOR), DATASTREAM_FLOAT),
  8.     XivelyDatastream(CHANNEL_DUST_SENSOR, strlen
  9. (CHANNEL_DUST_SENSOR), DATASTREAM_FLOAT)
  10.   }; //Xively Feed XivelyFeed feed(XIVELY_FEED, datastreams,
  11. MAX_CHANNELS);
  12.   
  13. //Xively Client WiFiClient client; XivelyClient xivelyclient(client);
复制代码

函数:

更新数据流: 调用该函数可更新 xively.com 通道数据流的值。 通道 ID 和数据流的值可传递至该函数。 如图 2 所示,该系统使用四条数据流。 数据流可更新为气体、co2 和灰尘传感器函数的原始传感器数据。 此外,主循环中的数据流 还可更新为整体空气质量值。
  1. void updateCloudDatastreamValue(int channelID, int
  2. value) {
  3.   // -- Update the Datastream Value
  4.   datastreams[channelID].setFloat(value); }
复制代码

将数据流发送至 Xively: 该函数针对 xively.com 馈送执行 PUT 操作 。 函数返回成功或失败代码状态。 主循环调用该函数。
  1. void sendToCloudService() {
  2.   int status=0;
  3.   Serial.println("-Send To Cloud Service”);
  4.   // -- Upload the Datastream to Xively
  5.   status = xivelyclient.put(feed, XIVELY_KEY);
  6.     // -- Verify Transaction
  7.   if (status == XIVELY_HTTP_SUCCESS) {
  8.    Serial.println("--HTTP OK");
  9.   }
  10.   else {
  11.     Serial.print("--ERROR: ");
  12.     Serial.println(status);
  13.   } }
复制代码

总结:
欢迎大家使用英特尔 Edison 平台研究空气质量监测。 挑战自我,添加其他显示各传感器状态的指示,添加针对空气质量变化的警告触发器增强云服务体验,并寻找机会将空气质量监测与其他系统相集成。
【intel程序猿笔记】使用英特尔® Edison探索空气质量监测图5

关于作者:
Mike Rylee 是英特尔公司的一名软件工程师,曾致力于开发基于 Android*、 Windows*、iOS* 和 Mac* 运行的嵌入式系统和应用。 他目前的主要工作是为 Android 和物联网相关项目提供支持。


                                                                        更多Edison信息请点击右边链接直接登录 >>>> 英特尔开发人员专区
广告,请广而告知——

每周二【intel 程序猿笔记】帖子下会设计一个与帖子内容相关的问答投票,你只要在留言区参与投票,选出正确的答案,社区小管家会挑选每周前10名回答正确的幸运互动者随机赠送小礼品,礼品可以实行累积制喔。也奏是说——只要你脑洞够大、热情够给力,你就可以横扫所有奖品实现大满贯喔!当然,对于大满贯获得者,我们还有神秘大礼包让你喜上加喜、锦上添花。奏这么任性,没办法!

现在,抢福利时间又到——


下列哪个选项不是该系统函数所涉及到的功能的 ?(答案单选)
赶紧在下面选项中选出一个正确答案赢取礼品吧 手快有,手慢无







单选投票, 共有 8 人参与投票
0.00% (0)
0.00% (0)
100.00% (8)
0.00% (0)
您所在的用户组没有投票权限

大连林海  初级技神 来自手机

发表于 2015-7-21 13:50:59

投投票
回复

使用道具 举报

Cain  初级技匠

发表于 2015-7-22 11:45:56

这期很应景啊,空气质量牵动了亿万人的心啊
回复

使用道具 举报

Juice  高级技师
 楼主|

发表于 2015-7-22 13:11:23

Cain 发表于 2015-7-22 11:45
这期很应景啊,空气质量牵动了亿万人的心啊

前路漫漫~~~
回复

使用道具 举报

Qubot  初级技师

发表于 2015-7-24 10:48:39

空气质量监测很赞啊
回复

使用道具 举报

Juice  高级技师
 楼主|

发表于 2015-7-24 11:52:45

Qubot 发表于 2015-7-24 10:48
空气质量监测很赞啊

很多人都在关注空气检测,期待不断改进!
回复

使用道具 举报

丄帝De咗臂  高级技匠

发表于 2015-7-25 20:03:19

我现在参加还不晚吧:lol
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail