wetnt 发表于 2016-4-12 16:37:49

DIY空气质量检测仪 — PM2.5 HCHO 8266 si7021,主控Mega2560

本帖最后由 wetnt 于 2017-6-10 12:27 编辑

    之前发帖采用NodeMcu采集攀藤G5空气质量,发送到了乐联网——《攀藤G5空气质量上报乐联网教程,PM2.5 HCHO NodeMcu(8266) si7021》;不过NodeMcu双串口实在是让人头疼,还是Arduino Mega2560来的爽快!


    作品成果。其实每个作品设计,最让人头疼的是“结构设计”,个人作品受限制于条件,不能打PCB,不能3D打印外壳,只能找各种现成的板子、外壳来拼凑,而且还得好看,不看着LOW,的确过程让人绞尽脑汁。


    NOKIA5110屏幕,便宜量足!显示内容:温度、湿度;PM1.0/PM2.5/PM10;甲醛、平均值;上传次数,时间。版面限制,没做很花哨。


    夹心饼干式结构,两层外壳+5110+Arduino Mega2560+扩展板+(G5+HCHO+ESP8266-05)


    攀藤G5传感器,没有M2的螺丝,也懒得打孔,胶带伺候!


    攀藤G5传感器的排线,想得这排线还得在NodeMcu板子上用,只好从中间挑开装排针,VCC,GND,TX三条线。


    ESP8266-05模块,为什么用这个?因为单排插针,2.54间距,不用接EN针脚,但没有适配的天线,需要外挂!(ESP8266就不能出一款适合DIY的板子么?)


    攀藤HCHO传感器,非2.54间距,没办法,直接做转接板吧,作品体积就别想MINI了。


    攀藤HCHO传感器,单排5根针脚有用,转接到2.54间距,如果不考虑跟换,也可以直接焊接飞线连接。


    si7021,没什么特别的挂库上II2C接口,OK。


    Arduino Mega扩展板!为什么使用Arduino Mega2560,因为ESP8266需要串口、攀藤HCHO需要串口、G5需要串口,好吧,还有打印上传程序需要串口,Mega2560硬件串口多正好。也不像UNO、NANO那样需要软串口,协调几个串口很麻烦,而且程序空间也不够,懒得费神了。


    攀藤HCHO、G5需要5v电源,而ESP8266、si7021需要3.3v电源,所以增加了一片降压模块。


    Mini-360航模降压电源模块,体积小巧,应用起来感觉还不错。比较牛逼之处是可以调电压,这样可以应对不同情况。


    DIY的各类接口,主要就是+/-供电、RX/TX,还有II2C。供电走线是个麻烦,板子下面全是飞线。主要花时间在这个上面。


    Arduino Mega2560板子,大家已经很熟悉了。


    NOKIA5110屏幕,根据Mega2560双排排针,做了转接线。电源在一边、数字管脚在一边,这样应对其他板子,也能够转接,只要在程序里修改对应管脚就ok。


    整体组装好,体积大了一些,也不太平整,只好用纸片垫高了。


    攀藤G5传感器进出风口在一边,就这样一个设计了。


    旁边耷拉着8266的天线,实在是不好看!

wetnt 发表于 2016-4-12 16:38:24

本帖最后由 wetnt 于 2016-4-13 17:22 编辑

全部软件代码,欢迎指点,谢谢!

G5_HCHO_Wifi_Lewei_6_5110_ok.ino

static const String codeName = "G5_HOHC_Wifi_Lewei_1!";
void setup() {
//------------------------------------------------
lgsetup(codeName);
LCD5110_setup();
//------------------------------------------------
Si7021_setup();
//------------------------------------------------
S1_init(F("G5"), 9600, false);
//S2_init(F("WIFI"), 9600, true);
S3_init(F("HCHO"), 9600, false);
//------------------------------------------------
wifi_Init(false, false, false); NetLinkTest_BBKGPS();
//------------------------------------------------
tLoop_Setup();
//------------------------------------------------
HCHO_Ask(); Si7021_read();
LCD_Show_All(); LG_Show_All();//Lewei_Loop();
//------------------------------------------------
}
void loop() {
lgFeed(); S1_feed(); S2_feed(); S3_feed();
Work_Loop();
}
static void smartDelay(unsigned long ms) {
unsigned long start = millis(); do {
    //------------------------------------------
    lgFeed(); S1_feed(); S2_feed(); S3_feed();
    //------------------------------------------
} while (millis() - start < ms);
}
//=====================================================


B0_Basic.ino

//-------------------------------------
double getK(char a, char b, char c,char d) {
String s = "";
s.concat(a);s.concat(b);s.concat(c); s.concat(d);
double x = ((double)s.toInt())/10;
lg(x); lg();
return x;
}
//-------------------------------------
int getV(char a, char b) {
return GetHexCharToInt(a) * 16 + GetHexCharToInt(b);
}
//-------------------------------------
int GetHexCharToInt(char c) {
if (1 == 0) {}
else if (c == '0') return 0;
else if (c == '1') return 1;
else if (c == '2') return 2;
else if (c == '3') return 3;
else if (c == '4') return 4;
else if (c == '5') return 5;
else if (c == '6') return 6;
else if (c == '7') return 7;
else if (c == '8') return 8;
else if (c == '9') return 9;
else if (c == 'A') return 10;
else if (c == 'B') return 11;
else if (c == 'C') return 12;
else if (c == 'D') return 13;
else if (c == 'E') return 14;
else if (c == 'F') return 15;
}


