1.材料清单

1.1乐高相关材料清单

空气检测1

1.2其它材料清单

GP2Y1014AU粉尘传感器1个、150欧的电阻1个、220uF的电容1个

(京东或淘宝购买的话一般会附带赠送150欧的电阻1个、220uF的电容1个及数据线)

Arduino UNO 开发板一个

迷你面包板一个

5mm LED发光二极管红色、黄色、绿色各一个

220欧的电阻3个
杜邦线公对公2根(10cm就够了)

杜邦线公对母6根(10cm就够了)

面包板用跳线2mm 2个、5mm 1个、12mm 1个

杜邦头单排杜邦胶壳  1P (2.54mm间距 )6个(可选)

杜邦公端子公簧片 6个 (可选)

1.3相关工具

电烙铁(用于安装GP2Y1014AU线头,可选)

热熔胶枪(用于固定LED灯接线,可选)

2.硬件搭建

2.1 整体搭建说明

整体可分为5部分:Arduino uno支架、迷你面包板座、GP2Y1014座、LED灯座、乐高基座。

2.2 Arduino uno支架

Arduino uno支架的搭建过程请见《ARDUINO UNO乐高支架》。

下图中红色箭头的两个连接销先不安装,之后用于和基座连接。

2.3 迷你面包板座

迷你面包板座的搭建过程请见《迷你面包板座》。

下图为面包板接线实物图,具体接线方式请参考后面的电路设计段落。

2.4 GP2Y1014座

GP2Y1014AU附送的数据线线头是光的,没有安装杜邦头。可自行用杜邦公端子公簧片与杜邦头单排杜邦胶壳用电烙铁一个个进行安装(这个过程就不介绍了)。

如果觉得麻烦,也可用剪刀剥离出铜线,直接插入相关接口。这样就比较松动,移动后可能信号不好。

详细的分步搭建过程请看GP2Y1014乐高基座搭建步骤

下图中红色箭头的孔洞用于穿入GP2Y1014的电线。

2.5 LED灯座

先将3个LED灯按绿、黄、红的顺序插入5孔的平梁。应该能正好插进去,但别硬插小心灯泡破裂。

套上第二个5孔的平梁,灯泡的两根铁针一同套入孔,但别捧在一起。

然后两边插入两个轴套连接销。

用透明胶带将三对杜邦线母头绑在一起,便于插入LED灯脚。

外露的针脚稍微剪掉一点,留个5cm左右,别太短,便于杜邦线插入。注意正负极,长针为正级。

将杜邦线插入LED针脚。

红蓝的一对杜邦线插入绿灯,红色正级插入长针。

橙紫的一对杜邦线插入黄灯,橙色正级插入长针。

黄灰的一对杜邦线插入红灯,黄色正级插入长针。

用热熔胶枪在杜邦线接口处上点胶,免得接口滑出(其实固定不动,一般线也不会滑出来)。

2.6 乐高基座搭建

整体组装前先将线路都接好,并理顺线路,免得组装时线路缠绕。

空气检测乐高底座Lego Digital Designers设计稿下载

详细的分步搭建过程可以下载空气检测乐高底座Lego Digital Designers设计稿,使用Lego Digital Designers软件查看,或者在线查看分步搭建指南

3.电路设计

电路原理图

电路实物图

空气质量检测仪-电路设计图(Fritzing)下载

4.程序代码

[cc lang=”c” tab_size=”2″ lines=”400″ width=”800″]
#define LEDPIN_A 4 //LED-A,数字端口D4
#define LEDPIN_B 5 //LED-B,数字端口D5
#define LEDPIN_C 6 //LED-C,数字端口D6

#define SENSOR_GP2Y1010_PIN 0 //Gp2y1010传感器,模拟端口A0
#define SENSOR_GP2Y1010_LEDPIN 2 //Gp2y1010传感器,数字端口D2

#define LIST_SIZE 8 //数据队列数量

double sensorGp2y1010ValList[LIST_SIZE];
int sensorGp2y1010NowIndex = 0;

