极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 95027|回复: 52

看看我新出炉的 — 甲醛测试仪+ESP8266+LeWei

[复制链接]
发表于 2015-11-27 16:37:57 | 显示全部楼层 |阅读模式
本帖最后由 wetnt 于 2018-1-22 14:35 编辑

“新出炉”,呵呵其实早就做好了,只是一直没有时间把它拍照发上来,现在终于有点点空,发出来和大家讨论讨论了。

一、主要功能:
读取甲醛传感器数值,显示实时数据和平均数据,并发布到“乐为物联”上。

二、主要配件:
1、Arduino Nano
2、攀藤科技 甲醛传感器 HCHO
3、LCD 1602
4、ESP8266
5、DHT11
6、AMS1117-3.3电源模块3个脚
7、洞洞板
8、电池盒
9、网线芯若干

三、物联网数据地址:
http://www.lewei50.com/u/g/7598

四、制作细节



整体外观。



整体外观。



从左到右,依次是:AMS1117-3.3电源模块3个脚、ESP8266、DHT11、攀藤科技 甲醛传感器 HCHO。



采用了立体结构,1602下面是arduino nano,攀藤科技 甲醛传感器 HCHO 针脚是2.0间距的,只好手工线转接了,很难看。



背面是电池盒,设备是双供电的,电池可以供电,USB也可以供电。



所有模块都采用了插座插接,焊接工作量很大。



空间有限,DHT11测温放在了ESP8266下面,温度经常不准。不过DHT11的精度,也就呵呵了。

ESP8266供电需要800mA以上,Arduino Nano的供电不足,只好外挂了了 AMS1117-3.3电源模块 供电。



Arduino Nano的插座,采用了标准40Pin宽座,为了降低高度,排针高度截掉一半。



电路板背面,采用了网线芯走线,还是比较乱。



上传到网络上,这“跌宕起伏”“动人心魄”的数据……

五、代码

h_1602_wifi_ok_new.ino
[pre lang="arduino" line="1" file="h_1602_wifi_ok_new.ino"]
//-------------------------------------------------------------------------
#include <SoftwareSerial.h>
//-------------------------------------------------------------------------
SoftwareSerial gas(10, 11); // RX, TX
static const long GasBaud = 9600;
//-------------------------------------------------------------------------
SoftwareSerial wfs(9, 8); // RX, TX
static const long WfsBaud = 9600;
//-------------------------------------------------------------------------
#define  lgs  Serial
static const long LGSBaud = 9600;
//-------------------------------------------------------------------------
void setup() {
  lgs.begin(LGSBaud); lg(F("Log.Serial.start! = ")); lg(LGSBaud); lgln(F(""));
  gas.begin(GasBaud); lg(F("Gas.Serial.start! = ")); lg(GasBaud); lgln(F(""));
  wfs.begin(WfsBaud); lg(F("Wfs.Serial.start! = ")); lg(WfsBaud); lgln(F(""));
  LCD1602_setup();
  LCD1602_Show(0, 0, F("SYS.Start!"));
  //netJoinAP(F("xxxx"),F("12345678"));
  DHT_setup();
  netStart();
}
int n = 0;
void loop() {
  //-------------------------------
  DHT_loop();
  AskHCHO();  smartDelayG(500);
  //-------------------------------
  LCD1602_Clear();  LcdHCHO();
  LCD1602_loop_test();
  //-------------------------------
  n++;
  if (n > 50) {
    n = 0;
    Lewei_Loop();
  }
  smartDelayW(500);
  //-------------------------------
}
void gasLoop() {
  //-------------------------------
  gas.listen();
  while (gas.available()) {
    char c = gas.read();
    HCHOCheck(c);
  }
  //-------------------------------
}
void wfsLoop() {
  //-------------------------------
  wfs.listen();
  while (wfs.available()) {
    char c = wfs.read();
    lgs.write(c);
  }
  //-------------------------------
}
void lgsLoop() {
  //-------------------------------
  while (lgs.available()) {
    char c = lgs.read();
  }
  //-------------------------------
}
static void smartDelayW(unsigned long ms)
{
  unsigned long start = millis(); do {
    //------------------------------------------
    wfsLoop();
    lgsLoop();
    //------------------------------------------
  } while (millis() - start < ms);
}
static void smartDelayG(unsigned long ms)
{
  unsigned long start = millis(); do {
    //------------------------------------------
    gasLoop();
    lgsLoop();
    //------------------------------------------
  } while (millis() - start < ms);
}
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
[/code]

BBK0DHT11.ino
[pre lang="arduino" line="1" file="BBK0DHT11.ino"]
#include "DHT.h"
#define DHTPIN 7     // what pin we're connected to

#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);

int dhtH, dhtT, dhtF;
//float dhtHa = 0.0f;
//int dhtHv = 0, dhtHn = 0;
void DHT_setup() {
  dht.begin();
}

void DHT_loop() {
  dhtH = dht.readHumidity();
  dhtT = dht.readTemperature();
  dhtF = dht.readTemperature(true);
  //  dhtHn++;
  //  if (dhtHn > 20) {
  //    dhtHn = 0;
  //    dhtHv = 0;
  //    dhtHa = 0.0f;
  //  }
  //  dhtHa += dhtH;
  //  dhtHv = dhtHa / dhtHn;
  //lg("T:" + String(dhtH) + "C ");//714字节
  //lg(F("T:")); lg(dhtHv); lg(F("C "));
  lg(F("T:")); lg(dhtH); lg(F("C "));//708字节
}
[/code]

BBK0LCD1602.ino
[pre lang="arduino" line="1" file="BBK0LCD1602.ino"]
//===============================================
#include <LiquidCrystal.h>
//LiquidCrystal lcd(RS,RW,EN,D4,5,6,7);
LiquidCrystal lcd(13, A5, A4, A3, A2, A1, A0);

void LCD1602_setup() {
  lcd.begin(16, 2);//columns and rows
  lcd.print(F("LCD1602_setup_OK!"));
}
void LCD1602_Clear() {
  lcd.clear();
}

void LCD1602_Show(int x, int y, String t) {
  lcd.setCursor(x, y);
  lcd.print(t);
}
void LCD1602_loop_test() {
  lcd.setCursor(0, 1);
  lcd.print(millis() / 1000);
}
//===============================================
//PIN1  GND 接0V
//PIN2  VCC 接4.8V-5V
//PIN3  V0  对地接电阻470-2K
//PIN4  RS RS=0,指令寄存器;RS=1,数据寄存器
//PIN5  R/W R/W=0,写;R/W=1,读
//PIN6  E  允许信号
//PIN7  D0 数据0
//PIN8  D1 数据1
//PIN9  D2 数据2
//PIN10 D3 数据3
//PIN11 D4 数据4
//PIN12 D5 数据5
//PIN13 D6 数据6
//PIN14 D7 数据7
//PIN15 LED+ 背光正极,接4.8V - 5V
//PIN16 LED- 背光负极,接0V
//LiquidCrystal(rs,rw,enable,d0,d1,d2,d3);
//===============================================
[/code]

BBK0PTKJ.ino
[pre lang="arduino" line="1" file="BBK0PTKJ.ino"]
//------------------------------------------------
int iHCHO = 0;
float fHCHO = 0.0f;
float fHCHOnum = 0.0f;
float fHCHOall = 0.0f;
float fHCHOavr = 0.0f;
//------------------------------------------------
//查询命令
const unsigned char HCHOAskData[7] = {0x42, 0x4D, 0x01, 0x00, 0x00, 0x00, 0x90};
//气体名称
String numName;
const 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 char numUnitInx[][5] = {"", "ppm", "VOL", "LEL", "Ppb", "MgM3"};
//数据当量
float numKeys = 1;
const float numKeysInx[] = {1, 1, 10, 100, 1000};
//------------------------------------------------
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) );
}
//------------------------------------------------
void AskHCHO()
{ //42 4d 01 00 00 00 90
  gas.write(HCHOAskData, 7);
  //Serial.print(data,HEX)
}
//------------------------------------------------
char HCHObuf[10];
int HCHOinx = 0;
void HCHOCheck(char 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]

