



ESP32-E IoT开发板+扩展版 x 1
SHT31-F数字温湿度传感器 x1
DF1201S DFPlayer PRO MP3播放器模块 x 1
Gravity: I2C LCD1602 液晶显示屏 x 1
舵机 x 2
喇叭 x 1
按钮 x 1
杜邦线 若干


复制代码 隐藏代码复制代码


,解压后把库文件拖入
arduino
—
libraries
文件目录下。
#include <ESP32Servo.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <DFRobot_SHT3x.h>
#include <DFRobot_PLAY.h>
#include <DFRobot_LCD.h>
DFRobot_LCD lcd(/*每行16个字符*/16,/*显示2行*/2);
DFRobot_SHT3x sht3x(&Wire,0x45,4); //当ADR连接到VDD时,芯片I2C地址为0x45,该产品通过拨扭开关来选择芯片地址
DFRobot_PLAY mp3Player; //mp3模块的名字
HTTPClient http;
const char* ssid="dfrobot";// wifi的名字,根据实际情况进行更改
const char* password="123456789.";// WiFi的密码.,根据实际情况进行更改
const char* ntpServer = "pool.ntp.org"; //NTP服务器 国内可用的NTP Server:/*0.cn.pool.ntp.org*/ /*cn.pool.ntp.org*/ /*tw.pool.ntp.org*/
const long gmtOffsetSec = 28800; //
const int daylightOffsetSec = 0;//
int buttonPin = D7; //按钮接入D7引脚
DynamicJsonDocument doc(1024);//JSON解析
Servo sunServo;//控制晴天娃娃高度的舵机
Servo rainServo;//控制雨天娃娃高度的舵机
String gTemperature,gWeatherInfo; //全局变量
bool sunnyDay = true; //判断晴天状态变量
bool rainyDay = true; //判断雨天状态变量
bool musicPlaying = false; //判断音乐播放状态
bool lcdShowing = false; //判断lcd显示状态
unsigned long long musicStamp; //音乐播放持续时间
unsigned long long lcdStamp; //lcd显示持续时间
uint16_t musicServo(){
uint16_t ret = 0;
if(sht3x.getHumidityRH()<70 && sunnyDay == true){
sunServo.write(176); //控制晴天娃娃舵机高度为176升起
rainServo.write(5); //控制雨天娃娃舵机高度为5降落
mp3Player.start(); //音乐开始播放
mp3Player.playFileNum(1);//播放1号音频
sunnyDay = false;
rainyDay = true;
ret = 10*1000;
}else if(sht3x.getHumidityRH()>90 && rainyDay == true){
sunServo.write(5); //控制晴天娃娃高度舵机为5降落
rainServo.write(176);//控制雨天娃娃高度舵机为176升起
mp3Player.start(); //音乐开始播放
mp3Player.playFileNum(2);//播放2号音频
rainyDay = false;
sunnyDay = true;
ret = 10*1000;
}
return ret;
}
uint16_t lcdPrint(){
uint16_t ret = 0;
uint8_t button = digitalRead(buttonPin); //读取按钮引脚高低电平
if (button == HIGH){
delay(100);
button = digitalRead(buttonPin);
//经过100毫秒如果还是为高电频就显示
if(button == HIGH){
lcd.setPWM(REG_ONLY,255); //亮屏
lcd.display(); //打开lcd显示
lcd.setCursor(/*列:*/0,/*行:*/0);//设置显示光标
lcd.print("T:");
lcd.setCursor(/*列:*/2,/*行:*/0);
lcd.print(gTemperature); //从网上获取的温度
lcd.setCursor(/*列:*/4,/*行:*/0);
lcd.print("C");
lcd.setCursor(/*列:*/6,/*行:*/0);
lcd.print("W:");
lcd.setCursor(/*列:*/8,/*行:*/0);
lcd.print(gWeatherInfo); //从网上获取的天气信息
lcd.setCursor(/*列:*/0,/*行:*/1);
lcd.print("T:");
int Temperature = sht3x.getTemperatureC(); //从传感器上获取的温度
lcd.print(Temperature);
lcd.setCursor(/*列:*/4,/*行:*/1);
lcd.print("C");
lcd.setCursor(/*列:*/6,/*行:*/1);
lcd.print("H:");
int Humidity = sht3x.getHumidityRH(); //从传感器上获取的湿度
lcd.print(Humidity);
lcd.setCursor(/*列:*/10,/*行:*/1);
lcd.println("%RH ");
ret = 5*1000;
}
}
return ret;
}
void printLocalWeather(){
//提供城市编码的网站:https://blog.csdn.net/qq_40266771/article/details/103905967 下列网址是(成都101270101)你可以进行替换,你所在的城市编码
http.begin("); //在中国天气网上抓取的成都的温湿度和天气情况
int httpCode = http.GET(); //请求方法:get()/post()
if(httpCode == HTTP_CODE_OK){
String pageData = http .getString();//把获取到的数据传递到pageData
pageData.replace("var dataSK = ","");//replace替换函数 把var dataSk = 去掉只留下json字符串
deserializeJson(doc,pageData);//解析pageData deserialize(反序列化)Json 解析函数 doc接收
JsonObject obj = doc.as<JsonObject>();// 获取顶节点,并把它转成T类型;JsonObject:对象的入口
gWeatherInfo = obj["weathere"].as<String>();//把从网上获取的天气情况转换成字符串赋值给gWeatherInfo
gTemperature = obj["temp"].as<String>(); //把从网上获取的温度转换成字符串赋值给gWeatherInfo
Serial.print("温度:");
Serial.println(gTemperature);
Serial.print("天气情况:");
Serial.println(gWeatherInfo);
}else{
Serial.println("GET ERR"); //打印获取失败
}
http.end();
}
void setup() {
Serial.begin(115200); //设置波特率为115200
Serial.printf("Connecting to %s",ssid);
WiFi.begin(ssid,password); //连接wifi
while(WiFi.status() != WL_CONNECTED){ //当wifi连接时,串口会打印.
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
//初始化并设置并获取时间
configTime(gmtOffsetSec, daylightOffsetSec, ntpServer);
pinMode(buttonPin,INPUT); //设置按钮引脚为输入模式
lcd.init(); //初始化lcd屏幕
Serial2.begin(115200); //mp3模块波特率设置
while(!mp3Player.begin(Serial2)){
Serial.println("初始化失败,请检查接线!");
delay(1000);
}
mp3Player.setVol(/*VOL = */1); //设置音量为1
mp3Player.switchFunction(mp3Player.MUSIC); //进入音乐模式
rainServo.attach(D2); //控制雨天娃娃舵机连接D2引脚
sunServo.attach(D6);//控制晴天娃娃舵机连接D6引脚
}
void loop(){
uint16_t durationLcd; //lcd显示持续时间
uint16_t durationMusic;//music播放持续时间
if(WiFi.status() == WL_CONNECTED){//判断WiFi是否连接成功
printLocalWeather(); //调用获取当地天气的函数
}else{
Serial.println("WiFi Disconnect");//WiFi断开
}
if (musicPlaying == false){
durationMusic = musicServo();//返回值代表音乐播放的时间(ms),返回0代表不播放音乐
if(durationMusic){//假如有参数也就是在播放
musicPlaying = true;//播放就赋值为真
musicStamp = millis();//把系统时间传给musicStamp
}
}
if(lcdShowing == false){
durationLcd = lcdPrint();//lcd如果播放就把参数传进去
if(durationLcd){//假如有参数就是在播放
lcdShowing = true;//lcd播放就赋值为真
lcdStamp = millis();//把系统时间传给lcdStamp
}
}
if(lcdShowing == true && millis()-lcdStamp>=durationLcd){
lcdShowing = false;//lcd播放设置为假
lcd.setPWM(REG_ONLY,0); //息屏
lcd.noDisplay();//lcd关闭显示
}
if(musicPlaying && (millis()-musicStamp >= durationMusic)){
musicPlaying = false;//把播放设置为假
mp3Player.pause();//停止播放
}
}复制代码








来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70005204/viewspace-2786753/ ,如需转载,请注明出处,否则将追究法律责任。