聚豐項目 > 便攜式無線供電空氣質量檢測儀
隨著近些年環保問題的日益嚴峻,身邊的朋友也越來越重視自己的生存環境,尤其是對空氣質量的關注度日益增高。我就打算自己設計制作一套便攜式的空氣質量檢測儀,采用無線供電的方式來運行保證檢測儀的運行,同時利用無線供電系統給檢測儀內部的鋰電池進行充電。(本項目采用的是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數據輸出給屏幕
}
//程序結束,如有優化方案,歡迎溝通交流