
ESP32-nano 底座 多功能温湿度传感器
简介
这是一个esp32-nano底座,(内附代码)组装后成为一个多功能的温湿度传感器,实时显示折线图,温湿度异常报警
简介:这是一个esp32-nano底座,(内附代码)组装后成为一个多功能的温湿度传感器,实时显示折线图,温湿度异常报警开源协议
:GPL 3.0
描述
这就是一个连接DHT11温湿度传感器和一个4P OLED显示屏的esp32-nano底座,技术含量不高,焊接也非常简单,一个贴片电阻,一个贴片电容,连接时注意对准方向。
连接引脚:OLED SDA:io26
OLED SCL:io27
DHT11:io25
以下是arduino 1.8.19 简单显示温湿度的代码
最新版可以显示温湿度折线,更直观观察温湿度
这里我参考网上数据将体感温度划分为"ice" "very cold" "cold" "a little cold" "comfortable" "best"等共11个等级(详见代码)
自动计算体感温度,进行评价,体感温度过高或过低时会自动报警,即板载22号引脚的led闪烁
幸好学过C艹
这我只是做了一个最简单的实例,如果再连接空调或加湿器,就可以组成一个自动温湿度控制系统
使用前需安装相应库文件
9/19 代码更新
#include "SSD1306.h"
SSD1306 display(0x3c, 26, 27);//SDA SCL//13 15
#include
#include
#include
#define DHTPIN 25
#define DHTTYPE DHT11
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
int Tline[55] = {0};
int Hline[55] = {0};
int led = 22;
bool ledmode = 1, count = 1;
void setup() {
display.setFont(ArialMT_Plain_10);
for(int i = 0; i <= 45; ++i){
display.init();
display.drawString(i, 25, "BY");
display.drawString(110 - i, 25, "CY");//开场动画可以换名字
display.display();
delay(10);
}
Serial.begin(115200);
dht.begin();
pinMode(led, OUTPUT);
Serial.println("Modified Temperature, Humidity Serial Monitor Example");
sensor_t sensor;
dht.temperature().getSensor(&sensor);
dht.humidity().getSensor(&sensor);
delayMS = 1000;
}
void loop() {
// put your main code here, to run repeatedly:
delay(delayMS);
sensors_event_t event;
dht.temperature().getEvent(&event);
int warn = 0;
char T[10];
float Te;
dtostrf(event.temperature,3,1,T);
if (isnan(event.temperature)) {
Serial.println("Error reading temperature!");
}
else {
Te = event.temperature;
}
dht.humidity().getEvent(&event);
char H[10];
dtostrf(event.relative_humidity,3,1,H);
if (isnan(event.relative_humidity)) {
Serial.println("Error reading humidity!");
}
else {
float Hu = event.relative_humidity;
//float Fa = 1.8 * Te + 32;
//float comfort = Fa - (0.55 - 0.55 * Hu) * (Fa - 58);
float comfort = (1.1818 * Te + 18.18) * (0.88 + 0.002 * Hu) + (Te - 32) / (45 - Te) + 17.4;
char COMFORT[10];
Serial.println(comfort);
dtostrf(comfort,3,1,COMFORT);
int showx = 50;
display.init();
if(comfort < 0){ //舒适度评价
display.drawString(showx, 10, "ice");
warn = 2;
}
else if(comfort < 25){
display.drawString(showx, 10, "very cold");
warn = 2;
}
else if(comfort < 38){
display.drawString(showx, 10, "cold");
warn = 1;
}
else if(comfort < 50){
display.drawString(showx, 10, "a little cold");
warn = 1;
}
else if(comfort < 58){
display.drawString(showx, 10, "comfortable");
warn = 0;
}
else if(comfort < 70){
display.drawString(showx, 10, "best");
warn = 0;
}
else if(comfort < 75){
display.drawString(showx, 10, "comfortable");
warn = 0;
}
else if(comfort < 79){
display.drawString(showx, 10, "a little hot");
warn = 1;
}
else if(comfort < 84){
display.drawString(showx, 10, "hot");
warn = 1;
}
else if(comfort < 88){
display.drawString(showx, 10, "very hot");
warn = 2;
}
else{
display.drawString(showx, 10, "torridity");
warn = 2;
}
//Very uncomfortable 18
//uncomfortable 13
display.drawString(0, 0, "T: C comfort:");
display.drawString(0, 10, "H: %"); //x,y
display.drawString(12, 0, T);
display.drawString(12, 10, H);
display.drawString(90, 0, COMFORT);
//开始绘制折线
display.drawLine(5, 23, 5, 63);//T坐标轴
display.drawString(3, 20, "^");
display.drawLine(5, 63, 55, 63);
display.drawString(56, 55, "T");
display.drawLine(68, 23, 68, 63);//H坐标轴
display.drawString(66, 20, "^");
display.drawLine(68, 63, 118, 63);
display.drawString(119, 55, "H");
Te = (int)(Te);
Hu = (int)(Hu);
Serial.println(Te);
Serial.println(Hu);
for(int i = 1; i <= 50; ++i){//T折线(笨方法)
Tline[i - 1] = Tline[i];
}
Tline[50] = Te;
for(int i = 1; i < 50; ++i){
display.drawLine(i + 4, 103 - Tline[i] * 2, i + 5, 103 - Tline[i + 1] * 2);
}
for(int i = 1; i <= 50; ++i){//H折线
Hline[i - 1] = Hline[i];
}
Hline[50] = Hu;
for(int i = 1; i < 50; ++i){
display.drawLine(i + 67, 63 - (Hline[i] / 2.5), i + 68, 63 - (Hline[i + 1] / 2.5));
}
if(warn == 1){ //舒适度报警
display.drawString(120, 10, "!");
if(count){
ledmode = !ledmode;
digitalWrite(led, ledmode);
count = 0;
}
else{
count = 1;
}
}
else if(warn == 2){
display.drawString(120, 10, "!!");
ledmode = !ledmode;
digitalWrite(led, ledmode);
}
else{
ledmode = 1;
digitalWrite(led, ledmode);
}
display.display();
}
}
初代代码(仅有显示温湿度功能)
#include "SSD1306.h"
SSD1306 display(0x3c, 26, 27);//SDA SCL//13 15
//
#include
#include
#include
#define DHTPIN 25 // Pin which is connected to the DHT sensor.
#define DHTTYPE DHT11
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
void setup() {
display.setFont(ArialMT_Plain_24);
for(int i = 0; i <= 30; ++i){
display.init();//清屏
//display.setFont(ArialMT_Plain_24);
display.drawString(i, 18, "BY");
display.drawString(100 - i, 18, "CY");
display.display();//刷新
delay(10);
}
// put your setup code here, to run once:
Serial.begin(115200);
dht.begin();
Serial.println("Modified Temperature, Humidity Serial Monitor Example");
sensor_t sensor;
dht.temperature().getSensor(&sensor);
dht.humidity().getSensor(&sensor);
//delayMS = sensor.min_delay / 1000;
delayMS = 1000;
}
void loop() {
// put your main code here, to run repeatedly:
delay(delayMS);
sensors_event_t event;
dht.temperature().getEvent(&event);
char T[10];
dtostrf(event.temperature,3,1,T);
if (isnan(event.temperature)) {
Serial.println("Error reading temperature!");
}
else {
}
dht.humidity().getEvent(&event);
char H[10];
dtostrf(event.relative_humidity,3,1,H);
if (isnan(event.relative_humidity)) {
Serial.println("Error reading humidity!");
}
else {
display.init();//清屏
//display.setFont(ArialMT_Plain_24);
display.drawString(0, 30, "H:");
display.drawString(35, 30, H);
display.drawString(95, 30, "%");
display.drawString(0, 0, "T:");
display.drawString(35, 0, T);
display.drawString(95, 0, "C");
display.display();//刷新
display.display();//刷新
}
}
设计图
BOM
ID | Name | Designator | Footprint | Quantity |
---|---|---|---|---|
1 | 100nF | C5 | C0603 | 1 |
2 | 0.96OLED_4P_MODULE_JX | OLED1 | 0.96OLED_4P | 1 |
3 | 5.1kΩ | R7 | R0805 | 1 |
4 | KH-2.54FH-1X13P-H8.5 | U1,U2 | HDR-TH_13P-P2.54-V-F | 2 |
5 | DHT11 | U4 | SENSOR-TH_DHT11 | 1 |

评论