ESP8266(ESP-01S )+DHT22,自制纯内网运行的温湿度传感器,数据直接上传本地服务器

因公司业务和医疗器械生产有关,最近公司有一些新的需求,要在仓库、机房、某些温湿度敏感的区域布置些东西,用于快速地把环境温湿度上传回服务器,用于记录、药监部门检查、超标报警等。


网上找了一些,也实际使用了,但是有一些缺点,比如:

1,设备里需要插物联网4G卡,自动上传数据到厂家平台,提供接口给我们的系统定时同步数据回来(忘记什么厂家的设备了,不符合需求)

2,设备厂家不提供接口,通过WIFI自动上传数据到厂家平台,提供公众号查询数据,顺便提供个超标微信消息报警(绿刻度的设备,更加不符合需求)

3,设备使用阿里或者其它物联网平台的服务,通过接口访问数据 (忘记什么厂家的设备了,也不符合需求)


上面3种情况的缺点:

1,要经过第三方系统才能传输到我们系统,时效性和使用复杂性不合适

2,我们的系统是内部系统,非特别必要,一般不给联网

3,厂家强关联,每个厂家都不一样,全厂只能买同样的设备,接口都不一样,甚至没有接口可以使用


大概是以上这些原因,使得不得不考虑自己做一些来使用,经过测试,使用ESP8266+DHT22 (ESP-01S+DHT22)的方案比较好,没有选择DHT11,是因为DHT22精度比较高


制作思路:

1,服务端做一个接收数据的站点,通过GET方式接收数据,存到数据库

2,编写程序,写入ESP-01S,把ESP-01S插入DHT22

3,通电,使用 ESP-TOUCH手机APP给板子配网,使其连接WIFI,获取板子的IP地址

4,用同WIFI下的电脑访问这个IP,配置接收数据的链接

5,板子读取DHT22上的温湿度数据,通过配置的链接自动上传,搞定


文章底部有代码和APP提供


板子是上淘宝买的,是已经做好可以直接对接的现成口,直接往里面编程就可以使用,样子如下图:

image.png

image.png

image.png


固件烧录器:

image.png

可以在这里用淘宝扫码下单:

image.png


我在两个店铺买过,上面那个确认可用,但是比较贵,另外有一个店铺叫做“深圳唯诚电子”,它卖的比较便宜,但是买回来用不了,客服也不怎么理人(过了一周都没理),会浪费钱

如果你在其它店铺买,要注意两块板子是不是都能上电,能上电才能用

483b369c792db213c17dec2d6db8452.jpg

d4bcc9ad2198ecdc6daeed9ae10d0a5.jpg


经过实际使用,发现一个大问题,像下图这样的设计,ESP板子运行发出的热量会影响传感器的准确度,温度结果会偏差2-3度,湿度会下降几十

image.png


最后把上面白色的盖子翻出来去除,把传感器露出来,变成下面这样的,不让ESP运行产生的热量影响到传感器,就准了:

image.png

image.png


最终效果:

image.png


下面是程序部分


下载Arduino IDE:https://www.arduino.cc/en/software

打开页面,选一个合适自己电脑的版本,在这个页面如果看不懂这些英文,那就点一下浏览器的翻译功能吧

image.png


打开Arduino IDE,选择“文件”-“首选项”,在“附加开发板管理器网址”里粘贴这个链接:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

image.png


选择“项目”-“加载库”-“管理库”,输入“DHT”,找到下面这两个,安装:

image.png


选择“工具”-“开发板”-“开发板管理器”,输入“esp8266”,请务必选择 2.7.4 版本,安装:

image.png


选择“工具”-“开发板”-“Generic ESP8266 Module”

image.png


ESP-01S板子插入固件烧录器,烧录器插入电脑USB,电脑会出来一个新的COM口,编号随机,按以下步骤可以选择

image.png


点击左上角的“上传”把程序编译烧录进ESP-01S,等到编译上传完成之后,拿出ESP-01S,插入DHT22

image.png


APP下载:

