7786浏览
查看: 7786|回复: 5

晴天娃娃天气预报站—— ESP32-E+温湿度传感器

[复制链接]
本帖最后由 DF_9295 于 2021-4-28 16:26 编辑

每天起床的意义就是去拥抱工作!
万万没想到出门就下雨,只有上楼拿伞了!(没有什么能阻挡我去打工)
晴天娃娃天气预报站—— ESP32-E+温湿度传感器图15

这突如其来的下雨天让我想起了“一休和尚”的晴天娃娃
晴天娃娃天气预报站—— ESP32-E+温湿度传感器图14

据说把晴天娃娃正吊着是求晴天,倒吊着是求雨天(我觉得求下雨还是拜拜萧敬腾比较靠谱,hh~毕竟是公认的“雨神”,有他在下雨没意外)
晴天娃娃天气预报站—— ESP32-E+温湿度传感器图1

思路为了不再发生多跑一趟回家拿伞的事情,我想做一个能随时检测是否快下雨的“玩意”。突然就想起了DFROBOT新推出的esp32-e和温湿度传感器正好可以做一个天气预报站。

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图21

功能用显示屏把esp32-e从中国天气网站获取当天所在城市的温度和天气数据和温湿度传感器获得当前环境的温度和湿度数据显示出来。若当前湿度大于90%,蓝色的娃娃就会被舵机带动往上移动,同时mp3模块会播放设定的音频(目前设置的音频是薛之谦的“下雨天”);若当前湿度值小于70%,橙色的娃娃就会被舵机带动网上移动,同时mp3模块会播放设定的音频(目前设置的音频是周杰伦的“晴天”)。


说干就干,打工人从来都不墨迹。

一、准备材料

1.硬件材料


晴天娃娃天气预报站—— ESP32-E+温湿度传感器图4

2.晴天娃娃材料

  • 洗脸巾 x2
  • 颜色笔 x2
  • 口罩 x1
  • 纸巾 若干

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图23


二、制作过程

1.将各个模块按下方图片进行连接

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图3

2. 安装开发板和库

(1)安装开发板
  • 打开 Arduino 1.8.13,点击File——Preferences——Show verbose output during中勾选compilation和upload,再把json文件网址(如下所示)复制粘贴到Addi tional Boards Manager URLs中,然后点击页面右下角的OK关闭页面。
  1. http://download.dfrobot.top/FireBeetle/package_DFRobot_index.json
复制代码

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图2
晴天娃娃天气预报站—— ESP32-E+温湿度传感器图5

  • 点击Tools——Board——Boards Manager——选择DFRobot AVR Boards板子——点击Install——安装完成后点击右下角Close关闭页面。

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图6

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图7

(2)安装ArduinoJson库,安装方式如下图

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图8

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图9

3)安装温湿度传感器和MP3模块以及显示屏的库下载附件库文件.zip,解压后把库文件拖入arduinolibraries文件目录下。如何安装库文件?

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图10

