本文最后更新于83 天前,其中的信息可能已经过时,如有错误请发送邮件到2275012286@qq.com,或者在下方留言。
想了解更多项目请搜索“项目”标签或者访问我的github仓库。
仓库地址:QianmoNai’s Repositories
基于Android Studio和Arduino的ESP32智能小冰箱和配套安卓app制作项目(停止维护)
1. 项目背景
大一时参加校科技节做的,基于ESP32-wroom开发板,使用的是arduino框架,Arduino IDE软件。后面的安卓app开发部分使用了Android Studio软件,Java语言开发。最后也是得到了校二等奖。
2. 项目介绍
部分视频展示:基于esp32的多用温控小冰箱_哔哩哔哩_bilibili
①本体代码部分:
arduino框架代码(点我)
#include <Arduino.h> //基础头文件
#include <WiFi.h> //WiFi相关库
#include <NTPClient.h> //网络相关库
#include <U8g2lib.h> //oied显示相关库
#include <TimeLib.h> // 引入时间库,用于处理时间相关操作
#include <ArduinoJson.h> //JSON 数据解析库
#include <HTTPClient.h> //HTTP 请求发送库
#include <DHT.h> //DHT传感器库
#include <WiFiClient.h>
//需要自己按情况修改的地方
const char* ssid = "***"; // 替换为你的WiFi名称
const char* password = "***"; // 替换为你的WiFi密码
const int serverPort = 5000;
uint8_t sign_in_hour=21,sign_in_minute=30;//设置晚点名时间
uint8_t turn_off_hour=22,turn_off_minute=30;//设置晚熄灯时间
float set_highest_temperature=15.0;//冰箱最高温度
float set_lowest_temperature=10.0;//冰箱最低温度
//天气相关参数(根据自己情况修改)
const String API = "SaAuI-lU7Me2bnYOz";
String WeatherURL = "";
const String CITY = "福州";
String url_xinzhi = "";
long sum = 0;
uint8_t weather_flag=2;
uint8_t fridge_contral_flag=0;
String day1_day_weather;
String day1_night_weather;
String day1_high_temperature;
String day1_low_temperature;
String day1_humidity;
String day1_precip;
String day1_rainfall;
String day1_wind_direction;
String day1_wind_speed;
String day1_wind_scale;
String day2_day_weather;
String day2_night_weather;
String day2_high_temperature;
String day2_low_temperature;
String day2_humidity;
String day2_precip;
String day2_rainfall;
String day2_wind_direction;
String day2_wind_speed;
String day2_wind_scale;
String day3_day_weather;
String day3_night_weather;
String day3_high_temperature;
String day3_low_temperature;
String day3_humidity;
String day3_precip;
String day3_rainfall;
String day3_wind_direction;
String day3_wind_speed;
String day3_wind_scale;
// 根据实际连接的OLED引脚定义SCL和SDA引脚
#define SCL 22
#define SDA 21
#define DHTPIN 2 // 定义DHT11连接的引脚
#define DHTTYPE DHT11 // 使用DHT 11
const int buzzerPin = 23; // 蜂鸣器信号线连接的引线
const int buttonPin = 13; // 按钮中断连接的引线
const int fridgePin = 12; // 冰箱信号线连接的引脚
//定义全局变量
uint8_t now_hour=0; // 用于存储小时的变量
uint8_t now_minute=0; // 用于存储分钟的变量
char dateStr[20];
char weekStr[10];
uint8_t flag=1; //晚点名标志变量
uint8_t flag1=1; //晚熄灯标志变量
uint8_t page=1; //页码
char receivedChar;
float now_Humidity=0.0;
float now_Temperature=0.0;
WiFiServer server(serverPort);
// 使用U8g2库初始化OLED对象,这里假设是SSD1306 128x64的OLED,软件I2C通信,无复位引脚连接
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
// 创建HardwareSerial对象,这里使用UART0,对应默认的RXD和TXD引脚
HardwareSerial SerialPort(0); //串口监测器的串口通信
// 创建传感器对象
DHT dht(DHTPIN, DHTTYPE);
//UDP 网络通信初始化
WiFiUDP ntpUDP;
// 这里使用中国国家授时中心的服务器地址,也可替换为其他可靠的NTP服务器
NTPClient timeClient(ntpUDP, "ntp.ntsc.ac.cn", 60 * 60 * 8, 30 * 60 * 1000);
/* 创建实例 */
HTTPClient http;
String GitURL(String api,String city)
{
url_xinzhi = "https://api.seniverse.com/v3/weather/daily.json?key=";
url_xinzhi += api;
url_xinzhi += "&location=";
url_xinzhi += city;
url_xinzhi += "&language=zh-Hans&unit=c&start=-1&days=5";
//https://api.seniverse.com/v3/weather/daily.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c&start=-1&days=5
return url_xinzhi;
}
void ParseWeather(String url)
{
DynamicJsonDocument doc(2048); //创建一个动态的 JSON 文档对象doc,并分配 2048 字节的内存空间。
http.begin(url);//初始化HTTPClient对象http,并传入要请求的 URL。
int httpGet = http.GET();//对象发送一个 HTTP GET 请求到指定的 URL,并获取服务器返回的响应状态码。
if(httpGet > 0)
{
Serial.printf("HTTPGET is %d",httpGet);//打印出响应状态码
if(httpGet == HTTP_CODE_OK)
{
String json = http.getString();//获取服务器返回的 JSON 格式的字符串数据
Serial.println(json);//打印服务器返回的 JSON 格式的字符串数据
deserializeJson(doc, json);//将获取到的 JSON 字符串解析到之前创建的doc对象中
day1_day_weather=doc["results"][0]["daily"][0]["text_day"].as<String>();
day1_night_weather=doc["results"][0]["daily"][0]["text_night"].as<String>();
day1_high_temperature=doc["results"][0]["daily"][0]["high"].as<String>();
day1_low_temperature=doc["results"][0]["daily"][0]["low"].as<String>();
day1_humidity=doc["results"][0]["daily"][0]["humidity"].as<String>();
day1_precip=doc["results"][0]["daily"][0]["precip"].as<String>();
day1_rainfall=doc["results"][0]["daily"][0]["rainfall"].as<String>();
day1_wind_direction=doc["results"][0]["daily"][0]["wind_direction"].as<String>();
day1_wind_speed=doc["results"][0]["daily"][0]["wind_speed"].as<String>();
day1_wind_scale=doc["results"][0]["daily"][0]["wind_scale"].as<String>();
day2_day_weather=doc["results"][0]["daily"][1]["text_day"].as<String>();
day2_night_weather=doc["results"][0]["daily"][1]["text_night"].as<String>();
day2_high_temperature=doc["results"][0]["daily"][1]["high"].as<String>();
day2_low_temperature=doc["results"][0]["daily"][1]["low"].as<String>();
day2_humidity=doc["results"][0]["daily"][1]["humidity"].as<String>();
day2_precip=doc["results"][0]["daily"][1]["precip"].as<String>();
day2_rainfall=doc["results"][0]["daily"][1]["rainfall"].as<String>();
day2_wind_direction=doc["results"][0]["daily"][1]["wind_direction"].as<String>();
day2_wind_speed=doc["results"][0]["daily"][1]["wind_speed"].as<String>();
day2_wind_scale=doc["results"][0]["daily"][1]["wind_scale"].as<String>();
day3_day_weather=doc["results"][0]["daily"][2]["text_day"].as<String>();
day3_night_weather=doc["results"][0]["daily"][2]["text_night"].as<String>();
day3_high_temperature=doc["results"][0]["daily"][2]["high"].as<String>();
day3_low_temperature=doc["results"][0]["daily"][2]["low"].as<String>();
day3_humidity=doc["results"][0]["daily"][2]["humidity"].as<String>();
day3_precip=doc["results"][0]["daily"][2]["precip"].as<String>();
day3_rainfall=doc["results"][0]["daily"][2]["rainfall"].as<String>();
day3_wind_direction=doc["results"][0]["daily"][2]["wind_direction"].as<String>();
day3_wind_speed=doc["results"][0]["daily"][2]["wind_speed"].as<String>();
day3_wind_scale=doc["results"][0]["daily"][2]["wind_scale"].as<String>();
Serial.println(day1_day_weather);
Serial.println(day1_night_weather);
Serial.println(day1_high_temperature);
Serial.println(day1_low_temperature);
Serial.println(day1_humidity);
Serial.println(day1_precip);
Serial.println(day1_rainfall);
Serial.println(day1_wind_direction);
Serial.println(day1_wind_speed);
Serial.println(day1_wind_scale);
}
else
{
Serial.printf("ERROR1!!");
}
}
else
{
Serial.printf("ERROR2!!");
}
http.end();
}
//按键触发外部中断函数
void callBack(void)
{
if(page!=4)
{page++;}
else
{page=1;}
Serial.printf("当前页数:%d\n",page);
}
//初始化函数
void setup() {
// 将冰箱引脚设置为输出模式
pinMode(fridgePin, OUTPUT);
// 将冰箱引脚电平设置为低电平
digitalWrite(fridgePin, LOW);
// 将引脚23设置为输出模式,用于控制蜂鸣器
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, HIGH);
//中断引脚
pinMode(buttonPin,OUTPUT); //GPIO_13,输出模式
attachInterrupt(buttonPin, callBack, FALLING); //当电平发生变化时,触发中断
//启用传感器
dht.begin();
//初始化屏幕
u8g2.begin();//启动屏幕
u8g2.enableUTF8Print();//使用 u8g2 库
//初始化串口
Serial.begin(115200);// 初始化用于输出调试信息的串口
//初始化WiFi连接部分
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);//开始连接WiFi
while (WiFi.status()!= WL_CONNECTED) //检测是否成功连接WiFi
{
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体
u8g2.drawStr(10, 30, "Connecting to WiFi"); //屏幕显示正在连接WiFi
u8g2.sendBuffer();
delay(500);
Serial.print(".");
}
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体
u8g2.drawStr(15, 30, "WiFi connected!");//显示成功连接Wifi
u8g2.sendBuffer();
delay(500);
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// 初始化NTP客户端
timeClient.begin();
server.begin();
//构建一个完整的 URL 字符串
WeatherURL = GitURL(API,CITY);
}
//循环运行函数
void loop()
{
//获取最新时间
timeClient.update();
//处理时间函数
tackle_time();//
//获得小时和分钟变量数据
get_hour_minet();
//获取天气
get_weather();
//冰箱控制
fridge_control();
//屏幕显示部分
chose_page_display();//
//晚点签到提醒功能(待处理)
remind_sign_in();
//晚熄灯提醒功能(待处理)
remind_turn_off();
app_connect_contral();
//从串口监视器接收字符(暂时不用)
//receive_char();
}
//——————————————————————————————————————————————————————————————————————————
void app_connect_contral()
{
WiFiClient client = server.available();
if (client) {
Serial.println("Client connected!");
static unsigned long lastSensorSend = 0;
static unsigned long lastKeepalive = 0;
while (client.connected()) {
if (client.available()) {
String command = client.readStringUntil('\n');
command.trim();
Serial.println(command);
int startPos_flag = command.indexOf("high");
if (startPos_flag != -1) {
String numberStr = command.substring(startPos_flag + 4); // 从第5个字符开始截取(索引从0开始)
set_highest_temperature = atof(numberStr.c_str());
Serial.println("Extracted number: " + String(set_highest_temperature));
}
startPos_flag = command.indexOf("low");
if (startPos_flag != -1) {
String numberStr = command.substring(startPos_flag + 3); // 从第4个字符开始截取(索引从0开始)
set_lowest_temperature = atof(numberStr.c_str());
Serial.println("Extracted number: " + String(set_lowest_temperature));
}
startPos_flag = command.indexOf("wdm");
if (startPos_flag != -1) {
int prefixLength = 3;
int colonPos = command.indexOf(":");
if (colonPos != -1) {
String part1Str = command.substring(prefixLength, colonPos);
String part2Str = command.substring(colonPos + 1);
Serial.println("Extracted number: " + String(part1Str));
Serial.println("Extracted number: " + String(part2Str));
sign_in_hour = part1Str.toInt();
sign_in_minute = part2Str.toInt();
}
}
startPos_flag = command.indexOf("wxd");
if (startPos_flag != -1) {
int prefixLength = 3;
int colonPos = command.indexOf(":");
if (colonPos != -1) {
String part1Str = command.substring(prefixLength, colonPos);
String part2Str = command.substring(colonPos + 1);
Serial.println("Extracted number: " + String(part1Str));
Serial.println("Extracted number: " + String(part2Str));
turn_off_hour = part1Str.toInt();
turn_off_minute = part2Str.toInt();
}
}
//sign_in_hour=21,sign_in_minute=30;//设置晚点名时间
//turn_off_hour=22,turn_off_minute=30;//设置晚熄灯时间
if (command.equals("ON")) {
fridge_contral_flag=1;
} else if (command.equals("OFF")) {
fridge_contral_flag=0;
}
client.println("HUMIDITY:" + String(now_Humidity));
client.println("TEMPERATURE:" + String(now_Temperature));
// 改进校验方式
int checksum = static_cast<int>(round(now_Humidity * 100)) + static_cast<int>(round(now_Temperature));
client.println("CHECKSUM:" + String(checksum));
client.println("KEEPALIVE");
client.flush();
if (command.equals ("GET_DATA")) {
float a1 = set_highest_temperature;
float a2 = set_lowest_temperature;
client.print("A1=");
client.println(a1, 2);
client.flush();
client.print("A2=");
client.println(a2, 2);
client.flush();
client.print("A3=");
if(sign_in_hour<10)
{
client.print("0");
client.print(sign_in_hour);
}
else{client.print(sign_in_hour);}
client.print(":");
if(sign_in_minute<10)
{
client.print("0");
client.println(sign_in_minute);
}
else{client.println(sign_in_minute);}
client.flush();
client.print("A4=");
if(turn_off_hour<10)
{
client.print("0");
client.print(turn_off_hour);
}
else{client.print(turn_off_hour);}
client.print(":");
if(turn_off_minute<10)
{
client.print("0");
client.println(turn_off_minute);
}
else{client.println(turn_off_minute);}
client.flush();
//sign_in_hour=21,sign_in_minute=30;//设置晚点名时间
//turn_off_hour=22,turn_off_minute=30;//设置晚熄灯时间
Serial.print("A3=");
if(sign_in_hour<10)
{
Serial.print("0");
Serial.print(sign_in_hour);
}
else{Serial.print(sign_in_hour);}
Serial.print(":");
if(sign_in_minute<10)
{
Serial.print("0");
Serial.println(sign_in_minute);
}
else{Serial.println(sign_in_minute);}
Serial.print("A4=");
if(turn_off_hour<10)
{
Serial.print("0");
Serial.print(turn_off_hour);
}
else{Serial.print(turn_off_hour);}
Serial.print(":");
if(turn_off_minute<10)
{
Serial.print("0");
Serial.println(turn_off_minute);
}
else{Serial.println(turn_off_minute);}
}
}
// 每秒发送一次数据
if (millis() - lastSensorSend > 1000) {
now_Humidity = dht.readHumidity();
now_Temperature = dht.readTemperature();
client.println("HUMIDITY:" + String(now_Humidity));
client.println("TEMPERATURE:" + String(now_Temperature));
// 改进校验方式
int checksum = static_cast<int>(round(now_Humidity * 100)) + static_cast<int>(round(now_Temperature));
client.println("CHECKSUM:" + String(checksum));
client.println("KEEPALIVE");
client.flush();
lastSensorSend = millis();
}
// 心跳包保活(10秒间隔)
if (millis() - lastKeepalive > 10000) {
client.println("KEEPALIVE");
client.flush();
lastKeepalive = millis();
}
fridge_control();
timeClient.update();
tackle_time();
get_hour_minet();
remind_sign_in();
remind_turn_off();
}
client.stop();
Serial.println("Client disconnected!");
}
}
//时间处理函数
void tackle_time()
{
// 获取时间相关信息
time_t rawtime = timeClient.getEpochTime();
struct tm *ptm = gmtime(&rawtime);
// 格式化日期字符串
sprintf(dateStr, "%02d-%02d", ptm->tm_mon + 1, ptm->tm_mday);
// 根据星期数字获取星期字符串
switch (ptm->tm_wday)
{
case 0:
sprintf(weekStr, "Sun");
break;
case 1:
sprintf(weekStr, "Mon");
break;
case 2:
sprintf(weekStr, "Tue");
break;
case 3:
sprintf(weekStr, "Wed");
break;
case 4:
sprintf(weekStr, "Thu");
break;
case 5:
sprintf(weekStr, "Fri");
break;
case 6:
sprintf(weekStr, "Sat");
break;
}
}
void chose_page_display()
{
switch(page)
{
case 1:oled_page1_display();break;
case 2:oled_page2_display();break;
case 3:oled_page3_display();break;
case 4:oled_page4_display();break;
}
}
//获取小时和分钟整型变量函数
void get_hour_minet()
{
String formattedTime = timeClient.getFormattedTime();
// 提取小时并赋值给now_hour变量
now_hour= formattedTime.substring(0, 2).toInt();
// 提取分钟并赋值给now_minute变量
now_minute= formattedTime.substring(3, 5).toInt();
}
//天气获取函数
void get_weather()//大约半个小时更新一次
{
if(sum!=3600)
{sum++;}
else
{sum=0;}
if(weather_flag==2 || sum==5000)
{
ParseWeather(WeatherURL);
weather_flag=0;
}
}
void receive_char()
{
if (Serial.available() > 0) // 判断串口是否有可用数据
{
char receivedChar = Serial.read(); // 读取一个字符
Serial.print("Received character: ");
Serial.println(receivedChar); // 将接收到的字符显示在串口监视器上
if (receivedChar == 'f')
{
digitalWrite(buzzerPin, LOW);
delay(1000);
digitalWrite(buzzerPin, HIGH);
}
else if(receivedChar == 'g')
{
digitalWrite(fridgePin, LOW);
}
else if(receivedChar == 'k')
{
digitalWrite(fridgePin, HIGH);
}
}
}
//获得温湿度数据函数
void get_dht_data()
{
//DH11温湿度模块获得数据
now_Humidity=dht.readHumidity();
now_Temperature=dht.readTemperature();
}
//小冰箱控制函数
void fridge_control()
{
get_dht_data();
if(fridge_contral_flag)
{
if(now_Temperature>set_highest_temperature)
{
// 将冰箱引脚电平设置为高电平(开启)
digitalWrite(fridgePin, HIGH);
}
else if(now_Temperature<set_lowest_temperature)
{
// 将冰箱引脚电平设置为低电平(关闭)
digitalWrite(fridgePin, LOW);
}
}
else{digitalWrite(fridgePin, LOW);}
}
//晚点名签到提醒函数(待处理)
void remind_sign_in()
{
if(now_minute!=sign_in_minute)
{flag=1;}
if(now_hour==sign_in_hour && now_minute==sign_in_minute && flag==1)//到点触发
{
digitalWrite(buzzerPin, LOW);
delay(1000);
digitalWrite(buzzerPin, HIGH);
Serial.println("send WDM");
flag=0;
}
}
//晚熄灯提醒函数(待处理)
void remind_turn_off()
{
if(now_minute!=turn_off_minute)
{flag1=1;}
if(now_hour==turn_off_hour && now_minute==turn_off_minute && flag1==1)//到点触发
{
digitalWrite(buzzerPin, LOW);
delay(1000);
digitalWrite(buzzerPin, HIGH);
Serial.println("send WXD");
flag1=0;
}
}
//oled屏幕显示页数1函数
void oled_page1_display()
{
//Serial.print("Humidity: ");
//Serial.print(now_Humidity);
//Serial.print("% Temperature: ");
//Serial.print(now_Temperature);
//Serial.println("°C");
int i=0;
while(i!=5 && page==1)
{
if(i==0)
{
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_9x15_tf);
u8g2.setCursor(20, 10); // 显示日期
u8g2.print(dateStr);
u8g2.setCursor(83, 10); // 显示星期
u8g2.print(weekStr);
u8g2.setCursor(30, 28); // 显示时间
u8g2.print(timeClient.getFormattedTime());
u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
u8g2.setCursor(20, 45);// 显示温度
u8g2.print("室内温度: ");
u8g2.print(now_Temperature);
u8g2.print("℃");
u8g2.setCursor(20, 60);// 显示湿度
u8g2.print("室内湿度: ");
u8g2.print(now_Humidity);
u8g2.print("%");
u8g2.sendBuffer();
}
i++;
delay(100);
}
//day1_day_weather
//day1_night_weather
//day1_high_temperature
//day1_low_temperature
//day1_humidity
//day1_precip
//day1_rainfall
}
//oled屏幕显示页数2函数
void oled_page2_display()
{
int i=0;
while(i!=30 && page==2)
{
if(i==0)
{
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
u8g2.setCursor(5,10);// 当前日期
u8g2.print("今天:");
u8g2.setCursor(30,30);// 显示白天天气
u8g2.print("白天天气: ");
u8g2.print(day1_day_weather);
u8g2.setCursor(30,45);// 显示晚上天气
u8g2.print("晚上天气: ");
u8g2.print(day1_night_weather);
u8g2.setCursor(30,60);// 显示温度范围
u8g2.print("温度: ");
u8g2.print(day1_low_temperature);
u8g2.print("~");
u8g2.print(day1_high_temperature);
u8g2.print("℃");
u8g2.sendBuffer();
}
i++;
delay(100);
}
i=0;
while(i!=30 && page==2)
{
if(i==0)
{
u8g2.clearBuffer();
u8g2.setCursor(5,10);// 当前日期
u8g2.print("今天:");
u8g2.setCursor(30,30);// 显示湿度
u8g2.print("湿度: ");
u8g2.print(day1_humidity);
u8g2.print("%");
u8g2.setCursor(30,45);// 显示降水概率
u8g2.print("降水概率: ");
u8g2.print(day1_precip);
u8g2.print("%");
u8g2.setCursor(30,60);// 显示降水量
u8g2.print("降雨量: ");
u8g2.print(day1_rainfall);
u8g2.print("mm");
u8g2.sendBuffer();
}
i++;
delay(100);
}
i=0;
while(i!=30 && page==2)
{
if(i==0)
{
u8g2.clearBuffer();
u8g2.setCursor(5,10);// 当前日期
u8g2.print("今天:");
u8g2.setCursor(30,30);// 显示风向
u8g2.print("风向: ");
u8g2.print(day1_wind_direction);
u8g2.setCursor(30,45);// 显示风速
u8g2.print("风速: ");
u8g2.print(day1_wind_speed);
u8g2.print("km/h");
u8g2.setCursor(30,60);// 显示风力等级
u8g2.print("风力等级: ");
u8g2.print(day1_wind_scale);
u8g2.sendBuffer();
}
i++;
delay(100);
}
}
//oled屏幕显示页数3函数
void oled_page3_display()
{
int i=0;
while(i!=30 && page==3)
{
if(i==0)
{
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
u8g2.setCursor(5,10);// 当前日期
u8g2.print("明天:");
u8g2.setCursor(30,30);// 显示白天天气
u8g2.print("白天天气: ");
u8g2.print(day2_day_weather);
u8g2.setCursor(30,45);// 显示晚上天气
u8g2.print("晚上天气: ");
u8g2.print(day2_night_weather);
u8g2.setCursor(30,60);// 显示温度范围
u8g2.print("温度: ");
u8g2.print(day2_low_temperature);
u8g2.print("~");
u8g2.print(day2_high_temperature);
u8g2.print("℃");
u8g2.sendBuffer();
}
i++;
delay(100);
}
i=0;
while(i!=30 && page==3)
{
if(i==0)
{
u8g2.clearBuffer();
u8g2.setCursor(5,10);// 当前日期
u8g2.print("明天:");
u8g2.setCursor(30,30);// 显示湿度
u8g2.print("湿度: ");
u8g2.print(day2_humidity);
u8g2.print("%");
u8g2.setCursor(30,45);// 显示降水概率
u8g2.print("降水概率: ");
u8g2.print(day2_precip);
u8g2.print("%");
u8g2.setCursor(30,60);// 显示降水量
u8g2.print("降雨量: ");
u8g2.print(day2_rainfall);
u8g2.print("mm");
u8g2.sendBuffer();
}
i++;
delay(100);
}
i=0;
while(i!=30 && page==3)
{
if(i==0)
{
u8g2.clearBuffer();
u8g2.setCursor(5,10);// 当前日期
u8g2.print("明天:");
u8g2.setCursor(30,30);// 显示风向
u8g2.print("风向: ");
u8g2.print(day2_wind_direction);
u8g2.setCursor(30,45);// 显示风速
u8g2.print("风速: ");
u8g2.print(day2_wind_speed);
u8g2.print("km/h");
u8g2.setCursor(30,60);// 显示风力等级
u8g2.print("风力等级: ");
u8g2.print(day2_wind_scale);
u8g2.sendBuffer();
}
i++;
delay(100);
}
}
//oled屏幕显示页数4函数
void oled_page4_display()
{
int i=0;
while(i!=30 && page==4)
{
if(i==0)
{
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
u8g2.setCursor(5,10);// 当前日期
u8g2.print("后天:");
u8g2.setCursor(30,30);// 显示白天天气
u8g2.print("白天天气: ");
u8g2.print(day3_day_weather);
u8g2.setCursor(30,45);// 显示晚上天气
u8g2.print("晚上天气: ");
u8g2.print(day3_night_weather);
u8g2.setCursor(30,60);// 显示温度范围
u8g2.print("温度: ");
u8g2.print(day3_low_temperature);
u8g2.print("~");
u8g2.print(day3_high_temperature);
u8g2.print("℃");
u8g2.sendBuffer();
}
i++;
delay(100);
}
i=0;
while(i!=30 && page==4)
{
if(i==0)
{
u8g2.clearBuffer();
u8g2.setCursor(5,10);// 当前日期
u8g2.print("后天:");
u8g2.setCursor(30,30);// 显示湿度
u8g2.print("湿度: ");
u8g2.print(day3_humidity);
u8g2.print("%");
u8g2.setCursor(30,45);// 显示降水概率
u8g2.print("降水概率: ");
u8g2.print(day3_precip);
u8g2.print("%");
u8g2.setCursor(30,60);// 显示降水量
u8g2.print("降雨量: ");
u8g2.print(day3_rainfall);
u8g2.print("mm");
u8g2.sendBuffer();
}
i++;
delay(100);
}
i=0;
while(i!=30 && page==4)
{
if(i==0)
{
u8g2.clearBuffer();
u8g2.setCursor(5,10);// 当前日期
u8g2.print("后天:");
u8g2.setCursor(30,30);// 显示风向
u8g2.print("风向: ");
u8g2.print(day3_wind_direction);
u8g2.setCursor(30,45);// 显示风速
u8g2.print("风速: ");
u8g2.print(day3_wind_speed);
u8g2.print("km/h");
u8g2.setCursor(30,60);// 显示风力等级
u8g2.print("风力等级: ");
u8g2.print(day3_wind_scale);
u8g2.sendBuffer();
}
i++;
delay(100);
}
}
②安卓app部分:


通过网盘分享的文件:esp32_control_app.zip
链接: https://pan.baidu.com/s/1le9LSpFz3Zl2tUaHhI8E5A?pwd=2kiw 提取码: 2kiw
3.项目重点内容
①ESP32实现和手机之间的通信,借助安卓app实现互相转发数据。
②安卓app界面设计,交互模块之间的控制关系。
③多用温控小冰箱的联网天气时钟,硬件设备控制。










