基于ESP8266的联网温度监测点
- 起源
- 是啥玩意
- 耗材
- 电路
- 程序
- esp8266部分
- 网站PHP程序
- 接收程序
- 查看程序
- 使用方法
起源
闲的慌,想找点事情做
监测详细的温度可以作为其他自动化控制的数据基础,检测统计的数据能够反应小环境的温度背景成熟的工业产品价格也不贵,就是闲的荒
是啥玩意
通过8266采集温度传感器的温度数据,上传到服务器。访问网站即可查询相关数据。
耗材
- ESP8266*1 ,访问互联网和采集信息的终端;
- 温度传感器*1,BMP280或DHT11都可以,主要是传感器就行,看想传递什么数据;
- 有域名的服务器*1,如果不想用域名访问,没有域名也可以;
wifewifi环境- 面包板*1,比较方便改电路;
- 导线若干;
电路
传感器 | ESP8266 |
DHT11_PIN | D7 |
BMP_SCK | D1 |
BMP_MISO | D6 |
BMP_MOSI | D2 |
BMP_CS | D5 |
VCC | VCC |
GND | GND |
程序
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”即可查询到数据