3.烧录程序
  1. #include <ESP32Servo.h>
  2. #include <WiFi.h>
  3. #include <HTTPClient.h>
  4. #include <ArduinoJson.h>
  5. #include <DFRobot_SHT3x.h>
  6. #include <DFRobot_PLAY.h>
  7. #include <DFRobot_LCD.h>
  8. DFRobot_LCD lcd(/*每行16个字符*/16,/*显示2行*/2);
  9. DFRobot_SHT3x sht3x(&Wire,0x45,4); //当ADR连接到VDD时,芯片I2C地址为0x45,该产品通过拨扭开关来选择芯片地址
  10. DFRobot_PLAY mp3Player;  //mp3模块的名字
  11. HTTPClient http;
  12. const char* ssid="dfrobot";// wifi的名字,根据实际情况进行更改
  13. const char* password="123456789.";// WiFi的密码.,根据实际情况进行更改
  14. const char* ntpServer = "pool.ntp.org"; //NTP服务器 国内可用的NTP Server:/*0.cn.pool.ntp.org*/    /*cn.pool.ntp.org*/   /*tw.pool.ntp.org*/
  15. const long gmtOffsetSec = 28800; //
  16. const int daylightOffsetSec = 0;//
  17. int buttonPin = D7; //按钮接入D7引脚
  18. DynamicJsonDocument doc(1024);//JSON解析
  19. Servo sunServo;//控制晴天娃娃高度的舵机
  20. Servo rainServo;//控制雨天娃娃高度的舵机
  21. String gTemperature,gWeatherInfo; //全局变量
  22. bool sunnyDay = true; //判断晴天状态变量
  23. bool rainyDay = true; //判断雨天状态变量
  24. bool musicPlaying = false; //判断音乐播放状态
  25. bool lcdShowing = false; //判断lcd显示状态
  26. unsigned long long musicStamp; //音乐播放持续时间
  27. unsigned long long lcdStamp; //lcd显示持续时间
  28. uint16_t musicServo(){
  29.   uint16_t ret = 0;
  30.   if(sht3x.getHumidityRH()<70 && sunnyDay == true){
  31.     sunServo.write(176); //控制晴天娃娃舵机高度为176升起
  32.     rainServo.write(5);  //控制雨天娃娃舵机高度为5降落
  33.     mp3Player.start();  //音乐开始播放
  34.     mp3Player.playFileNum(1);//播放1号音频
  35.     sunnyDay = false;
  36.     rainyDay = true;
  37.     ret = 10*1000;
  38.   }else if(sht3x.getHumidityRH()>90 && rainyDay == true){
  39.     sunServo.write(5);  //控制晴天娃娃高度舵机为5降落
  40.     rainServo.write(176);//控制雨天娃娃高度舵机为176升起
  41.     mp3Player.start(); //音乐开始播放
  42.     mp3Player.playFileNum(2);//播放2号音频
  43.     rainyDay = false;
  44.     sunnyDay = true;
  45.     ret = 10*1000;
  46.   }
  47.   return ret;
  48. }
  49. uint16_t lcdPrint(){
  50.   uint16_t ret = 0;
  51.   uint8_t button = digitalRead(buttonPin); //读取按钮引脚高低电平
  52.   if (button == HIGH){
  53.     delay(100);
  54.     button = digitalRead(buttonPin);
  55.   //经过100毫秒如果还是为高电频就显示
  56.     if(button == HIGH){
  57.       lcd.setPWM(REG_ONLY,255); //亮屏
  58.       lcd.display(); //打开lcd显示
  59.       lcd.setCursor(/*列:*/0,/*行:*/0);//设置显示光标
  60.       lcd.print("T:");
  61.       lcd.setCursor(/*列:*/2,/*行:*/0);
  62.       lcd.print(gTemperature); //从网上获取的温度
  63.       lcd.setCursor(/*列:*/4,/*行:*/0);
  64.       lcd.print("C");
  65.       lcd.setCursor(/*列:*/6,/*行:*/0);
  66.       lcd.print("W:");
  67.       lcd.setCursor(/*列:*/8,/*行:*/0);
  68.       lcd.print(gWeatherInfo); //从网上获取的天气信息
  69.       lcd.setCursor(/*列:*/0,/*行:*/1);
  70.       lcd.print("T:");
  71.       int Temperature  = sht3x.getTemperatureC(); //从传感器上获取的温度
  72.       lcd.print(Temperature);
  73.       lcd.setCursor(/*列:*/4,/*行:*/1);
  74.       lcd.print("C");
  75.       lcd.setCursor(/*列:*/6,/*行:*/1);
  76.       lcd.print("H:");
  77.       int Humidity = sht3x.getHumidityRH(); //从传感器上获取的湿度
  78.       lcd.print(Humidity);
  79.       lcd.setCursor(/*列:*/10,/*行:*/1);
  80.       lcd.println("%RH    ");
  81.       ret = 5*1000;
  82.     }
  83.   }
  84.   return ret;  
  85. }
  86. void printLocalWeather(){
  87.   //提供城市编码的网站:https://blog.csdn.net/qq_40266771/article/details/103905967   下列网址是(成都101270101)你可以进行替换,你所在的城市编码
  88.   http.begin("http://d1.weather.com.cn/sk_2d/101270101.html"); //在中国天气网上抓取的成都的温湿度和天气情况
  89.   int httpCode = http.GET();  //请求方法:get()/post()
  90.    
  91.   if(httpCode == HTTP_CODE_OK){
  92.     String pageData = http .getString();//把获取到的数据传递到pageData
  93.     pageData.replace("var dataSK = ","");//replace替换函数 把var dataSk = 去掉只留下json字符串
  94.     deserializeJson(doc,pageData);//解析pageData deserialize(反序列化)Json 解析函数 doc接收
  95.     JsonObject obj = doc.as<JsonObject>();// 获取顶节点,并把它转成T类型;JsonObject:对象的入口
  96.     gWeatherInfo = obj["weathere"].as<String>();//把从网上获取的天气情况转换成字符串赋值给gWeatherInfo
  97.     gTemperature = obj["temp"].as<String>(); //把从网上获取的温度转换成字符串赋值给gWeatherInfo
  98.     Serial.print("温度:");
  99.     Serial.println(gTemperature);
  100.     Serial.print("天气情况:");
  101.     Serial.println(gWeatherInfo);
  102.   }else{
  103.     Serial.println("GET ERR"); //打印获取失败
  104.   }
  105.   http.end();
  106. }
  107. void setup() {
  108.   Serial.begin(115200); //设置波特率为115200
  109.   Serial.printf("Connecting to %s",ssid);
  110.   WiFi.begin(ssid,password);  //连接wifi
  111.   while(WiFi.status() != WL_CONNECTED){  //当wifi连接时,串口会打印.
  112.     delay(500);
  113.     Serial.print(".");
  114.   }  
  115.   Serial.println(" CONNECTED");
  116.   //初始化并设置并获取时间
  117.   configTime(gmtOffsetSec, daylightOffsetSec, ntpServer);
  118.   pinMode(buttonPin,INPUT); //设置按钮引脚为输入模式
  119.   lcd.init(); //初始化lcd屏幕
  120.   Serial2.begin(115200); //mp3模块波特率设置
  121.   
  122.   while(!mp3Player.begin(Serial2)){
  123.     Serial.println("初始化失败,请检查接线!");
  124.     delay(1000);
  125.   }
  126.   
  127.   mp3Player.setVol(/*VOL = */1);  //设置音量为1
  128.   mp3Player.switchFunction(mp3Player.MUSIC);  //进入音乐模式
  129.   rainServo.attach(D2); //控制雨天娃娃舵机连接D2引脚
  130.   sunServo.attach(D6);//控制晴天娃娃舵机连接D6引脚
  131. }
  132. void loop(){
  133.   uint16_t durationLcd; //lcd显示持续时间
  134.   uint16_t durationMusic;//music播放持续时间
  135.   if(WiFi.status() == WL_CONNECTED){//判断WiFi是否连接成功
  136.     printLocalWeather();  //调用获取当地天气的函数
  137.   }else{
  138.     Serial.println("WiFi  Disconnect");//WiFi断开
  139.   }
  140.   if (musicPlaying == false){
  141.     durationMusic = musicServo();//返回值代表音乐播放的时间(ms),返回0代表不播放音乐
  142.     if(durationMusic){//假如有参数也就是在播放
  143.       musicPlaying = true;//播放就赋值为真
  144.       musicStamp = millis();//把系统时间传给musicStamp
  145.     }
  146.   }
  147.   
  148.   if(lcdShowing == false){
  149.     durationLcd = lcdPrint();//lcd如果播放就把参数传进去
  150.     if(durationLcd){//假如有参数就是在播放
  151.       lcdShowing = true;//lcd播放就赋值为真
  152.       lcdStamp = millis();//把系统时间传给lcdStamp
  153.     }
  154.   }
  155.   
  156.   if(lcdShowing == true && millis()-lcdStamp>=durationLcd){
  157.     lcdShowing = false;//lcd播放设置为假
  158.     lcd.setPWM(REG_ONLY,0); //息屏
  159.     lcd.noDisplay();//lcd关闭显示
  160.   }
  161.   
  162.   if(musicPlaying && (millis()-musicStamp >= durationMusic)){
  163.     musicPlaying = false;//把播放设置为假
  164.     mp3Player.pause();//停止播放
  165.   }  
  166. }
