基于ESP8266的联网温度监测点

起源

闲的慌,想找点事情做
监测详细的温度可以作为其他自动化控制的数据基础,检测统计的数据能够反应小环境的温度背景
成熟的工业产品价格也不贵,就是闲的荒

是啥玩意

通过8266采集温度传感器的温度数据,上传到服务器。访问网站即可查询相关数据。

耗材

  1. ESP8266*1 ,访问互联网和采集信息的终端;
  2. 温度传感器*1,BMP280或DHT11都可以,主要是传感器就行,看想传递什么数据;
  3. 有域名的服务器*1,如果不想用域名访问,没有域名也可以;
  4. wife wifi环境
  5. 面包板*1,比较方便改电路;
  6. 导线若干;

电路

传感器ESP8266
DHT11_PIND7
BMP_SCKD1
BMP_MISOD6
BMP_MOSID2
BMP_CSD5
VCCVCC
GNDGND

程序

esp8266部分

Arduino编写ESP8266-NodeMCU

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <DFRobot_DHT11.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
/*文件头*/
#define ssid "ssid"//wifi账号
#define password "密码"//wifi密码
#define url_tou "http:/www.你的域名/数据交互网站名称.php"//php文件地址
#define daihao 1 //系统区分号,与其他同代码数据同步
#define DHT11_PIN D7//定义温湿度传感器引脚
#define BMP_SCK D1//定义气压计时钟引脚SCL
#define BMP_MISO D6//定义气压计数据输出引脚SDD
#define BMP_MOSI D2 //定义气压计数据输入引脚SDA
#define BMP_CS D5//定义气压计片选引脚CSB
/*定义通用常数*/
int yue_day[12]={31,28,31,30,31,30,31,31,30,31,30,31};//定义月份日期
String address ="淄博";//上传地址(HeChengURL中使用)
String mima="123456";//密码(HeChengURL中使用)
int cishu=4;//每小时上传次数,60的因数
long toUpDetaTime,inUpDetaTime;
String url;
/*定义通用变量*/
Adafruit_BMP280 bme(BMP_CS,BMP_MOSI,BMP_MISO,BMP_SCK);
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ntp.ntsc.ac.cn", 28800, 60000);
//(udp,ntp地址,与0时区的时间差{秒},更新间隔{毫秒})
ESP8266WiFiMulti WiFiMulti;
DFRobot_DHT11 DHT;
WiFiClient client;
HTTPClient http;
/*定义函数对象或内容*/
int nianday(int nian)//获取当前年份天数
{
    if(nian%400==0 || (nian%4==0 && nian%100 !=0))
        return 365;
    else
        return 366;
}
String zhuanhuan(long biaoS)//返回标准时间对应日期{如:20220325}
{
  int ri,nian,yue,ri_zong,nianday_1;
  String yeartime;
  nian=1970,yue=1;//基准日期
  ri_zong = biaoS/86400+26;//转天数,去剩余秒数,加政令变更
  nianday_1 = nianday(nian);//获取当前年份天数
  while(ri_zong < 0 || ri_zong >= nianday_1){
      if(ri_zong<0){
          nian--;
          ri_zong+=nianday(nian);
      }
      else{
          nian++;
          ri_zong-=nianday(nian);
      }
  }
  if(nian%400==0 || (nian%4==0 && nian%100 !=0))//如果闰年2月28天
        yue_day[1]=29;
  while(ri_zong>yue_day[yue-1]){
      ri_zong-=yue_day[yue-1];
      yue++;
  }
  ri=ri_zong+1;
  yeartime=(String)nian;
  yeartime.concat("-");
  yeartime.concat((String)yue);
  yeartime.concat("-");
  yeartime.concat((String)ri);
  return (yeartime);
}
String HeChengURL(float temp,float pressure,int hum)//合成信息
{
  String urlNeiBu = url_tou;
  long biaoS,id;
  biaoS=timeClient.getEpochTime();//获取标准秒
  id=(biaoS-1577808000)*10+daihao;//定义id[Unix时间戳-北京时间2020-01-1 00:00:00]
  urlNeiBu.concat("?id=");
  urlNeiBu.concat((String) id);
  urlNeiBu.concat("&address=\"");
  urlNeiBu.concat(address);
  urlNeiBu.concat("\"&yeartime='");
  urlNeiBu.concat(zhuanhuan(biaoS));
  urlNeiBu.concat("'&daytime='");
  urlNeiBu.concat(timeClient.getFormattedTime());
  urlNeiBu.concat("'&temperature=");
  urlNeiBu.concat(String(temp,3));
  urlNeiBu.concat("&pressure=");
  urlNeiBu.concat(String(pressure,3));
  urlNeiBu.concat("&humidity=");
  urlNeiBu.concat((String)hum);
  urlNeiBu.concat("&mima=");
  urlNeiBu.concat(mima);
  return urlNeiBu;
}
void toHTTPdeta(){
  DHT.read(DHT11_PIN);//获取温湿度传感器数据
 url=HeChengURL(bme.readTemperature(),bme.readPressure(),DHT.humidity);
  //合成网站和信息{温度,气压,湿度}
  Serial.println(url);
  if (http.begin(client, url)) //如果成功启动http访问
  {  
    int httpCode = http.GET();//发送HTTP get并获取返回值
    if (httpCode > 0) //如果返回HTTP信息
    {
      Serial.printf("[HTTP] GET... code: %d\n", httpCode);//打印HTTP信息
      if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
      //成功则打印页面信息
        String payload = http.getString();
        Serial.println(payload);
      }
    } 
    else {
      Serial.printf("GET错误:%s\n", http.errorToString(httpCode).c_str());
    }
    http.end();
  } 
  else {
    Serial.printf("连接失败\n");
  }
}
void setup() {
  Serial.begin(115200);//打开串口
  Serial.print("\n");//换行
  Serial.flush();//清空串口栈
  WiFi.mode(WIFI_STA);//设置wifi格式为客服端
  WiFi.begin(ssid,password);//启动wifi
  while(!bme.begin()) {  
    Serial.println("BMP280未启动!");
  }
  while (WiFi.status() != WL_CONNECTED) //重复判定wifi是否成功连接
  {
    delay(500);
    Serial.print(".");
  }
  timeClient.begin();//启动标准时间获取程序
  while(timeClient.getEpochTime()<1577808000){
    timeClient.update();//清除错误数据
    delay (1000);
  }
  toUpDetaTime=60/cishu-timeClient.getMinutes()%(60/cishu);
  inUpDetaTime=millis();
}
void loop() {
  if((millis()-inUpDetaTime)>=(toUpDetaTime*60*1000)){
    timeClient.update();
    toUpDetaTime=60/cishu-timeClient.getMinutes()%(60/cishu);
    inUpDetaTime=millis();
    toHTTPdeta();
  }
  delay(1000);
}

