起源
闲的慌,想找点事情做
监测详细的温度可以作为其他自动化控制的数据基础,检测统计的数据能够反应小环境的温度背景
成熟的工业产品价格也不贵,就是闲的荒
是啥玩意
通过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”即可查询到数据