B0_Log.ino

//===================================================================
#definelgsSerial
static const long LGSBaud = 115200;
//===================================================================
void lgsetup(String s) {
lgs.begin(LGSBaud); delay(200);
lgln(s); lgln(F("Log.Serial.start!"));
}
//===================================================================
void lg(String str) {
lgs.print(str);
}
void lg(int s) {
lgs.print(s);
}
void lg(unsigned int s) {
lgs.print(s);
}
void lg(double s) {
lgs.print(s);
}
void lg(float s) {
lgs.print(s);
}
void lg(long s) {
lgs.print(s);
}
void lg(unsigned long s) {
lgs.print(s);
}
void lg(char s) {
lgs.print(s);
}
void lgln(String str) {
lg(str);
lgs.println("");
}
void lg() {
lgs.println("");
}
//===================================================================
void lgFeed() {
//----------------------------------------------------------
while (lgs.available()) {
    char c = lgs.read();
    //rc_cmd_loop(c);
    //lg(c);
}
//----------------------------------------------------------
}


B0_Millis.ino

typedef struct tLoop {
unsigned long startTime = millis()/1000;
unsigned long msKey = 1000;
void init(unsigned long k) {
    msKey = k; startTime = millis()/1000;
}
boolean tloop() {
    if (millis()/1000 - startTime < msKey) return false;
    startTime = millis()/1000; return true;
}
} tLoop;
//===============================================
tLoop t1s, t2s, t5s, t10s, t20s, t30s, t60s;
void tLoop_Setup() {
t1s.init(1);
t2s.init(2);
t5s.init(5);
t10s.init(10);
t20s.init(20);
t30s.init(30);
t60s.init(60);
}
boolean ts_loop(int x) {
switch (x) {
    case 1:return t1s.tloop();break;
    case 2:return t2s.tloop();break;
    case 5:return t5s.tloop();break;
    case 10: return t10s.tloop(); break;
    case 20: return t20s.tloop(); break;
    case 30: return t30s.tloop(); break;
    case 60: return t60s.tloop(); break;
}
return false;
}
//===============================================


B0_PROGMEM.ino

#include <avr/pgmspace.h>
//---------------------------------------------------------------------------------------------
//const static char Lewei_Link[] PROGMEM = {"AT+CIPSTART=\"TCP\",\"www.lewei50.com\",80"};
String S(const char x[]) {
char myChar; String myBuffer = "";
int len = strlen_P(x);
for (int k = 0; k < len; k++) {
    myChar =pgm_read_byte_near(x + k);
    myBuffer += myChar;
}
return myBuffer;
}
//char * C(const char x[]) {
//int len = strlen_P(x);
//char myBuffer;
//for (int k = 0; k < len; k++) {
//    myBuffer = (char)pgm_read_byte_near(x + k);
//}
//return myBuffer;
//}
int L(const char x[]) {
return strlen_P(x);
}
//---------------------------------------------------------------------------------------------


B0_String.ino

String GetStringAB(String txt, String a, String b) {
int ln = txt.length();
int an = txt.indexOf(a);
int al = a.length();
//lg(txt);lg('=');lg(a);lg('=');lg(b);
if (ln <= an) return "";
txt = txt.substring(an);
//lg('=');lg(txt);
int bn = txt.indexOf(b);
if (bn <= al) return "";
txt = txt.substring(al, bn);
//lg('=');lg(txt);lg();
return txt;
}
boolean DataIndexOf(String d, String s) {
return (d.indexOf(s) != -1);
}

B1_Serial1.ino

//===================================================================
#define S1 Serial1
long S1_Baud = 9600;
boolean S1logKey = false;
//===================================================================
void S1_init(String ss_name, long btl, boolean lgKey) {
S1logKey = lgKey; S1_Baud = btl;
S1.begin(S1_Baud); delay(200);
lg(ss_name); lg(F(".start = ")); lg(S1_Baud); lg();
}
//===================================================================
void S1_feed() {
while (S1.available()) {
    byte c = S1.read();
    if (S1logKey) lg(c);
    G5Feed(c);
}
}
//===================================================================


B1_Serial3.ino

//===================================================================
#define S3 Serial3
long S3_Baud = 9600;
boolean S3logKey = false;
//===================================================================
void S3_init(String ss_name, long btl, boolean lgKey) {
S3logKey = lgKey; S3_Baud = btl;
S3.begin(S3_Baud); delay(200);
lg(ss_name); lg(F(".start = ")); lg(S3_Baud); lg();
}
//===================================================================
void S3_feed() {
while (S3.available()) {
    byte c = S3.read();
    if (S3logKey) lg(c);
    HCHOCheck(c);
}
}
//===================================================================