esptouch-v2.0.0.apk


服务端使用PHP写的一个简单示例,用的是PHP的TP框架,控制器文件:

image.png


模型文件:

image.png


在使用方法的第四步,配置接收数据的链接,配置后,程序会在链接后面拼接以下字符串:

?mac_addr=MAC地址&temp=温度&humi=湿度

例:
接口地址配置为:http://www.qinyuanyang.com/public/index.php/index/Esp01s/saveTemp
则最终会生成类似链接自动提交: http://www.qinyuanyang.com/public/index.php/index/Esp01s/saveTemp?mac_addr=0c54159da95d&temp=28.5&humi=68.5

后台接收到数据后,可以使用MAC地址做为设备序列号,提前登记在后台,用一判断是哪个区域的数据


主要控制器方法代码:

public function saveTemp()
{
	if(empty($_REQUEST['mac_addr']) || empty($_REQUEST['temp']) || empty($_REQUEST['humi']))
	{
		return json($this->err(1));
	}
	$data = [
		'mac_addr' => $_REQUEST['mac_addr'],
		'temperature' => $_REQUEST['temp'],
		'humidity' => $_REQUEST['humi'],
		'date_time' => date("Y-m-d H:i:s")
	];
	$temp = new TempHumiData();
	$temp->insert($data);
}


模型代码:

class TempHumiData extends Model
{
}


数据库结构:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `esp_temp_humi_data`;
CREATE TABLE `esp_temp_humi_data`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `mac_addr` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '设备MAC地址',
  `date_time` datetime(0) NOT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '时间',
  `temperature` decimal(6, 2) NOT NULL DEFAULT 0.00 COMMENT '温度',
  `humidity` decimal(6, 2) NOT NULL DEFAULT 0.00 COMMENT '湿度',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Compact;

SET FOREIGN_KEY_CHECKS = 1;

image.png


ESP-01S板子的代码:

注意:

1,以下代码是一个示例代码,与下方视频中的操作不一致,但是是可以使用

2,编译程序前先修改你的网络WIFI名字和密码

3,编译与上传完成后,使用IDE自带的终端可以看到ESP获得的IP地址

4,使用浏览器访问这个IP地址,可以看到读取的数据

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
#define DHTTYPE DHT22
#define DHTPIN  2

const char* ssid     = "WIFI名字";  //编译程序前先修改你的网络
const char* password = "WIFI密码";

ESP8266WebServer server(80);

DHT dht(DHTPIN, DHTTYPE, 11); 
 
float humidity, temp_f;  
String webString="";     
unsigned long previousMillis = 0;   
const long interval = 2000;       
 
void handle_root() {
  server.send(200, "text/plain", "读取温度,请在地址拦IP地址后加: /temp ,读取湿度,请在地址拦IP地址后加: /humidity");
  delay(100);
}
 
void setup(void)
{
  Serial.begin(115200);  
  dht.begin();           

  // Connect to WiFi network
  WiFi.begin(ssid, password);
  Serial.print("\n\r \n\rWorking to connect");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("DHT Weather Reading Server");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
   
  server.on("/", handle_root);
  
  server.on("/temp", [](){  
    gettemperature();      
    webString="Temperature: "+String((int)temp_f)+" F";   
    server.send(200, "text/plain", webString);  
  });

  server.on("/humidity", [](){ 
    gettemperature();       
    webString="Humidity: "+String((int)humidity)+"%";
    server.send(200, "text/plain", webString);            
  });
  
  server.begin();
  Serial.println("HTTP server started");
}
 
void loop(void)
{
  server.handleClient();
} 

void gettemperature() {
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;   

    humidity = dht.readHumidity();          
    temp_f = dht.readTemperature(true);    
    if (isnan(humidity) || isnan(temp_f)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }
  }
}


与视频中一致的代码,可以直接线上正式使用:

SEND_DHT.zip


后面的操作,看视频吧,懒得截图了:



实际在线上系统中的使用结果(点击可看大图):

image.png


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

桂ICP备19000498号-3