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-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 static/image/common/back.gif
是不是有点大了
是有点大了,Arduino MEGA 2560本身板子就不小!想找一款小的,某宝上样式很少!而且也比较贵了,没有流行起来。
简单啊......... 楼主你好,就是我想获取甲醛传感器的返回数据,和你的传感器是一样的,攀藤的,但是写了之后获取不到返回值,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++;
}
} 匿名者 发表于 2016-5-1 17:36 static/image/common/back.gif
楼主你好,就是我想获取甲醛传感器的返回数据,和你的传感器是一样的,攀藤的,但是写了之后获取不到返回值 ...
是不是RX/TX反了,交换下试试! 匿名者 发表于 2016-5-1 17:36 static/image/common/back.gif
楼主你好,就是我想获取甲醛传感器的返回数据,和你的传感器是一样的,攀藤的,但是写了之后获取不到返回值 ...
是不是RX/TX反了,交换下试试! 楼主,你这个esp8266和甲醛传感器是单独供电还是用板子上的电源呢》?若单独供电能否发一个接线图呢?新手求教!谢谢 匿名者 发表于 2016-5-19 12:42 static/image/common/back.gif
楼主,你这个esp8266和甲醛传感器是单独供电还是用板子上的电源呢》?若单独供电能否发一个接线图呢?新手求 ...
攀藤HCHO、G5需要5v电源,而ESP8266、si7021需要3.3v电源,所以增加了一片降压模块。 楼主咨询一下,攀藤G5的RXD和TXD都是3.3v电平的,和mega连接不需要电平转换吗? freemanxp 发表于 2016-5-25 20:53 static/image/common/back.gif
楼主咨询一下,攀藤G5的RXD和TXD都是3.3v电平的,和mega连接不需要电平转换吗?
我没有转换,目前工作正常! wetnt 发表于 2016-5-26 13:15 static/image/common/back.gif
我没有转换,目前工作正常!
好的,感谢回复! 问一下楼主这一行 iHCHO = HCHObuf * 256 + HCHObuf; 为什么那块要*256呢? 您好,我用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