B2_G5.ino

//===================================================================
#define LENG 32
byte pBuf;
//攀藤G5的数据格式
typedef struct _G5_type { //0x42;0x4d;
//------------------------------------------------
int len;    //=2*13+2 帧长度
//------------------------------------------------
//标准颗粒物浓度(CF=1)
int cf10;   //=PM1.0=ug/m3
int cf25;   //=PM2.5=ug/m3
int cf1X;   //=PM10 =ug/m3
//------------------------------------------------
//大气环境下
int pm10;   //=PM1.0=ug/m3
int pm25;   //=PM2.5=ug/m3
int pm1X;   //=PM10 =ug/m3
//------------------------------------------------
//0.1升空气中xxum直径颗粒物个数
unsigned int um03;   //=0.3um
int um05;   //=0.5um
int um10;   //=1.0um
int um25;   //=2.5um
int um50;   //=5.0um
int um1X;   //=10.0um
//------------------------------------------------
int vers;   //版本号
int errs;   //错误号
int chek;   //校验和
//------------------------------------------------
} G5_type;
G5_type g;
void G5Feed(byte c) {
//------------------------------------------------
static int state = 0;
static int count = 0;
//------------------------------------------------
if (0x42 == c) state = 1;
if (0x4d == c && state == 1) {
    state = 2;
    count = -1;
}
//------------------------------------------------
pBuf = c;//lg(c);
//------------------------------------------------
if (count == 30) G5Exp();
//------------------------------------------------
}
unsigned int G5Val(int a, int b) {
unsigned int v = pBuf << 8;
if (b > 0) v += pBuf;
return v;
}
void G5Exp() {
//------------------------------------------------
g.len = G5Val(0, 1);   //=2*13+2 帧长度
//------------------------------------------------
//标准颗粒物浓度(CF=1)
g.cf10 = G5Val(2, 3);    //=PM1.0=ug/m3
g.cf25 = G5Val(4, 5);    //=PM2.5=ug/m3
g.cf1X = G5Val(6, 7);    //=PM10 =ug/m3
//------------------------------------------------
//大气环境下
g.pm10 = G5Val(8, 9);   //=PM1.0=ug/m3
g.pm25 = G5Val(10, 11);   //=PM2.5=ug/m3
g.pm1X = G5Val(12, 13);   //=PM10 =ug/m3
//------------------------------------------------
//0.1升空气中xxum直径颗粒物个数
g.um03 = G5Val(14, 15);   //=0.3um
g.um05 = G5Val(16, 17);   //=0.5um
g.um10 = G5Val(18, 19);   //=1.0um
g.um25 = G5Val(20, 21);   //=2.5um
g.um50 = G5Val(22, 23);   //=5.0um
g.um1X = G5Val(24, 25);   //=10.0um
//------------------------------------------------
g.vers = G5Val(26, -1);   //版本号
g.errs = G5Val(27, -1);   //错误号
g.chek = G5Val(28, 29);   //校验和
//------------------------------------------------
//G5_Show();
//AskHCHO();
//Si7021_show();
//------------------------------------------------
}
void G5_Show() {
//------------------------------------------------
//lg(); lg(F("----------------------------------------------------------")); lg();
lg(F("American standard\t"));
lg(F("pm1.0 = ")); lg(g.cf10); lg(F(" ug/m3\t"));
lg(F("pm2.5 = ")); lg(g.cf25); lg(F(" ug/m3\t"));
lg(F("pm10. = ")); lg(g.cf1X); lg(F(" ug/m3\t")); lg();
//------------------------------------------------
lg(F("China standard\t\t"));
lg(F("pm1.0 = ")); lg(g.pm10); lg(F(" ug/m3\t"));
lg(F("pm2.5 = ")); lg(g.pm25); lg(F(" ug/m3\t"));
lg(F("pm10. = ")); lg(g.pm1X); lg(F(" ug/m3\t")); lg();
//------------------------------------------------
lg(F("0.3um = ")); lg(g.um03); lg(F("\t"));
lg(F("0.5um = ")); lg(g.um05); lg(F("\t"));
lg(F("1.0um = ")); lg(g.um10); lg(F("\t"));
lg(F("2.5um = ")); lg(g.um25); lg(F("\t"));
lg(F("5.0um = ")); lg(g.um50); lg(F("\t"));
lg(F("10.um = ")); lg(g.um1X); lg(F("\t"));lg();
//------------------------------------------------
}


B3_HCHO.ino

