极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 44909|回复: 16

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

[复制链接]
发表于 2016-4-12 16:37:49 | 显示全部楼层 |阅读模式
本帖最后由 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的天线,实在是不好看!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2016-4-12 16:38:24 | 显示全部楼层
本帖最后由 wetnt 于 2016-4-13 17:22 编辑

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

G5_HCHO_Wifi_Lewei_6_5110_ok.ino
[pre lang="arduino" line="1" file="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);
}
//=====================================================
[/code]

B0_Basic.ino
[pre lang="arduino" line="1" file="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;
}
[/code]

B0_Log.ino
[pre lang="arduino" line="1" file="B0_Log.ino"]
//===================================================================
#define  lgs  Serial
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);
  }
  //----------------------------------------------------------
}
[/code]

B0_Millis.ino
[pre lang="arduino" line="1" file="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;
}
//===============================================
[/code]

B0_PROGMEM.ino
[pre lang="arduino" line="1" file="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[len];
//  for (int k = 0; k < len; k++) {
//    myBuffer[k] = (char)pgm_read_byte_near(x + k);
//  }
//  return myBuffer;
//}
int L(const char x[]) {
  return strlen_P(x);
}
//---------------------------------------------------------------------------------------------
[/code]

B0_String.ino
[pre lang="arduino" line="1" file="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);
}[/code]

B1_Serial1.ino
[pre lang="arduino" line="1" file="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);
  }
}
//===================================================================
[/code]

B1_Serial3.ino
[pre lang="arduino" line="1" file="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);
  }
}
//===================================================================
[/code]

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

B3_HCHO.ino
[pre lang="arduino" line="1" file="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[7] = {0x42, 0x4D, 0x01, 0x00, 0x00, 0x00, 0x90};
//气体名称
String numName;
const static char numNameInx[][5] = {//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[][6] = {"", "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[10];
int HCHOinx = 0;
void HCHOCheck(byte c) {
  if (HCHOinx == 9) GetHCHO();
  if (HCHOinx == 9) ShowHCHO();
  if (c == 0x42) HCHOinx = 0;
  HCHObuf[HCHOinx] = c;
  HCHOinx++;
}
void GetHCHO() {
  //---------------------------------------
  numName = numNameInx[HCHObuf[3]];
  numUnit = numUnitInx[HCHObuf[4]];
  numKeys = numKeysInx[HCHObuf[5]];
  //---------------------------------------
  iHCHO = HCHObuf[6] * 256 + HCHObuf[7];
  fHCHO = iHCHO / numKeys;
  //---------------------------------------
  fHCHOnum++;
  fHCHOall += fHCHO;
  fHCHOavr = fHCHOall / fHCHOnum;
  //---------------------------------------
}
//------------------------------------------------
[/code]

B4_SI7021.ino
[pre lang="arduino" line="1" file="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();
}
[/code]

B5_WiFi.ino
[pre lang="arduino" line="1" file="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[inx] == 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;
  //-------------------------------------------------------
}
//=========================================================================
[/code]

B6_Lewei.ino
[pre lang="arduino" line="1" file="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++;
  //-------------------------------------------------------------------------------
}
//=============================================================================================
[/code]

B7_5110.ino
[pre lang="arduino" line="1" file="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(" HCHO  info..."));
  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++;
}
[/code]

B9_Work.ino
[pre lang="arduino" line="1" file="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();
}
//=====================================================
[/code]
回复 支持 反对

使用道具 举报

发表于 2016-4-13 07:05:17 | 显示全部楼层
是不是有点大了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-13 10:12:18 | 显示全部楼层
Cupid 发表于 2016-4-13 07:05
是不是有点大了

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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 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[7] = {0x42, 0x4D, 0x01, 0x00, 0x00, 0x00, 0x90};
char c = 0;

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

void loop()
{
    char buf[10];
    int i = 0;
    gas.write(HCHOAskData, 7);
    gas.listen();
    while (gas.available() > 0)  
    {
        c = char(gas.read());
        buf[i] = c;
        delay(10);
        if (i == 9)
        {
       Serial.println(buf[0]);
       Serial.println(buf[1]);
       Serial.println(buf[2]);
       Serial.println(buf[3]);
        i = 0;
        c = 0;
        }
        i++;
    }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-3 12:15:49 | 显示全部楼层
匿名者 发表于 2016-5-1 17:36
楼主你好,就是我想获取甲醛传感器的返回数据,和你的传感器是一样的,攀藤的,但是写了之后获取不到返回值 ...

是不是RX/TX反了,交换下试试!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-3 12:16:14 | 显示全部楼层
匿名者 发表于 2016-5-1 17:36
楼主你好,就是我想获取甲醛传感器的返回数据,和你的传感器是一样的,攀藤的,但是写了之后获取不到返回值 ...

是不是RX/TX反了,交换下试试!
回复 支持 反对

使用道具 举报

发表于 2016-5-19 12:42:33 | 显示全部楼层
楼主,你这个esp8266和甲醛传感器是单独供电还是用板子上的电源呢》?若单独供电能否发一个接线图呢?新手求教!谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-19 13:20:38 | 显示全部楼层
匿名者 发表于 2016-5-19 12:42
楼主,你这个esp8266和甲醛传感器是单独供电还是用板子上的电源呢》?若单独供电能否发一个接线图呢?新手求 ...

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

使用道具 举报

发表于 2016-5-25 20:53:51 | 显示全部楼层
楼主咨询一下,攀藤G5的RXD和TXD都是3.3v电平的,和mega连接不需要电平转换吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-26 13:15:53 | 显示全部楼层
freemanxp 发表于 2016-5-25 20:53
楼主咨询一下,攀藤G5的RXD和TXD都是3.3v电平的,和mega连接不需要电平转换吗?

我没有转换,目前工作正常!
回复 支持 反对

使用道具 举报

发表于 2016-5-26 20:12:38 | 显示全部楼层
wetnt 发表于 2016-5-26 13:15
我没有转换,目前工作正常!

好的,感谢回复!
回复 支持 反对

使用道具 举报

发表于 2016-5-27 08:57:20 | 显示全部楼层
问一下楼主这一行 iHCHO = HCHObuf[6] * 256 + HCHObuf[7];   为什么那块要*256呢?
回复 支持 反对

使用道具 举报

发表于 2016-7-22 13:17:05 | 显示全部楼层
您好,我用STM32,照你的写,攀藤数为0 啊
//′&#174;&#191;ú4oˉêy
#if  EN_UART4_RX   
void UART4_IRQHandler(void)
{
u8 RxCount = 0;
u8 state = 0;
       
        if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)//ê&#199;·&#241;2úéú&#214;D&#182;&#207;
        {       
               
                 USART_ClearITPendingBit(UART4,USART_IT_RXNE); //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;
                 temp=USART_ReceiveData(UART4);      //&#189;óê&#213;êy&#190;Y
                 if(temp == 0x42) {state = 1;}
                 if(temp == 0x4D&&state ==1){state = 2;RxCount = 0;}
                 Rx4Buffer[RxCount] = temp;
                 RxCount++;
                 if(RxCount >31)
                         {    PM1_0 = (Rx4Buffer[10]<<8)+(Rx4Buffer[11]);  //1.0
                                                PM2_5 = (Rx4Buffer[12]<<8)+(Rx4Buffer[13]);  //2.5
                                                PM10 = (Rx4Buffer[14]<<8)+(Rx4Buffer[15]);   //10
                       
                                                um0_3Count = (Rx4Buffer[16]<<8)+(Rx4Buffer[17]); //
                                                um0_5Count = (Rx4Buffer[18]<<8)+(Rx4Buffer[19]);
                                                um1_0Count = (Rx4Buffer[20]<<8)+(Rx4Buffer[21]);
                                                um2_5Count = (Rx4Buffer[22]<<8)+(Rx4Buffer[23]);
                                                um5_0Count = (Rx4Buffer[24]<<8)+(Rx4Buffer[25]);
                                          um10Count  = (Rx4Buffer[26]<<8)+(Rx4Buffer[27]);
                                 
                         }

               
               
               
                       
                        }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 09:50 , Processed in 0.043959 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表