网站PHP程序

本人网站基础架构是利用宝塔搭建网站的CentOS 7

PHP 5.6

接收程序

网站要有sql数据库

<!doctype html>
<?php
    //设置中文编码格式
    header('content-type:text/html;charset=utf-8');
    //接收用户提交过来的数据
    $addressyuan = $_GET['address'];
	$yeartime = $_GET['yeartime'];
	$daytime = $_GET['daytime'];
	$temperature = $_GET['temperature'];
	$pressure = $_GET['pressure'];
	$humidity = $_GET['humidity'];
	$mima = $_GET['mima'];
	$id = $_GET['id'];    
	$address=stripslashes($addressyuan);
	echo($address);
	$con=mysqli_connect("localhost","数据库账户名","数据库密码","数据表名"); 
	if (mysqli_connect_errno($con)) 
	{ 
		echo "连接 MySQL 失败: " . mysqli_connect_error(); 
	} 
	if ($mima!="123456"){
		echo($mima);
		echo("\n");
		echo($humidity+$temperature);
		echo("密码错误");
	}
	else{
		$sql    = "insert into huanjingtongjibiao(id,address,yeartime,daytime,temperature,pressure,humidity) values ($id,$address,$yeartime,$daytime,$temperature,$pressure,$humidity)";  // SQL 语句
        $result = mysqli_query($con, $sql);
		echo($result);// 从结果集中获取所有数据
        mysqli_close($con);
	}
?>
<html>
<head>
<meta charset="utf-8">
<title>内容交互</title>
</head>
<body>
</body>
</html>

查看程序

<!doctype html>
<?php
    //设置中文编码格式
    header('content-type:text/html;charset=utf-8');
	$con=mysqli_connect("localhost","数据库账户名","数据库密码","数据表名"); 
	if (mysqli_connect_errno($con)) 
	{ 
		echo "连接 MySQL 失败: " . mysqli_connect_error(); 
	} 
	$sql    = "select address,yeartime,daytime,temperature,pressure,humidity from huanjingtongjibiao order by id desc";  // SQL 语句
?>
<html>
<head>
<meta charset="utf-8">
<title>环境状态</title>
</head>
<body style="text-align:center;display:block;">
	<table style="text-align: center;margin-right:auto;float:inherit;display:block;" border="1">
		<tr >
				<th>地址</th>
				<th>时间</th>
				<th>温度</th>
				<th>压强</th>
				<th>湿度</th>
			</tr>
	<?php
	//echo($result);// 从结果集中打印所有数据
	$retval = mysqli_query($con, $sql);	//执行
				//不加判断会报错
	if (!$retval) {
		printf("Error: %s\n", mysqli_error($con));
		 exit();
	}
	//返回记录数
	$row_length = mysqli_num_rows($retval);
				//循环遍历出数据表中的数据
	for ($i=0; $i<$row_length; $i++) {
					//从结果集中取得一行作为关联数组
	$row = mysqli_fetch_assoc($retval);
	$address = $row['address'];
	$yeartime = $row['yeartime'];
	$daytime = $row['daytime'];
	$temperature = $row['temperature'];
	$pressure = $row['pressure'];
	$humidity = $row['humidity'];
	echo '<tr ><td>'.$address.'</td><td>'.$yeartime.' '.$daytime.'</td><td>'.$temperature.'</td><td>'.$pressure.'</td><td>'.$humidity.'</td></tr>';
	};	
	mysqli_close($con);
	?>
	<a href="index.html">返回主页</a>
</body>
</html>

使用方法

连接烧录好硬件和软件后 撤点开寄
一段时间过后访问"www.域名/路径/查询程序名.php”或者"ip/路径/查询程序名.php”即可查询到数据

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值