//------------------------------------------------
int iHCHO = 0;
float fHCHO = 0.0f;
float fHCHOnum = 0.0f;
float fHCHOall = 0.0f;
float fHCHOavr = 0.0f;
//------------------------------------------------
//查询命令
const static unsigned char HCHOAskData = {0x42, 0x4D, 0x01, 0x00, 0x00, 0x00, 0x90};
//气体名称
String numName;
const static char numNameInx[] = {//50% //String numNameInx[]= {//56%
"无", "CO", "H2S", "CH4", "CL2", "HCL", "F2", "HF", "NH3", "HCN", "PH3", "NO", "NO2", "O3", "O2", "SO2", "CLO2",
"COCL", "PH3", "SiH4", "HCHO", "CO2", "VOC", "ETO", "C2H4", "C2H2", "SF6", "AsH3", "H2", "TOX1", "TOX2"//,
//"气体流量L/M", "电池电量/%"
};
//数据内容 单位
String numUnit;
const static char numUnitInx[] = {"", "ppm", "VOL", "LEL", "Ppb", "mg/m3"};
//数据当量
float numKeys = 1;
const float numKeysInx[] = {1, 1, 10, 100, 1000};
//------------------------------------------------
void HCHO_Ask() {//42 4d 01 00 00 00 90
S3.write(HCHOAskData, 7);//Serial.print(data,HEX)//AskHCHO()
}
//------------------------------------------------
void ShowHCHO() {
//---------------------------------------
lg(numName); lg(F(":")); lg(fHCHO); lg(F(" ")); lg(numUnit);
lg(F(" Avg:")); lg(fHCHOavr); lgln(numUnit);
//---------------------------------------
}
void LcdHCHO() {
//LCD1602_Show(0, 0, String(numName) + String(F(": ")) + String(fHCHO) + String(F(" ")) + String(numUnit)   );
//LCD1602_Show(6, 1, String(dhtH) + String(F("C V:")) + String(fHCHOavr) + String(F(" ")) + String(numUnit) );
}
//------------------------------------------------
char HCHObuf;
int HCHOinx = 0;
void HCHOCheck(byte c) {
if (HCHOinx == 9) GetHCHO();
if (HCHOinx == 9) ShowHCHO();
if (c == 0x42) HCHOinx = 0;
HCHObuf = c;
HCHOinx++;
}
void GetHCHO() {
//---------------------------------------
numName = numNameInx];
numUnit = numUnitInx];
numKeys = numKeysInx];
//---------------------------------------
iHCHO = HCHObuf * 256 + HCHObuf;
fHCHO = iHCHO / numKeys;
//---------------------------------------
fHCHOnum++;
fHCHOall += fHCHO;
fHCHOavr = fHCHOall / fHCHOnum;
//---------------------------------------
}
//------------------------------------------------


B4_SI7021.ino

#include <Wire.h>
#include <Si7021.h>
Si7021 Si;
float Si_Temperature, Si_Humidity;
void Si7021_setup() {
lgln(F("Si7021_setup..."));
Wire.begin();
if (Si.detectSensor())
    lgln(F("Device detected"));
else
    lgln(F("Device NOT detected"));
}
void Si7021_read() {
Si_Temperature = Si.getTemperature();
Si_Humidity = Si.getHumidity();
}
void Si7021_show() {
lg("Temperature: "); lg(Si_Temperature); lg(" C, Humidity: "); lg(Si_Humidity); lg(" %"); lg();
}


B5_WiFi.ino

//=========================================================================
//https://www.zybuluo.com/kfihihc/note/31135
//http://wiki.iteadstudio.com/ESP8266_Serial_WIFI_Module
//=========================================================================
const static char AT_Test[] PROGMEM = "AT";
const static char AT_Type[] PROGMEM = "AT+CWMODE=1"; //beWiFi
const static char AT_Rest[] PROGMEM = "AT+RST";       //reBoot
const static char AT_Cmux[] PROGMEM = "AT+CIPMUX=0";//?
const static char AT_IsJP[] PROGMEM = "AT+CWJAP?";    //SeeAP//is Join AP
const static char AT_lgIP[] PROGMEM = "AT+CIFSR";   //seesIP
const static char AT_JAPa[] PROGMEM = "AT+CWJAP=\"";//Join AP
const static char AT_JAPb[] PROGMEM = "\",\"";      //
const static char AT_JAPc[] PROGMEM ="\"";          //
const static char AT_Send[] PROGMEM = "AT+CIPSEND=";//
const static char AT_Stat[] PROGMEM = ">";            //
//-------------------------------------------------------------------------
const static char AT_OKss[] PROGMEM = "OK";
const static char AT_Busy[] PROGMEM = "busy";
const static char AT_Errs[] PROGMEM = "ERROR";
const static char AT_RstB[] PROGMEM = "Ai-Thinker";
const static char AT_Fail[] PROGMEM = "FAIL";
const static char AT_Cnet[] PROGMEM = "CONNECT";
const static char AT_Clsd[] PROGMEM = "CLOSED";
const static char AT_Empt[] PROGMEM = "";
//=========================================================================
String wifiAP = "", wifiIP = "";
//=========================================================================
//#include <SoftwareSerial.h>
//SoftwareSerial wfs(10, 11); // RX, TX
#define wfs Serial2
//=========================================================================
static const long wifiBaud = 115200;//9600;
boolean wifiRun = false, wifiLog = false;
String wifiBack = "";
//=========================================================================
void wifi_Init(boolean lgKey, boolean startAP, boolean joinAP) {
//-------------------------------------------------------------------------
wfs.begin(wifiBaud); lg(F("WiFi.Serial.start! = ")); lg(wifiBaud); lg();
//-------------------------------------------------------------------------
wifiLog = lgKey;
//-------------------------------------------------------------------------
if (startAP) netStartAP();
if (joinAP) netJoinAP(F("SSID"), F("PASS"));
lgln(wifiAP); lgln(wifiIP);
//-------------------------------------------------------------------------
}
//=========================================================================
void netStartAP() {
//-------------------------------------------------------
wifiRun = wfs_cmd_back(S(AT_Test), S(AT_OKss), S(AT_Empt), 1000); //test
wifiRun = wfs_cmd_back(S(AT_Cmux), S(AT_OKss), S(AT_Empt), 1000); //be 1 LINK MODE
wifiRun = wfs_cmd_back(S(AT_IsJP), S(AT_OKss), S(AT_Empt), 1000); lgln(wifiBack); wifiAP = GetStringAB(wifiBack, F("\""), F("\"\r\n")); //SeeAP
wifiRun = wfs_cmd_back(S(AT_lgIP), S(AT_OKss), S(AT_Empt), 1000); lgln(wifiBack); wifiIP = GetStringAB(wifiBack, F("\""), F("\"\r\n")); //seesIP
//lgln(wifiAP); lgln(wifiIP);
//-------------------------------------------------------
}
void netJoinAP(String n, String p) {
//-------------------------------------------------------------------------
String AT_Join = S(AT_JAPa) + n + S(AT_JAPb) + p + S(AT_JAPc);
//-------------------------------------------------------------------------
wifiRun = wfs_cmd_back(S(AT_Test), S(AT_OKss), S(AT_Empt), 1000 ); //test
wifiRun = wfs_cmd_back(S(AT_Type), S(AT_OKss), S(AT_Empt), 1000 ); //beWiFi
wifiRun = wfs_cmd_back(S(AT_Rest), S(AT_RstB), S(AT_Empt), 5000 ); //reBoot
wifiRun = wfs_cmd_back(S(AT_Cmux), S(AT_OKss), S(AT_Empt), 1000 ); //lgln(s);//?
wifiRun = wfs_cmd_back(AT_Join , S(AT_OKss), S(AT_Empt), 10000); //lgln(s);//joinAP
wifiRun = wfs_cmd_back(S(AT_IsJP), S(AT_OKss), S(AT_Fail), 1000 ); wifiAP = GetStringAB(wifiBack, F("\""), F("\"\r\n")); //SeeAP
wifiRun = wfs_cmd_back(S(AT_lgIP), S(AT_OKss), S(AT_Empt), 1000 ); wifiIP = GetStringAB(wifiBack, F("\""), F("\"\r\n")); //seesIP
//lgln(wifiAP); lgln(wifiIP); //for (;;);
//-------------------------------------------------------------------------
}
//-------------------------------------------------------------------------
String senx = "";
void HttpGetPost(String link, String text, int seconds) {
senx = S(AT_Send) + String(text.length() + String(text.length()).length() ); //lgln(senx);
wifiRun = wfs_cmd_back(link, S(AT_Cnet), S(AT_Errs), 2000 ); //lg(wifiBack); lg('='); lg(wifiRun); lg();
wifiRun = wfs_cmd_back(senx, S(AT_Stat), S(AT_Errs), 2000 ); //lg(wifiBack); lg('='); lg(wifiRun); lg();//if (!wifiRun) return;
wifiRun = wfs_cmd_back(text, S(AT_Clsd), S(AT_Empt), 20000); //lg(wifiBack); lg('='); lg(wifiRun); lg(); //if (!wifiRun) return;
}
//=========================================================================
const static char Link_Baidu[] PROGMEM = {"AT+CIPSTART=\"TCP\",\"www.baidu.com\",80"};
const static char Urls_Baidu[] PROGMEM = {"GET / HTTP/1.0\r\n\r\n"};
void NetLinkTest_Baidu() {
HttpGetPost(S(Link_Baidu), S(Urls_Baidu) , 5); lgln(wifiBack);
}
const static char Link_BkGps[] PROGMEM = {"AT+CIPSTART=\"TCP\",\"www.bbkgps.com\",80"};
const static char Urls_BkGps[] PROGMEM = {"GET http://www.bbkgps.com/t.php HTTP/1.0\r\n\r\n"};
void NetLinkTest_BBKGPS() {
HttpGetPost(S(Link_BkGps), S(Urls_BkGps) , 10); lgln(wifiBack);
}
//=========================================================================
//=========================================================================
typedef struct charCheckSave {
int len = 0, inx = 0;
String str = "";
void init(String s) {
    str = String(s); inx = 0;
    len = s.length();
    //lg("check=");lg(len); lg();
}
boolean check(char c) {
    //lg("="); lg(c); lg("="); lg(inx); lg();
    if (len == 0) return false;
    if (inx == len - 1) {
      inx = 0; return true;
    }
    if (str == c) inx++; else inx = 0;
    return false;
}
} charCheckSave;
//=========================================================================
charCheckSave ck1, ck2, ck3, ck4, ck5;
//=========================================================================
void wfs_serial_clear() {
while (wfs.available() > 0) {
    char c = wfs.read();
    if (wifiLog) lg(c);
}
}
boolean wfs_cmd_send(String comStr) {
wfs_serial_clear(); wfs.print(comStr); //lg(comStr);
smartDelay(1);
return true;
}
boolean wfs_cmd_backAB(String comStr, String strOK, String strNO, long timeout) { //
//-------------------------------------------------------
boolean save = false; char c; unsigned long start = millis(); wifiBack = "";
ck1.init(strOK);
ck2.init(strNO);
ck3.init(S(AT_Errs));
ck4.init(S(AT_Busy));
ck5.init(S(AT_Clsd));
//------------------------------------------------------
wfs_serial_clear(); wfs.println(comStr);
//-------------------------------------------------------
while (millis() - start < timeout) {
    //-------------------------------------------------------
    while (wfs.available() > 0) {
      //-----------------------------------
      c = wfs.read();
      if (c == '\0') continue;
      if (wifiLog) lg(c);
      //-----------------------------------
      if (save) wifiBack += c;
      if (ck1.check(c)) save = true;
      if (ck2.check(c)) save = false;
      //-----------------------------------
      //if (ck3.check(c)) return true;
      //if (ck4.check(c)) return false;
      if (ck5.check(c)) return false;
      //-----------------------------------
    }
    //-------------------------------------------------------
}
//-------------------------------------------------------
return false;
//-------------------------------------------------------
}
boolean wfs_cmd_back(String comStr, String strOK, String strNO, long timeout) { //
//-------------------------------------------------------
char c; unsigned long start = millis(); wifiBack = "";
ck1.init(strOK);
ck2.init(strNO);
ck3.init(S(AT_Errs));
ck4.init(S(AT_Busy));
//------------------------------------------------------
wfs_serial_clear(); wfs.println(comStr);
//-------------------------------------------------------
while (millis() - start < timeout) {
    //-------------------------------------------------------
    while (wfs.available() > 0) {
      //-----------------------------------
      c = wfs.read();
      if (c == '\0') continue;
      if (wifiLog) lg(c);
      //-----------------------------------
      wifiBack += c;
      //-----------------------------------
      if (ck1.check(c)) return true;
      if (ck2.check(c)) return false;
      if (ck3.check(c)) return false;
      if (ck4.check(c)) return false;
      //-----------------------------------
    }
    //-------------------------------------------------------
}
//-------------------------------------------------------
return false;
//-------------------------------------------------------
}
//=========================================================================


B6_Lewei.ino

//-------------------------------------------------------------------------
const static char Lewei_Link[] PROGMEM = {"AT+CIPSTART=\"TCP\",\"www.lewei50.com\",80"};
const static char Lewei_Head[] PROGMEM = {"POST http://www.lewei50.com/api/V1/gateway/UpdateSensors/02 HTTP/1.1\r\n"};
const static char Lewei_Usek[] PROGMEM = {"userkey: yourkey-xxxxxxxxxxxxx\r\n"};
const static char Lewei_Host[] PROGMEM = {"Host: www.lewei50.com\r\n"};
const static char Lewei_LenA[] PROGMEM = {"Content-Length: "};
const static char Lewei_LenB[] PROGMEM = {"\r\n"};
const static char Lewei_Type[] PROGMEM = {"Content-Type: application/x-www-form-urlencoded\r\n"};
const static char Lewei_Clos[] PROGMEM = {"Connection: close\r\n"};
//-------------------------------------------------------------------
const static char Lewei_JsnA[] PROGMEM = {"{\"Name\":\""};
const static char Lewei_JsnB[] PROGMEM = {"\",\"Value\":\""};
const static char Lewei_JsnC[] PROGMEM = {"\"}"};
//-------------------------------------------------------------------
const static char Lewei_Line[] PROGMEM = {"\r\n"};
//static char Lewei_Date[] = "Date:";
//static char Lewei_Gmts[] = "GMT";
//-------------------------------------------------------------------------
static String Lewei_Data = "";
String Lewei_Time = "";
int Lewei_Loop_N = 0;
//-------------------------------------------------------------------------
String Lewei_Build() {
String s = "";
s += Lewei_Json("WD", String(Si_Temperature)) + ',';
s += Lewei_Json("SD", String(Si_Humidity)) + ',';
s += Lewei_Json("JQ", String(fHCHO)) + ',';
s += Lewei_Json("PM", String(g.cf25));
s = "[" + s + "]"; //lgln(s);
return s;
}
String Lewei_Json(String nameStr, String valueStr) {
return S(Lewei_JsnA) + nameStr + S(Lewei_JsnB) + valueStr + S(Lewei_JsnC);
}
void Lewei_Loop() {
//-------------------------------------------------------------------------------
Lewei_Data = Lewei_Build();
int dn = Lewei_Data.length();
int tn = L(Lewei_Head) + L(Lewei_Usek) + L(Lewei_Host)
         + L(Lewei_LenA) + String(dn).length() + L(Lewei_LenB)
         + L(Lewei_Clos) + L(Lewei_Line)
         + Lewei_Data.length() + L(Lewei_Line) + L(Lewei_Line);
tn=tn-2;
senx = S(AT_Send) + String( tn + String(tn).length() );
String sendStr = "";
sendStr += S(Lewei_Head) + S(Lewei_Usek) + S(Lewei_Host);
sendStr += S(Lewei_LenA) + String(dn) + S(Lewei_LenB);
sendStr += S(Lewei_Clos) + S(Lewei_Line);
sendStr += Lewei_Data + S(Lewei_Line) + S(Lewei_Line);
//-------------------------------------------------------------------------------
wifiRun = wfs_cmd_back(S(Lewei_Link), S(AT_Cnet), S(AT_Errs), 2000 );
wifiRun = wfs_cmd_back(senx,          S(AT_Stat), S(AT_Errs), 2000 );
wifiRun = wfs_cmd_backAB(sendStr, "Date: ", "GMT", 5000); wfs_serial_clear();
//-------------------------------------------------------------------------------
lgln(wifiBack); Lewei_Time = GetStringAB(wifiBack,"2016","GMT");Lewei_Loop_N++;
//-------------------------------------------------------------------------------
}
//=============================================================================================


B7_5110.ino

#include "PCD8544.h"
static PCD8544 lcd;//PCD8544(clock,data-in,data select,reset,enable);
//52,50,48,46,44
//SC,RST,DC,DN,CLK
void LCD5110_setup() {
lgln(F("LCD5110_setup..."));
lcd=PCD8544(44,46,48,50,52);//(clock,data-in,data select,reset,enable);
lcd.begin(84, 48);
lcd.setContrast(48);
lcd.setCursor(0, 0);
LCD_Show_BOBOKing();
}
void LCD_Show_BOBOKing() {
lcd.clear();
lcd.setCursor(0, 0); lcd.print(F("BOBOKing.COM"));
lcd.setCursor(0, 2); lcd.print(F(" Temperature..."));
lcd.setCursor(0, 3); lcd.print(F(" Humidity..."));
lcd.setCursor(0, 4); lcd.print(F(" PM2.5 info..."));
lcd.setCursor(0, 5); lcd.print(F(" HCHOinfo..."));
delay(5000);
lcd.clear();
}
void LCD5110_loop() {
static int counter = 0;

lcd.setCursor(0, 0);
lcd.print("Hello, World!");

lcd.setCursor(0, 1);
lcd.print(counter, DEC);
lcd.write(' ');
lcd.write(0);

delay(200);
counter++;
}


B9_Work.ino

//=====================================================
void Work_Loop() {
if ( ts_loop(60) ) Lewei_Loop();
if ( ts_loop(1)) {
    LCD_Show_All(); //LG_Show_All();
}
if ( ts_loop(5)) {
    HCHO_Ask(); Si7021_read();
}
}
//=====================================================
void LCD_Show_All() {
//lcd.clear();
lcd.setCursor(0, 0);//lcd.print("T=");
lcd.print(Si_Temperature); lcd.print(F("C")); lcd.print(Si_Humidity); lcd.print(F("%"));
lcd.setCursor(0, 1); lcd.print(F("pm10 ")); lcd.print(g.cf10); lcd.print(F(" ug/m3\t"));
lcd.setCursor(0, 2); lcd.print(F("pm25 ")); lcd.print(g.cf25); lcd.print(F(" ug/m3\t"));
lcd.setCursor(0, 3); lcd.print(F("pm1X ")); lcd.print(g.cf1X); lcd.print(F(" ug/m3\t"));
lcd.setCursor(0, 4); lcd.print(F("HCHO ")); lcd.print(fHCHO); lcd.print(" "); lcd.print(fHCHOavr);
lcd.setCursor(0, 5); lcd.print(Lewei_Loop_N); lcd.print(Lewei_Time); //lcd.clearLine(); lcd.print(F(" "));
}
void LG_Show_All() {
lg(Si_Temperature); lg(F("C")); lg(Si_Humidity); lg(F("%"));
lg(F(" ")); lg(F("pm10 ")); lg(g.cf10); lg(F(" ug/m3\t"));
lg(F(" ")); lg(F("pm25 ")); lg(g.cf25); lg(F(" ug/m3\t"));
lg(F(" ")); lg(F("pm1X ")); lg(g.cf1X); lg(F(" ug/m3\t"));
lg(F(" ")); lg(F("HCHO ")); lg(fHCHO); lg(" "); lg(fHCHOavr);
lg(F(" ")); lg(Lewei_Loop_N); lg(Lewei_Time); lg();
}
//=====================================================

Cupid 发表于 2016-4-13 07:05:17

是不是有点大了

wetnt 发表于 2016-4-13 10:12:18

Cupid 发表于 2016-4-13 07:05 static/image/common/back.gif
是不是有点大了

是有点大了,Arduino MEGA 2560本身板子就不小!想找一款小的,某宝上样式很少!而且也比较贵了,没有流行起来。