复制代码

4.设计外壳并用木板切割
模型文件看这里——下载附件模型文件.zip
晴天娃娃天气预报站—— ESP32-E+温湿度传感器图12

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图13

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图17

5.制作晴天娃娃

将口罩两边的绳子取下来并上色,再将纸巾揉成团放在洗脸巾里并用绳子捆紧就ok了。(材料有限hh~)

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图18

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图16

6.组装

把各个器件按位置固定好,最后再把外壳组装起来(记得把晴天娃娃挂在舵机的摆臂上哦)

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图19

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图22

晴天娃娃天气预报站—— ESP32-E+温湿度传感器图20

有了这款天气预报站,妈妈再也不用担心我淋雨了~











莫库什勒  学徒

发表于 2021-4-28 14:10:25

特别不错呢
回复

使用道具 举报

DF_9295  初级技师
 楼主|

发表于 2021-4-28 16:28:09


哈哈哈
回复

使用道具 举报

DFSJId51Ovu  中级技师

发表于 2021-5-6 16:30:37

一休哥 ,看了都落泪啊。
回复

使用道具 举报

修远  见习技师

发表于 2021-5-9 19:03:29

OK阿杰噢覅安静
回复

使用道具 举报

修远  见习技师

发表于 2021-5-9 19:07:41

愿天下有情人终成眷属。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail