ESP32-CAM ArduinoIDE开发系列文章目录
第一篇:ESP32-CAM高性价比WIFI图传方案快速入门教程 第二篇:ESP32-CAM第一个无线点灯程序 第三篇:ESP32-CAM智能网关的设计与实现 第四篇:ESP32-CAM创建热点构成并发式DNS服务器 第五篇:ESP32-CAM高性价比温湿度监控系统
前言
????daodanjishui物联网核心原创技术之ESP32 Arduino IDE开发之嵌入式网页服务器架设、http请求收发与解析、单片机IO口读写操作、AJAX技术、并发服务器技术、DNS技术和传感器DHT11整合组成:ESP32-CAM高性价比温湿度监控系统。
一、ESP32-CAM高性价比温湿度监控系统是什么?
????daodanjishui在上一篇的项目:ESP32-CAM创建热点构成并发式DNS服务器详细介绍了嵌入式服务器局域网DNS的应用,当时的服务器主页只能查询ESP32-CAM板载LED 灯的状态和控制LED灯的打开和关闭,但是没有查询环境参数功能,没有真正体现出物联网技术的精髓,也是上一篇不足的地方。 ????daodanjishui在这一篇的项目中,保留上一篇的功能之外,将加入DHT11温湿度传感器模块,并且加入传感器驱动程序,这个模块只有一个数据接口data,所以只占用ESP32-CAM的一个GPIO14,所以很容易将上一期的项目改造成一个温湿度监控系统。系统的功能就是在表单的窗口中输入:data 再点击cmd按钮提交命令,ESP32服务器就会查询温湿度数据返回到服务器主页,用户就可以查询到环境参数,显示在反馈信息那里,对上一篇功能不清楚的买家可以去看看上一篇(第四篇)的介绍。硬件效果如下图所示:
程序运行效果如下所示(红色字体就是传感器采集回来的数据): DHT11的驱动程序当时是在网上随便找一个驱动程序实现采集数据功能的,测试的效果不是很好,测几次才得一次数据,其实差不多就可以了,要准确就要好好修改驱动程序,后面找到一个靠谱一点的DHT驱动程序,在这里分享一下,一些常用的库可以在:http://www.taichi-maker.com/homepage/download/#library-download 免费下载得到。
二、软件开发过程
1.引入库dht11.h和dht11.cpp
dht11.h代码如下:
#ifndef dht11_h
#define dht11_h
#if defined(ARDUINO) && (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
#define DHT11LIB_VERSION "0.4.1"
#define DHTLIB_OK 0
#define DHTLIB_ERROR_CHECKSUM -1
#define DHTLIB_ERROR_TIMEOUT -2
class dht11
{
public:
int read(int pin);
int humidity;
int temperature;
};
#endif
dht11.c代码如下:
#include "dht11.h"
int dht11::read(int pin)
{
uint8_t bits[5];
uint8_t cnt = 7;
uint8_t idx = 0;
for (int i=0; i< 5; i++) bits[i] = 0;
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(18);
digitalWrite(pin, HIGH);
delayMicroseconds(40);
pinMode(pin, INPUT);
unsigned int loopCnt = 10000;
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
loopCnt = 10000;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
for (int i=0; i<40; i++)
{
loopCnt = 10000;
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
unsigned long t = micros();
loopCnt = 10000;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
if ((micros() - t) > 40) bits[idx] |= (1 << cnt);
if (cnt == 0)
{
cnt = 7;
idx++;
}
else cnt--;
}
humidity = bits[0];
temperature = bits[2];
uint8_t sum = bits[0] + bits[2];
if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM;
return DHTLIB_OK;
}
2.读入数据
Arduino传感器驱动代码如下:
double Fahrenheit(double celsius)
{
return 1.8 * celsius + 32;
}
double Kelvin(double celsius)
{
return celsius + 273.15;
}
double dewPoint(double celsius, double humidity)
{
double A0= 373.15/(273.15 + celsius);
double SUM = -7.90298 * (A0-1);
SUM += 5.02808 * log10(A0);
SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
SUM += log10(1013.246);
double VP = pow(10, SUM-3) * humidity;
double T = log(VP/0.61078);
return (241.88 * T) / (17.558-T);
}
double dewPointFast(double celsius, double humidity)
{
double a = 17.271;
double b = 237.7;
double temp = (a * celsius) / (b + celsius) + log(humidity/100);
double Td = (b * temp) / (a - temp);
return Td;
}
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 2
void setup()
{
Serial.begin(9600);
Serial.println("DHT11 TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT11LIB_VERSION);
Serial.println();
}
void loop()
{
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 2);
Serial.print("Temperature (oC): ");
Serial.println((float)DHT11.temperature, 2);
Serial.print("Temperature (oF): ");
Serial.println(Fahrenheit(DHT11.temperature), 2);
Serial.print("Temperature (K): ");
Serial.println(Kelvin(DHT11.temperature), 2);
Serial.print("Dew Point (oC): ");
Serial.println(dewPoint(DHT11.temperature, DHT11.humidity));
Serial.print("Dew PointFast (oC): ");
Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));
delay(2000);
}
3.移植到工程
????在上一篇的工程里面加入这个代码就可以用网页去触发查询环境参数了。
if(!strcmp(value_buf, "data")){
dht11 DHT11;
if (DHTLIB_OK == DHT11.read(14))
{
Serial.print("HUMID = ");
Serial.print(DHT11.humidity);
Serial.println(" %RH");
Serial.print("TMEP = ");
Serial.print(DHT11.temperature);
Serial.println("^C");
String T=DHT11.temperature+"";
String H=DHT11.humidity+"";
return request->send(200, "text/plain", "temperature="+T+" humidity="+H);
}else return request->send(200, "text/plain", "no temperature and humidity");
}
总结
????daodanjishui这一期比上一期的源码多了两个文件,这两个文件就是arduino的dht11库,网上也比较难找,调试过程也出了不少问题,最终实现了温湿度查询的功能,上一期我也说过,这个姐妹篇的代码扩展程度很高,随意提升系统的功能,所以现在把姐妹篇的代码改造一下变成温湿度监控系统,读者想学习怎么拓展系统功能,可以考虑都看看这两套代码的异同点,一般人添加库函数进去肯定会出现不少错误的,不是那么容易成功的,对比过这两套代码,就会添加新的传感器代码进去了,肯定有所收获!!! 代码传送地址:https://www.cirmall.com/circuit/19388/ 点击跳转下载
|