void setup() {
Serial.begin(9600);
//开启LED灯端口输出模式
pinMode(LEDPIN_A, OUTPUT);
pinMode(LEDPIN_B, OUTPUT);
pinMode(LEDPIN_C, OUTPUT);
//开启Gp2y1010LED灯端口输出模式
pinMode(SENSOR_GP2Y1010_LEDPIN, OUTPUT);

for (int i = 0; i < LIST_SIZE; i++) { sensorGp2y1010ValList[i] = 0; } } void loop() { double nowNumGp2y1010 = 0; nowNumGp2y1010 = getGp2y1010Value(); delay(400); openLed(nowNumGp2y1010); Serial.print(“now: “); Serial.println(nowNumGp2y1010); } // 取Gp2y1010传感器数据 float getGp2y1010Value() { double nowNumGp2y1010 = 0; float dust_voltage = 0; // int dust_analog; //采集到的Gp2y1010传感器电压 digitalWrite(SENSOR_GP2Y1010_LEDPIN, LOW); //打开Gp2y1010LED灯 delayMicroseconds(280); //开启LED后的280us的等待时间 dust_analog = analogRead(SENSOR_GP2Y1010_PIN); //读取模拟值 delayMicroseconds(40); //40us等待时间 digitalWrite(SENSOR_GP2Y1010_LEDPIN, HIGH); //关闭Gp2y1010LED灯 delayMicroseconds(9680); dust_voltage = dust_analog * 5.0 / 1023.0 ; //将模拟值转换为电压值 delay(500); //GP2Y1014等待500毫秒,GP2Y1010等待200毫秒, sensorGp2y1010ValList[sensorGp2y1010NowIndex] = dust_voltage; sensorGp2y1010NowIndex ++; if (sensorGp2y1010NowIndex >= LIST_SIZE) {
sensorGp2y1010NowIndex = 0;
}

for (int i = 0; i < LIST_SIZE; i++) { nowNumGp2y1010 += sensorGp2y1010ValList[i]; } nowNumGp2y1010 /= LIST_SIZE; int concSHARP = 172 * nowNumGp2y1010 – 100; //转换为ug/m3 concSHARP = constrain(concSHARP, 0, 500); return concSHARP; } //打开灯 void openLed(double airQualityNumber) { if (airQualityNumber <= 12) { //优(绿) digitalWrite(LEDPIN_A, HIGH); digitalWrite(LEDPIN_B, LOW); digitalWrite(LEDPIN_C, LOW); } else if (airQualityNumber > 12 && airQualityNumber <= 35.4) { //良(黄) digitalWrite(LEDPIN_A, LOW); digitalWrite(LEDPIN_B, HIGH); digitalWrite(LEDPIN_C, LOW); } else if (airQualityNumber > 35.4 && airQualityNumber <= 55.4) { //轻度污染(黄绿) digitalWrite(LEDPIN_A, HIGH); digitalWrite(LEDPIN_B, HIGH); digitalWrite(LEDPIN_C, LOW); } else if (airQualityNumber > 55.4 && airQualityNumber <= 150.4) { //中度污染(红) digitalWrite(LEDPIN_A, LOW); digitalWrite(LEDPIN_B, LOW); digitalWrite(LEDPIN_C, HIGH); } else if (airQualityNumber > 150.4 && airQualityNumber <= 250.4) { //重度污染(红绿) digitalWrite(LEDPIN_A, HIGH); digitalWrite(LEDPIN_B, LOW); digitalWrite(LEDPIN_C, HIGH); } else if (airQualityNumber > 250.4 && airQualityNumber <= 500.4 ) { //危险 digitalWrite(LEDPIN_A, LOW); digitalWrite(LEDPIN_B, HIGH); digitalWrite(LEDPIN_C, HIGH); } else if (airQualityNumber > 500.4) {
//爆表
digitalWrite(LEDPIN_A, HIGH);
digitalWrite(LEDPIN_B, HIGH);
digitalWrite(LEDPIN_C, HIGH);
}
}

[/cc]

代码下载

完成