BBK0WiFi8266.ino
[pre lang="arduino" line="1" file="BBK0WiFi8266.ino"]
//=========================================================================
//https://www.zybuluo.com/kfihihc/note/31135
//http://wiki.iteadstudio.com/ESP8266_Serial_WIFI_Module
//=========================================================================
void netStart() {
  //  lgln(F("netStart"));
  //  wfs.println("AT"); wfsLoop();   smartDelayW(1000);//AtT
  //  wfs.println(F("AT+CWJAP?"));    smartDelayW(1000);//SeeAP
  //  wfs.println(F("AT+CIFSR"));     smartDelayW(1000);//seesIP
  //  wfs.println(F("AT+CWMODE=1"));  smartDelayW(1000);//beWiFi
}
void netJoinAP(String s, String p) {
  wfs.println(F("AT+CWMODE=1"));  smartDelayW(1000);//beWiFi
  wfs.println(F("AT+RST"));       smartDelayW(5000);//reBoot
  wfs.println("AT+CWJAP=\"" + s + "\",\"" + p + "\""); smartDelayW(10000);
  wfs.println(F("AT+CWJAP?"));    smartDelayW(1000);//SeeAP
  wfs.println(F("AT+CIFSR"));     smartDelayW(1000);//seesIP
}
//-------------------------------------------------------------------------
void HttpGetPost(String link, String text, int seconds) {
  wfs.println(link);
  smartDelayW(2000);
  wfs.println( "AT+CIPSEND=" + String(text.length() + 2) );
  smartDelayW(1000);
  wfs.println(text);
  smartDelayW(seconds * 1000);
}
//-------------------------------------------------------------------------
void NetLinkTestBaidu() {
  HttpGetPost(F("AT+CIPSTART=\"TCP\",\"www.baidu.com\",80"), F("GET / HTTP/1.0\r\n\r\n") , 5); smartDelayW(1000);
}
//-------------------------------------------------------------------------
[/code]

BBK2Lewei.ino
[pre lang="arduino" line="1" file="BBK2Lewei.ino"]
void Lewei_Loop() {
  //-----------------------------------------------------------------------------------
  String x =
    String(F("[")) +
    String(F("{\"Name\":\"WD\",\"Value\":\"")) + String(dhtH) + String(F("\"}")) +
    String(F(",")) +
    String(F("{\"Name\":\"JQ\",\"Value\":\"")) + String(fHCHO) + String(F("\"}")) +
    String(F("]")) +
    String(F("\r\n"));
  lg(x);
  //-----------------------------------------------------------------------------------
  HttpGetPost(
    String(F("AT+CIPSTART=\"TCP\",\"www.lewei50.com\",80")),
    String(F("POST http://www.lewei50.com/api/V1/gateway/UpdateSensors/02 HTTP/1.1\r\n")) +
    String(F("userkey: --------------------------------------------------------\r\n")) +
    String(F("Host: www.lewei50.com\r\n")) +
    String(F("Content-Length: 58\r\n")) +
    String(F("\r\n")) + x + String(F("\r\n")),
    //-----------------------------------------------------------------------------------
    5
  );
}

[/code]

z_LogShow.ino
[pre lang="arduino" line="1" file="z_LogShow.ino"]

void lg(String str) {
  lgs.print(str);
}
void lg(int s) {
  lgs.print(s);
}
void lgln(int s) {
  lgs.print(s);
  lgs.println("");
}
void lg(float s) {
  lgs.print(s);
}
void lg(long s) {
  lgs.print(s);
}
void lgln(String str) {
  lg(str);
  lgs.println("");
}

void lgchar(char s) {
  lgs.print(s);
}

[/code]


应朋友要求,上传全部工程文件!


dianzi741朋友画的电路图,大家参考

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2018-1-21 16:00:12 | 显示全部楼层
本帖最后由 dianzi741 于 2018-1-21 16:03 编辑

