ESP32/ESP8266实现多点测温系统,手机端(网页)查看实时温度
目录
一、前言
二、工具
三、原理
四、代码实现
1、esp8266的使用
2、ds18b20的使用
前提:
3、oled屏使用
4、光敏传感器使用
五、网页使用
六、总结
效果演示
esp8266物联网测试
一、前言
基于物联网课设设计的小项目,可供参考。
本项目使用ESP8266作为主控器实现一个简单的测温系统,主要功能有:测量环境温度并在屏幕上显示,实现昼夜更换减少耗能,超过温度会报警。
数据是基于MQTT协议通信的,作者想编写一个MQTT协议的APP,但是难度过大,并且没接触过android studio,所以用一个可以接受MQTT的网站来实现数据收集。
二、工具
arduino ide
esp32(esp8266)单片机
ds18b20温度传感器
OLED显示屏
光敏传感器
物联网网站
三、原理
esp8266读取ds18b20数据并发布到指定话题,读取光敏传感器的状态来检测昼夜变换来实现系统的关闭与开启(白天关闭 False/0 夜晚开启 True/1),并在oled上显示温度和状态,并且可以在网页端查看数据和状态。
四、代码实现
1、esp8266的使用
作者使用的是arduino ide进行代码上传的,相关代码可以看博主前几篇文章
学习使用Arduino IDE驱动ESP8266/32单片机进行wifi通信-CSDN博客文章浏览阅读685次,点赞18次,收藏12次。官网下载arduino ide准备一个esp8266单片机或esp32。通过arduino 进行esp8266的驱动和wifi通信。https://blog.csdn.net/2301_76165902/article/details/146050322?fromshare=blogdetail&sharetype=blogdetail&sharerId=146050322&sharerefer=PC&sharesource=2301_76165902&sharefrom=from_link对于wifi和MQTT通信的基本操作都有写。
2、ds18b20的使用
前提:
安装库「OneWire」
头文件为
#include <OneWire.h>
网上好多教程都安装了「DallasTemperature」库或者ds18b20集成库,作者安装后在最新版arduino上编译不通过,只有OneWire原始库来驱动传感器才能编译通过,作者不知道原因,可能使编译器版本太新导致的,如果有解决办法欢迎评论区讨论。
作者使根据示例 DS18x20_Temperature 文件去修改的
float DS18B20()
{
byte i;
byte type_s = 0;
byte data[9];
byte addr[8];
float celsius;
while( !ds.search(addr));
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(100); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(" ");
}
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
Serial.print(" Temperature = ");
Serial.println(celsius);
return celsius;
}
返回值为温度(摄氏度)
如果有不懂的地方可以去示例中查看。
3、oled屏使用
头文件为
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
去管理库里安装相应的依赖
参数设置
const int I2C_ADDR = 0x3c; // oled屏幕的I2c地址
#define SDA_PIN 4 // SDA引脚,默认gpio4(D2)
#define SCL_PIN 5 // SCL引脚,默认gpio5(D1)
Adafruit_SSD1306 oled(128, 64, &Wire,-1);
初始化
oled.begin(SSD1306_SWITCHCAPVCC,0x3C);
oled.setTextColor(WHITE);//开像素点发光
oled.clearDisplay();//清屏
显示文字
oled.setTextSize(1); //设置字体大小
oled.setCursor(35, 5);//设置显示位置
oled.println("-jiezz-");
oled.display(); // 开显示
在回调函数里显示温度
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
oled.setCursor(15+i*12, 30);//设置显示位置
oled.println((char)payload[i]);
oled.display(); // 开显示
}
这里的位置如果不懂就去网上查一查不同尺寸显示屏的参数,长和宽。
4、光敏传感器使用
光敏电阻通过光强来改变带电阻改变输出电压。
上面有四个引脚VCC,GND,AO(模拟输出),DO(数字输出),只用DO即可,会在光强时输出0,光弱时输出1,阈值可以通过电位器去调节。
简单的用一个引脚去读取即可
pinMode(D3,INPUT);
Serial.println(digitalRead(D3));
可是充当系统的状态量
这些传感器都驱动好了,之后就是整合完成通信即可。
如果需要完整代码可以私信博主,这里就不占篇幅了。
五、网页使用
(公测)KZone喵星球 - 探索AI与编程的乐趣
添加三个话题
/esp8266/wendu 存放温度
/esp8266/state 存放状态
/esp8266/msg 存放信息
在可视化面板添加温度测量
右侧绑定话题
添加一个状态灯,绑定state话题
再添加一个输入框,可以和oled进行交互显示
到这里就能完成系统的基本功能了
六、总结
对于云平台可以用阿里云或者腾讯云这些包装好的服务器,会提供app或者小程序使用,可视化效果更好,如果有需要可以试一试,本项目只是娱乐,无任何用途。
如果有问题请评论区指正。