自制智能WIFI空气净化器(ARDUINO)
转载请注明出处http://blog.csdn.net/cuijiyue/article/details/78824768
简介
- 成品图片
web控制端
参考资料
模块 | 参考资料 |
---|---|
单片机 mega2560 | 硬件 https://wenku.baidu.com/view/0c37156065ce050877321320.html 编程入门 http://www.51hei.com/bbs/dpj-41336-1.html https://pan.baidu.com/s/1jIf8IxS |
多线程 | https://www.cnblogs.com/xiaowuyi/p/4319720.html |
温湿度 | DHT11,单总线 http://www.arduino.cn/thread-1429-1-2.html https://pan.baidu.com/s/1kVaMRzD |
PM25 | PMS500, 串口 https://pan.baidu.com/s/1eS5zosE |
WIFI | ESP-12N,串口,内置MCU,LUA编程 https://pan.baidu.com/s/1kVvLCzX |
屏幕 | 12864 OLED, i2c http://www.arduino.cn/forum.php?mod=viewthread&tid=20080 https://pan.baidu.com/s/1micMO1y |
PMW电机调速 | L298N,gpio PWM调速 https://pan.baidu.com/s/1eSwBMLk |
箱体及电机硬件 | https://post.smzdm.com/p/41272/ |
DH11温湿度
加载DHT11的lib,就可以读取温湿度,每5s读取一次
dht11 DHT11;
void getTemperature(int pin) {
int ret = DHT11.read(pin);
switch (ret)
{
case DHTLIB_OK:
//log("DHT11 OK");
temperature = DHT11.temperature;
humidity = DHT11.humidity;
PT_SEM_SIGNAL(&screenSem);
break;
case DHTLIB_ERROR_CHECKSUM:
log("DHT11 Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
log("DHT11 Time out error");
break;
default:
log("DHT11 Unknown error");
break;
}
}
static int temperatureMission(struct pt *pt)
{
PT_BEGIN(pt);//线程开始
while(1)
{
getTemperature(2);//接入2号管脚
//dhtDelay.setTimer(5000);//设定5秒
PT_TIMER_DELAY(pt, 5000);
}
PT_END(pt);//线程结束
}
PM25
读取时需要注意检查数据帧结构,防止信息错误
PM25会存储上一次读取的数值,每5s会通过信号量通知屏幕更新,
读取PM25和电机控制在 pm25PowerMission 中
class PM25 {
private:
int pm_cf_10 = -1;
int pm_cf_25 = -1;
int pm_cf_100 = -1;
int pm_at_10 = -1;
int pm_at_25 = -1;
int pm_at_100 = -1;
int particulate03 = -1;
int particulate05 = -1;
int particulate10 = -1;
int particulate25 = -1;
int particulate50 = -1;
int particulate100 = -1;
int setGpio = -1;
int resetGpio = -1;
int serialNum;
int prePM25[10] = {0};
int sleepLevel[4][2] = {
{10, 20}, {50, 30}, {100, 1}, {200, 0}}; //pm_val, sleep minutes
int powerLevel[4][2] = {
{10, 0}, {50, 2}, {100, 10}, {200, 24}}; //pm_val, powerlevel
int beginIndex = 0;
int endIndex = 0;
bool pmHighPower = true;
bool pmRun = true;
unsigned char rxBuffer[32];
int frameLen = 32;
enum FrameStatus{
HEAD1,
HEAD2,
LEN1,
LEN2,
DATAREAD,
VERSION,
CHECK,
CRC1,
CRC2,
};
FrameStatus frameStatus;
int dataLen;
int