空调助手
材料准备
- ESP32-WROOM-32E
- DHT11温湿度传感器
- SGP40 VOC传感器
- LCD-SPI
- 还有一台安装了Arduino IDE并搭建好ESP32开发环境的电脑
库文件下载
- ArduinoJson

- DHT11

- U8g2

- U8glib

- DFRobot_SGP40 这个需要到官网下载库
硬件连接
DHT11需要5V供电
SGP40需要5V供电
OLED需要3.3V供电
MCU引脚 | OLED |
D13 | SCL |
D12 | SDA |
D27 | RES |
D26 | DC |
D25 | CS |
软件烧写
需要在代码中填写心知天气的私钥来获取天气信息和Wifi账户密码来联网,详情请看代码
#include <DHT11.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <DFRobot_SGP40.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
DFRobot_SGP40 mySGP40;//Declare SGP40.
U8G2_SSD1327_ZJY_128X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 12, /* cs=*/ 25, /* dc=*/ 26, /* reset=*/ 27);
DHT11 dht11(2);
// bilibili api: follower
String UID = "356383684";
String followerUrl = "https://api.bilibili.com/x/relation/stat?vmid=" + UID; // 粉丝数
String seniverse_1 = "https://api.seniverse.com/v3/weather/daily.json?key=( )&location=nanjing&language=zh-Hans&unit=c&start=-1&days=2";//请在括号处添加心知天气的私钥
String seniverse_2 = "https://api.seniverse.com/v3/weather/now.json?key=( )&location=nanjing&language=zh-Hans&unit=c";//请在括号处添加心知天气的私钥
int code = 0; // 天气
int temperature = 0; // 温度
int humidity = 0; // 湿度
DynamicJsonDocument doc(1024);
void getdata()
{
HTTPClient http;
http.begin(seniverse_1);
int httpCode = http.GET();
if (httpCode > 0)
{
Serial.printf("HTTP Get Code: %d\r\n", httpCode);
if (httpCode == HTTP_CODE_OK) // 收到正确的内容
{
String resBuff = http.getString();
Serial.println(resBuff);
deserializeJson(doc, resBuff); //开始使用Json解析
humidity = doc["results"][0]["daily"][0]["humidity"];
}
}
else
{
Serial.printf("HTTP Get Error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
http.begin(seniverse_2); //HTTP begin
httpCode = http.GET();
if (httpCode > 0)
{
Serial.printf("HTTP Get Code: %d\r\n", httpCode);
if (httpCode == HTTP_CODE_OK) // 收到正确的内容
{
String resBuff = http.getString();
Serial.println(resBuff);
deserializeJson(doc, resBuff); //开始使用Json解析
code = doc["results"][0]["now"]["code"];
temperature = doc["results"][0]["now"]["temperature"];
}
}
else
{
Serial.printf("HTTP Get Error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}
int temperature_room;
int humidity_room;
void readTemHum()
{
temperature_room = dht11.readTemperature();
humidity_room = dht11.readHumidity();
if (temperature_room != DHT11::ERROR_CHECKSUM && temperature_room != DHT11::ERROR_TIMEOUT && humidity_room != DHT11::ERROR_CHECKSUM && humidity_room != DHT11::ERROR_TIMEOUT)
{
Serial.print("Temperature: ");
Serial.print(temperature_room);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity_room);
Serial.println(" %");
}
else
{
if (temperature_room == DHT11::ERROR_TIMEOUT || temperature_room == DHT11::ERROR_CHECKSUM)
{
Serial.print("Temperature Reading Error: ");
Serial.println(DHT11::getErrorString(temperature_room));
}
if (humidity_room == DHT11::ERROR_TIMEOUT || humidity_room == DHT11::ERROR_CHECKSUM)
{
Serial.print("Humidity Reading Error: ");
Serial.println(DHT11::getErrorString(humidity_room));
}
}
}
void setup()
{
pinMode(12,OUTPUT);
pinMode(14,OUTPUT);
Serial.begin(115200);
WiFi.disconnect(true);
WiFi.begin("( )", "( )");//请在括号处分别添加Wifi账户与Wifi密码
while (WiFi.status() != WL_CONNECTED)
{
delay(300);
Serial.print(".");
}
Serial.println("连接成功");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
u8g2.begin();
u8g2.enableUTF8Print();
Serial.println("DFrobot Gravity SGP40 VOC Sensor Example");
Serial.println(F("Starting " __FILE__ " from " __DATE__ __TIME__));
Serial.println("SGP40 is booting up, sensor readings can be taken after 10 seconds...");
while(mySGP40.begin(/*duration = */10000) !=true){
Serial.println("Failed to initialize SGP40, please check wiring and cable connections");
delay(1000);
}
Serial.println("----------------------------------------------");
Serial.println("SGP40 initialized successfully!");
Serial.println("----------------------------------------------");
}
void loop()
{
uint16_t index = mySGP40.getVoclndex();
Serial.print("vocIndex = ");
Serial.println(index);
getdata();//天气获取
readTemHum();//温湿度获取
u8g2.firstPage();
Serial.println("");
Serial.print(temperature_room);
Serial.println("");
Serial.print(temperature);
Serial.println("");
do{
u8g2.setFont(u8g2_font_wqy14_t_gb2312b);
u8g2.setCursor(0,20);
u8g2.print("南京");
u8g2.setCursor(0,40);
u8g2.print("温度:");
u8g2.setCursor(42,40);
u8g2.print(temperature_room);
u8g2.setCursor(60,40);
u8g2.print("℃");
u8g2.setCursor(0,54);
u8g2.print("湿度:");
u8g2.setCursor(42,54);
u8g2.print(humidity_room);
u8g2.setCursor(60,54);
u8g2.print("%");
u8g2.setCursor(0,68);
u8g2.print("VOC指数:");
u8g2.setCursor(60,68);
u8g2.print(index);
u8g2.setCursor(0,90);
u8g2.print("死亡之翼提醒您");
if(index>400)
{
digitalWrite(12,HIGH);
digitalWrite(14,HIGH);
u8g2.setCursor(0,104);
u8g2.print("要憋四了还不开窗!");
u8g2.setCursor(0,120);
u8g2.print("通风换气");
}
else if(temperature>30&&temperature_room>26&&humidity_room<=68)//热
{
digitalWrite(12,HIGH);
digitalWrite(14,LOW);
u8g2.setCursor(0,104);
u8g2.print("夏天到了,整点西瓜~");
u8g2.setCursor(0,120);
if(temperature<=36)
{
u8g2.print("制冷! 26℃!");
}
else if(temperature<=37)
{
u8g2.print("制冷! 27℃!");
}
else
{
u8g2.print("制冷! 28℃!");
}
}
else if(temperature_room>26&&humidity_room>68)//除热湿,冷湿开制热
{
digitalWrite(12,HIGH);
digitalWrite(14,LOW);
u8g2.setCursor(0,104);
u8g2.print("家里要长蘑菇啦!");
u8g2.setCursor(0,120);
u8g2.print("除湿! 26℃!");
}
else if(humidity_room>68)//除湿
{
digitalWrite(12,HIGH);
digitalWrite(14,HIGH);
u8g2.setCursor(0,104);
u8g2.print("家里是被淹了么!");
u8g2.setCursor(0,120);
u8g2.print("不是除湿就是制热");
}
else if(temperature<10&&temperature_room<14)//冷
{
digitalWrite(12,LOW);
digitalWrite(14,HIGH);
u8g2.setCursor(0,104);
u8g2.print("这屋也太冷了吧!");
u8g2.setCursor(0,120);
u8g2.print("制暖! 20℃!");
}
else if(temperature>10&&temperature<18&&temperature_room>14&&temperature_room<20)
{
digitalWrite(12,LOW);
digitalWrite(14,HIGH);
u8g2.setCursor(0,104);
u8g2.print("天气冷,多穿衣服~");
u8g2.setCursor(0,120);
u8g2.print("=。=来!宝,穿点衣服");
}
else
{
digitalWrite(12,LOW);
digitalWrite(14,LOW);
u8g2.setCursor(0,104);
u8g2.print("真舒服 _(:з」∠)_");
u8g2.setCursor(0,120);
u8g2.print("空调也是需要休息的");
}
u8g2.setFont(u8g2_font_open_iconic_weather_4x_t);
if(code>=0&&code<=3)
{
u8g2.drawGlyph(90,50,0x0045);
}
else if(code>=4&&code<=8)
{
u8g2.drawGlyph(90,50,0x0041);
}
else if(code==9)
{
u8g2.drawGlyph(90,50,0x0040);
}
else if(code>=10&&code<=20)
{
u8g2.drawGlyph(90,50,0x0043);
}
}while(u8g2.nextPage());
}