1
聚丰项目 > 便携式无线供电空气质量检测仪
随着近些年环保问题的日益严峻,身边的朋友也越来越重视自己的生存环境,尤其是对空气质量的关注度日益增高。我就打算自己设计制作一套便携式的空气质量检测仪,采用无线供电的方式来运行保证检测仪的运行,同时利用无线供电系统给检测仪内部的锂电池进行充电。(本项目采用的是IDT 5W无线充电开发套件)
我是活得精彩
分享我是活得精彩
团队成员
严晓凯 成员
随着近些年环保问题的日益严峻,身边的朋友也越来越重视自己的生存环境,尤其是对空气质量的关注度日益增高。目前大部分人获取当地空气质量的途径是通过当地环保站发布的数据,但是那些数据并不是实时更新的,也不能代表你身边的空气质量,所以为了想进一步掌握身边的空气质量到底如何,我就打算自己设计制作一套便携式的空气质量检测仪,恰逢“无线电”论坛和IDT公司举办了一场无线供电应用的大赛,使我萌发了一个新的想法,采用无线供电的方式来运行保证检测仪的运行,同时利用无线供电系统给检测仪内部的锂电池进行充电,这样才真正实现了便携式的意义。通过设计计算,整机负载电流约500ma,考虑到设计的充电电流是1000ma,所以项目选用了IDT 5W无线供电系统,该系统可以提供5V 1A的最大5W的功率输出,完全满足设计要求。(本项目采用的是IDT 5W无线充电开发套件)
项目的原理图部分:
包含三大部分组成:
1、无线供电锂电池充放电部分,由于传感器的TTL输出电平是3.3V,所以还需要通过一个LDO将MCU供电电源降为3.3V。传感器供电部分是5V(内部有LDO降压),有系统直接供电即可。本项目用的电池选用了常见的18650锂电池,容量2600mah。充放电芯片选用上海钰泰的ETA9640一体式芯片,最大充放电电流1000ma,自带锂电池保护电路,无需外围再加保护电路。无线供电接收板接口直接与USB供电接口并接,既可以采用USB供电,也可以采用IDT无线系统供电。
2、MCU部分选用了AVR内核的8位单片机LGT8F328D,传感器选用攀藤科技的A003最新款颗粒物传感器和森尔电子的S8 0053二氧化碳传感器(由于二氧化碳传感器价格较贵,最终未进行购买)。
3、显示屏幕选用了2.2寸串口屏,便于快速开发,降低开发难度。
项目的PCB图和3D图部分:
这个PCB板子尺寸为80*70mm,正面为主要电路和屏幕部分,反面为18650电池仓和两个传感器接口。
最终PCB板和焊接好的PCB板:
IDT无线供电系统接收板
无线充电过程
本项目软件设计采用Arduino IDE开源编程框架,主要分为系统初始化和循环执行两大部分构成。程序部分均包含详细注释,可以直接使用,本代码完全开源,如需转载请注明原作者,谢谢!
程序部分:
/*
本程序为V1版本空气质量检测仪代码,显示屏幕为2.2寸串口高分屏。
编译环境:Arduino 1.8.5 (其它版本不保证通过编译)
版权所有:活得精彩 (QQ:3720300) 如需转载,请注明原作者,谢谢!
*/
#include <SoftwareSerial.h>//调用软串口库文件
SoftwareSerial pm(2, NULL);//定义PM2.5传感器接收引脚
SoftwareSerial co(4, NULL);//定义CO2传感器接收引脚
unsigned int CO2;//定义全局变量
unsigned int pm25;//定义全局变量
void getCO2(unsigned char Data) //定义CO2计算函数
{
static unsigned char RxBuffer[7];
static unsigned char RxCnt = 0;
RxBuffer[RxCnt++] = Data;
if (RxBuffer[0] != 0xFE && RxBuffer[1] != 0x04)
{
RxCnt = 0;
return;
}
if (RxCnt > 6)
{
CO2 = (int) RxBuffer[3] * 256 + (int) RxBuffer[4];
RxCnt = 0;
return;
}
}
void getPM25()//定义PM2.5计算函数
{
uint8_t mData = 0;
uint8_t i = 0;
uint8_t mPkt[32] = {0};
int mCheck = 0;
pm.listen(); //监听pm软串口
delay(100);
while (pm.available() > 0)
{
mData = pm.read();
delay(2);
if (mData == 0x42) //头数据1 OK
{
mPkt[0] = mData;
mData = pm.read();
delay(2);
if (mData == 0x4d) //头数据2 OK
{
mPkt[1] = mData;
mCheck = 66 + 77;
for ( i = 2; i < 30; i++) //循环接收串口数据
{
mPkt[i] = pm.read();
delay(2);
mCheck += mPkt[i];
}
mPkt[30] = pm.read();
delay(2);
mPkt[31] = pm.read();
delay(2);
// Serial.println("-----------"); //系统调试用
// Serial.print(mCheck);//系统调试用
// Serial.print(" ");//系统调试用
// Serial.println(mPkt[30] * 256 + mPkt[31]);//系统调试用
if (mCheck == mPkt[30] * 256 + mPkt[31]) //CRC校验 OK
{
// Serial.println("CRC OK");//系统调试用
pm25 = mPkt[12] * 256 + mPkt[13];//根据协议计算出PM2.5浓度值
// Serial.print("pm25:"); Serial.print(pm25); Serial.println("ug/m3 ");//系统调试用
Serial.flush();//清空串口缓存
return;//返回
}
}
}
}
}
void setup()//程序初始化
{
Serial.begin(9600);
pm.begin(9600);
co.begin(9600);
delay(5000);
Serial.println("SPG(2);"); //调用串口屏的第二页内容
delay(100);
}
void loop()//循环执行程序
{
getPM25();//调用PM2.5计算函数
co.listen(); //监听co软串口
delay(100);
static unsigned char TxBuffer[] = {0xFE, 0x04, 0x00, 0x03, 0x00, 0x01, 0xD5, 0xC5};//定义读取指令
co.write(TxBuffer, 8);//发送读取指令给CO2传感器
delay(100);
while (co.available())
{
getCO2(co.read());//获取CO2浓度值
}
Serial.print("LABL(48,0,40,159,'"); Serial.print(pm25); Serial.print("',"); Serial.print(15); Serial.println(",1);");//将PM2.5数据输出给屏幕
Serial.print("LABL(48,161,40,319,'"); Serial.print(CO2); Serial.print("',"); Serial.print(15); Serial.println(",1);");//将CO2数据输出给屏幕
}
//程序结束,如有优化方案,欢迎沟通交流