引脚是按照程序里面连得,楼主看一下是否正确  ,  但楼主用的dht的库不一样   有好几个报错   我改了一下   不知道能不能成功。

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

发表于 2015-11-27 21:48:48 | 显示全部楼层
美女,请收下我的膝盖
回复 支持 反对

使用道具 举报

发表于 2015-11-28 08:37:08 | 显示全部楼层
感叹楼主的强大,和自己的渺小。
回复 支持 反对

使用道具 举报

发表于 2015-11-28 22:34:07 | 显示全部楼层
楼主  我的esp8266一直连不上无线路由器  ,求教程
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-30 14:21:21 | 显示全部楼层
Mr.m涛 发表于 2015-11-28 22:34
楼主  我的esp8266一直连不上无线路由器  ,求教程

8266先用PC串口调试助手,调通了再接单片机。。
回复 支持 反对

使用道具 举报

发表于 2015-12-1 21:29:35 | 显示全部楼层
楼主牛逼  嘎嘎嘎嘎
回复 支持 反对

使用道具 举报

发表于 2015-12-2 18:24:00 | 显示全部楼层
楼主 我的8266用USB转TTL 连接完全可以  还可以连接WiFi   但是一转到UNO上就不行了 为什么啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-3 20:56:14 | 显示全部楼层
mmmmmmmg丶 发表于 2015-12-2 18:24
楼主 我的8266用USB转TTL 连接完全可以  还可以连接WiFi   但是一转到UNO上就不行了 为什么啊

使用虚拟串口的么?串口不要用虚拟串口
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-7 12:32:56 | 显示全部楼层
mmmmmmmg丶 发表于 2015-12-2 18:24
楼主 我的8266用USB转TTL 连接完全可以  还可以连接WiFi   但是一转到UNO上就不行了 为什么啊

另外考虑供电问题,8266电流大,质量差的UNO供电不足!
回复 支持 反对

使用道具 举报

发表于 2016-1-18 12:09:41 | 显示全部楼层
有没有反向控制成功的案例?
回复 支持 反对

使用道具 举报

发表于 2016-1-18 13:58:26 | 显示全部楼层
sunym2011 发表于 2016-1-18 12:09
有没有反向控制成功的案例?

啥叫反向控制,是用测试仪控制继电器开关之类的设备吗?
回复 支持 反对

使用道具 举报

发表于 2016-1-18 19:42:26 | 显示全部楼层
flying03 发表于 2016-1-18 13:58
啥叫反向控制,是用测试仪控制继电器开关之类的设备吗?

通过乐联网上的控制指令控制继电器开关之类的
回复 支持 反对

使用道具 举报

发表于 2016-1-22 13:30:00 | 显示全部楼层
本帖最后由 flying03 于 2016-1-22 15:10 编辑

请教楼主,我参考你的代码做了一个,发现有这个问题,ESP8266工作过程中很容易掉链子,一旦出错,接下来就没办法再上传成功了,只有人工重启模块,有没有办法在程序中检测模块返回值,并根据返回值判断是否出错,如果出错就发送AT+RST给模块让他重启。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-25 16:50:52 | 显示全部楼层
flying03 发表于 2016-1-22 13:30
请教楼主,我参考你的代码做了一个,发现有这个问题,ESP8266工作过程中很容易掉链子,一旦出错,接下来就没 ...

恩,可以加入 看门狗 的程序,状态异常了就让它重启!不过我的经验是,如果状态不对了,重启命令也不起作用,必须断电重启。
回复 支持 反对

使用道具 举报

发表于 2016-2-25 19:26:07 | 显示全部楼层
flying03 发表于 2016-1-22 13:30
请教楼主,我参考你的代码做了一个,发现有这个问题,ESP8266工作过程中很容易掉链子,一旦出错,接下来就没 ...

esp8266其实很稳定,供电一定要保证,3.3v最大240mA,所以最好能够提供300mA的供电。我去年8月份用在工业设备上采集数据,目前工作很稳定。
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 23:14 , Processed in 0.048080 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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