xlz5186 发表于 2016-4-13 21:31:08

简单啊.........

匿名者 发表于 2016-5-1 17:36:31

楼主你好,就是我想获取甲醛传感器的返回数据,和你的传感器是一样的,攀藤的,但是写了之后获取不到返回值,available里面一直为0,while都进不去,板子是uno的板子,恳请楼主赐教是什么地方出了问题,下面是代码,谢谢!


#include <SoftwareSerial.h>
SoftwareSerial gas(6, 7); //RX,TX
const unsigned char HCHOAskData = {0x42, 0x4D, 0x01, 0x00, 0x00, 0x00, 0x90};
char c = 0;

void setup()
{
    Serial.begin(9600);
    gas.begin(9600);
}

void loop()
{
    char buf;
    int i = 0;
    gas.write(HCHOAskData, 7);
    gas.listen();
    while (gas.available() > 0)
    {
      c = char(gas.read());
      buf = c;
      delay(10);
      if (i == 9)
      {
       Serial.println(buf);
       Serial.println(buf);
       Serial.println(buf);
       Serial.println(buf);
      i = 0;
      c = 0;
      }
      i++;
    }
}

wetnt 发表于 2016-5-3 12:15:49

匿名者 发表于 2016-5-1 17:36 static/image/common/back.gif
楼主你好,就是我想获取甲醛传感器的返回数据,和你的传感器是一样的,攀藤的,但是写了之后获取不到返回值 ...

是不是RX/TX反了,交换下试试!

wetnt 发表于 2016-5-3 12:16:14

匿名者 发表于 2016-5-1 17:36 static/image/common/back.gif
楼主你好,就是我想获取甲醛传感器的返回数据,和你的传感器是一样的,攀藤的,但是写了之后获取不到返回值 ...

是不是RX/TX反了,交换下试试!

匿名者 发表于 2016-5-19 12:42:33

楼主,你这个esp8266和甲醛传感器是单独供电还是用板子上的电源呢》?若单独供电能否发一个接线图呢?新手求教!谢谢

wetnt 发表于 2016-5-19 13:20:38

匿名者 发表于 2016-5-19 12:42 static/image/common/back.gif
楼主,你这个esp8266和甲醛传感器是单独供电还是用板子上的电源呢》?若单独供电能否发一个接线图呢?新手求 ...

攀藤HCHO、G5需要5v电源,而ESP8266、si7021需要3.3v电源,所以增加了一片降压模块。

freemanxp 发表于 2016-5-25 20:53:51

楼主咨询一下,攀藤G5的RXD和TXD都是3.3v电平的,和mega连接不需要电平转换吗?

wetnt 发表于 2016-5-26 13:15:53

freemanxp 发表于 2016-5-25 20:53 static/image/common/back.gif
楼主咨询一下,攀藤G5的RXD和TXD都是3.3v电平的,和mega连接不需要电平转换吗?

我没有转换,目前工作正常!

freemanxp 发表于 2016-5-26 20:12:38

wetnt 发表于 2016-5-26 13:15 static/image/common/back.gif
我没有转换,目前工作正常!

好的,感谢回复!

匿名者 发表于 2016-5-27 08:57:20

问一下楼主这一行 iHCHO = HCHObuf * 256 + HCHObuf;   为什么那块要*256呢?

1066570234 发表于 2016-7-22 13:17:05

您好,我用STM32,照你的写,攀藤数为0 啊
//′®¿ú4oˉêy
#ifEN_UART4_RX   
void UART4_IRQHandler(void)
{
u8 RxCount = 0;
u8 state = 0;
       
        if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)//êÇ·ñ2úéúÖD¶Ï
        {       
               
               USART_ClearITPendingBit(UART4,USART_IT_RXNE); //Çå3yÖD¶Ï±êÖ¾
               temp=USART_ReceiveData(UART4);      //½óêÕêy¾Y
               if(temp == 0x42) {state = 1;}
               if(temp == 0x4D&&state ==1){state = 2;RxCount = 0;}
               Rx4Buffer = temp;
               RxCount++;
               if(RxCount >31)
                       {    PM1_0 = (Rx4Buffer<<8)+(Rx4Buffer);//1.0
                                                PM2_5 = (Rx4Buffer<<8)+(Rx4Buffer);//2.5
                                                PM10 = (Rx4Buffer<<8)+(Rx4Buffer);   //10
                       
                                                um0_3Count = (Rx4Buffer<<8)+(Rx4Buffer); //
                                                um0_5Count = (Rx4Buffer<<8)+(Rx4Buffer);
                                                um1_0Count = (Rx4Buffer<<8)+(Rx4Buffer);
                                                um2_5Count = (Rx4Buffer<<8)+(Rx4Buffer);
                                                um5_0Count = (Rx4Buffer<<8)+(Rx4Buffer);
                                        um10Count= (Rx4Buffer<<8)+(Rx4Buffer);
                               
                       }

               
               
               
                       
                        }
页: [1] 2
查看完整版本: DIY空气质量检测仪 — PM2.5 HCHO 8266 si7021,主控Mega2560