DIY 激光PM2.5检测仪
ESP8266 arduino开发的一款激光PM2.5检测仪
看到网上做的pm2.5检测仪最多的是使用夏普的传感器的,但是夏普传感器的稳定性低,目前最准确的还是激光的传感器,所以做这个试试;
现在已经可以通过手机wifi连接并显示pm2.5的值(根据数值分rgb三种颜色显示);
此产品软硬件完全开源,并且后续会持续更新,争取做一个完善的空气质量检测仪;
 
										 
					
				DIY 激光PM2.5检测仪
ESP8266 arduino开发的一款激光PM2.5检测仪
看到网上做的pm2.5检测仪最多的是使用夏普的传感器的,但是夏普传感器的稳定性低,目前最准确的还是激光的传感器,所以做这个试试;
现在已经可以通过手机wifi连接并显示pm2.5的值(根据数值分rgb三种颜色显示);
此产品软硬件完全开源,并且后续会持续更新,争取做一个完善的空气质量检测仪;
 
										 
					
				
	元件:
ESP8266 01 模块,批量<10元
SDS011/SDS018/SDS021 激光PM2.5传感器 批量<100元
USB转TTL模块3-10元
导线若干
方便刷机用的开关一个(可不用)
	


 
 
					
				| ESP8266 | USB2TTL | 备注 | 
| VCC | 3.3V | 
 | 
| GND | GND | 
 | 
| CH_PD | 3.3V | 连线之间添加20-100欧的电阻,以免电压不匹配 | 
| GPIO0 | GND | 连线之间添加开关,用于刷机和运行固件状态切换。 GPIO0接GND为刷机状态; GPIO0悬空为正常运行状态; | 
| RX | TX | 
 | 
| TX | RX | 
 | 
	 
ESP8266和SDS011/SDS018/SDS021之间
| ESP8266 | SDS011/SDS018/SDS021 | 备注 | 
| RXD | TXD | 连线之间添加20-100欧的电阻,以免电压不匹配 | 
| GND | GND | 
 | 
| SDS011/SDS018/SDS021 | USB2TTL | 备注 | 
| 5V | 5V | 
 | 
| GND | GND | 
 | 
 
					
				简单方式:
http://share.weiyun.com/dfd9763e10370ec584b635e1f06e3bbf
下载文件 Arduino_ESP8266_IDE_1.0(内置编译器及烧写功能).rar
复杂方式:
安装arduino
下载Arduino 1.6.5
https://www.arduino.cc/en/main/software
打开文件-首选项窗口
在 Additional Board Manager URLs 里输入 :
http://arduino.esp8266.com/stable/package_esp8266com_index.json
可以通过输入逗号 输入多个网址;
从工具-板子-板子管理:选择ESP8266板并安装;
配置如果wifi模块是01~12的应选择NodeMCU 0.9,如下图所示:
	 
 
然后,设置CPU Frequency为80MHz,Upload Speed为115200,端口选择wifi模块与电脑连接分配的端口(如COM1),编程器不用选择,IDE已经默认设置好的,这个比较适合懒人,呵呵!
 
					
				/* Create a WiFi access point and provide a web server for pm2.5 on it. */
#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <ESP8266WebServer.h>
/* Set these to your desired credentials. */
const char *ssid = "AirMonitor";
const char *password = "inovafitness";
ESP8266WebServer server(80);
// this is a demo for Arduino PM2.5 sensor test
// PM2.5 sensor is from www.inovafitness.com SDS011
unsigned int Pm25 = 0;//used for result pm2.5
unsigned int Pm10 = 0;//used for result pm10
unsigned char Pm25IsNew = 0;//show if pm25 is refreshed
void ProcessSerialData()
{
  uint8_t mData = 0;
  uint8_t i = 0;
  uint8_t mPkt[10] = {0};
  uint8_t mCheck = 0;
 while (Serial.available() > 0) 
  {  
    // from www.inovafitness.com
    // packet format: AA C0 PM25_Low PM25_High PM10_Low PM10_High 0 0 CRC AB
     mData = Serial.read();     delay(2);
    if(mData == 0xAA)//head1 ok
     {
	delay(400);//wait until packet is received
        mPkt[0] =  mData;
        mData = Serial.read();
        if(mData == 0xc0)//head2 ok
        {
          mPkt[1] =  mData;
          mCheck = 0;
          for(i=0;i < 6;i++)//data recv and crc calc
          {
             mPkt[i+2] = Serial.read();
             delay(2);
             mCheck += mPkt[i+2];
          }
          mPkt[8] = Serial.read();
          delay(1);
	  mPkt[9] = Serial.read();
          if(mCheck == mPkt[8])//crc ok
          {
            Serial.flush();
            //Serial.write(mPkt,10);
            Pm25 = (uint16_t)mPkt[2] | (uint16_t)(mPkt[3]<<8);
            Pm10 = (uint16_t)mPkt[4] | (uint16_t)(mPkt[5]<<8);
            if(Pm25 > 9999)
             Pm25 = 9999;
            if(Pm10 > 9999)
             Pm10 = 9999;            
            //get one good packet
            Pm25IsNew = 1;
             return;
          }
        }      
     }
   } 
}
/* Just a little test message.  Go to http://192.168.4.1 in a web browser
 * connected to this access point to see it.
 */
void handleRoot() {
       char pm25_str[100];
       char *pm25_format_red = "<head><meta http-equiv=\"refresh\" content=\"5\"></head><h1>Pm2.5=<font color=\"red\">%d.%d</font></h1>";
       char *pm25_format_green = "<head><meta http-equiv=\"refresh\" content=\"5\"></head><h1>Pm2.5=<font color=\"green\">%d.%d</font></h1>";       
       char *pm25_format_blue = "<head><meta http-equiv=\"refresh\" content=\"5\"></head><h1>Pm2.5=<font color=\"blue\">%d.%d</font></h1>";              
       if (Pm25<150)//15.0
       sprintf(pm25_str,pm25_format_green, Pm25/10,Pm25%10);
       else if (Pm25<500)//pm2.5<50.0
       sprintf(pm25_str,pm25_format_blue, Pm25/10,Pm25%10);
       else
       sprintf(pm25_str,pm25_format_red, Pm25/10,Pm25%10);
       	server.send(200, "text/html", pm25_str);
}
void setup() {
	delay(1000);
	Serial.begin(9600);
	Serial.println();
	Serial.print("Configuring access point...");
	/* You can remove the password parameter if you want the AP to be open. */
	WiFi.softAP(ssid, password);
        delay(500); 
        delay(500); 
	//while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
	Serial.println("done");
	IPAddress myIP = WiFi.softAPIP();
	Serial.print("AP IP address: ");
	Serial.println(myIP);
	server.on("/", handleRoot);
	server.begin();
	Serial.println("HTTP server started");
}
void loop() {
	server.handleClient();
        ProcessSerialData();
}
	
 
					
				 
					
				 
					
				使用手机或笔记本等有wifi的设备,连接WIFI AP 名称:“AirMonitor”,密码:”inovafitness”
连接后,访问192.168.4.1,如下:
	 
 
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |