基于Blinker的天气查询和温湿度节点-Arduino中文社区 - Powered by Discuz! Archiver

a7178636965 发表于 2020-2-1 12:42

基于Blinker的天气查询和温湿度节点

这台设备可以在0.96寸OLED上显示DHT11读取到的温湿度,并且可以通过Blinker的时间获取和天气查询功能显示时间和天气情况。传感器DHT11温湿度和天气情况每5秒切换一次。
视频如下:https://v.youku.com/v_show/id_XNDUyODYyNzM3Mg==.html视频地址:https://v.youku.com/v_show/id_XNDUyODYyNzM3Mg==.html
硬件连接:
主控 : ESP-12F
屏幕:0.96 SSD1306 OLEDSCL GPIO14| SDA GPIO2
温湿度传感器: DHT11    数据脚GPIO5

天气获取可见大佬的帖子:[分享] 【已更新】ArduinoJson6结合blinker分析获取weather数据
DHT11接入可见另外一位大佬的帖子[使用文档] 数据反馈
0.96寸OLED显示可见:ESP8266通过Arduino开发驱动IIC接口OLED
源码如下:
/* *****************************************************************
*
* Download latest Blinker library here:
* https://github.com/blinker-iot/blinker-library/archive/master.zip
*
*
* Blinker is a cross-hardware, cross-platform solution for the IoT.
* It provides APP, device and server support,
* and uses public cloud services for data transmission and storage.
* It can be used in smart home, data monitoring and other fields
* to help users build Internet of Things projects better and faster.
*
* Make sure installed 2.5.0 or later ESP8266/Arduino package,
* if use ESP8266 with Blinker.
* https://github.com/esp8266/Arduino/releases
*
* Make sure installed 1.0.2 or later ESP32/Arduino package,
* if use ESP32 with Blinker.
* https://github.com/espressif/arduino-esp32/releases
*
* Docs: https://doc.blinker.app/
*       https://github.com/blinker-iot/blinker-doc/wiki
*
* *****************************************************************
*
* Blinker 库下载地址:
* https://github.com/blinker-iot/blinker-library/archive/master.zip
*
* Blinker 是一套跨硬件、跨平台的物联网解决方案,提供APP端、设备端、
* 服务器端支持,使用公有云服务进行数据传输存储。可用于智能家居、
* 数据监测等领域,可以帮助用户更好更快地搭建物联网项目。
*
* 如果使用 ESP8266 接入 Blinker,
* 请确保安装了 2.5.0 或更新的 ESP8266/Arduino 支持包。
* https://github.com/esp8266/Arduino/releases
*
* 如果使用 ESP32 接入 Blinker,
* 请确保安装了 1.0.2 或更新的 ESP32/Arduino 支持包。
* https://github.com/espressif/arduino-esp32/releases
*
* 文档: https://doc.blinker.app/
*       https://github.com/blinker-iot/blinker-doc/wiki
*
* *****************************************************************/
#define BLINKER_WIFI
#define BLINKER_MIOT_SENSOR

#include <ArduinoJson.h>
#include <Blinker.h>


#include <CN_SSD1306.h>

#include "codetab.c"   //字库

#define OLED_SDA 2
#define OLED_SCL 14

CN_SSD1306 lucky(OLED_SDA, OLED_SCL);//2 -- sda,14 -- scl IIC的引脚定义

BlinkerNumber HUMI("humi");//Blinker上按键
BlinkerNumber TEMP("temp");

#include <DHT.h>

#define DHTPIN 2

#define DHTTYPE DHT11   // DHT 11

char auth[] = "********";
char ssid[] = "********";
char pswd[] = "********";

DHT dht(5, DHTTYPE);//DHT11引脚

uint32_t read_time = 0;

float humi_read, temp_read;

int wind_wifi,temp_wifi,weather_wifi,wind_ang_wifi;

const char* wind_dir_wifi;

void miotQuery(int32_t queryCode)//小爱回调 函数
{
    BLINKER_LOG("MIOT Query codes: ", queryCode);

    switch (queryCode)
    {
      case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("MIOT Query All");
            BlinkerMIOT.humi((int)humi_read);
            BlinkerMIOT.temp(temp_read);
            BlinkerMIOT.print();
            break;
      default :
            BlinkerMIOT.temp(20);
            BlinkerMIOT.humi(20);
            BlinkerMIOT.print();
            break;
    }
}

void dataStorage() {//数据储存函数
    Blinker.dataStorage("tempkey", temp_read);
    Blinker.dataStorage("humikey", humi_read);
}

void heartbeat()
{
    HUMI.print(humi_read);
    TEMP.print(temp_read);
}

void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

    Blinker.vibrate();
   
    uint32_t BlinkerTime = millis();
   
    Blinker.print("millis", BlinkerTime);
}



void weatherData(const String & data)//天气获取
{
    BLINKER_LOG("weather: ", data);
   StaticJsonDocument<400> doc;
    DeserializationError error = deserializeJson(doc, data);
    if(error)
    {
   //显示获取失败
      return;
    }
    const char* cloud = doc["cloud"]; // "0"
    const char* cond_code = doc["cond_code"]; // "101"
    const char* cond_txt = doc["cond_txt"]; // ""
    const char* fl = doc["fl"]; // "31"
    const char* hum = doc["hum"]; // "81"
    const char* pcpn = doc["pcpn"]; // "0.0"
    const char* pres = doc["pres"]; // "997"
    const char* tmp = doc["tmp"]; // "28"
    const char* vis = doc["vis"]; // "16"
    const char* wind_deg = doc["wind_deg"]; // "159"
    const char* wind_dir = doc["wind_dir"]; // 风向
    const char* wind_sc = doc["wind_sc"]; // "2"
    const char* wind_spd = doc["wind_spd"]; // "9"

    temp_wifi = atoi(tmp);//atoi是将字符型转化为数字 详见菜鸟教程:https://www.runoob.com/cprogramming/c-function-atoi.html
    wind_wifi = atoi(wind_spd);
    weather_wifi = atoi(cond_code);
    wind_ang_wifi = atoi(wind_deg);
}


void setup()//启动函数
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);

    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);

    Blinker.begin(auth, ssid, pswd);
    Blinker.attachData(dataRead);
    lucky.Initial();//OLED初始化
    Blinker.attachHeartbeat(heartbeat);//*
    Blinker.attachDataStorage(dataStorage);//开启历史储存功能
    BlinkerMIOT.attachQuery(miotQuery);

    dht.begin();//*

   
    lucky.Fill_Screen(0x00);//清空屏幕
   
    lucky.ShowCN(6*16,2,18);//列 行 周
    lucky.ShowCN(2*16,2,14);//列 行 .
    Blinker.setTimezone(8.0);//时区设置
   
    Blinker.attachWeather(weatherData);
   
}

void loop()
{
    Blinker.run();
    if (read_time == 0 || (millis() - read_time) >= 2000)
    {
      read_time = millis();

      float h = dht.readHumidity();
      float t = dht.readTemperature();      

      if (isnan(h) || isnan(t)) {
            BLINKER_LOG("Failed to read from DHT sensor!");
            return;
      }

      float hic = dht.computeHeatIndex(t, h, false);

      humi_read = h;
      temp_read = t;

      int8_t sec = Blinker.second();
      if((sec%10) < 5)//显示屋内温度情况
      {
          lucky.ShowCN(0,4,0);//列 行 温
          lucky.ShowCN(16,4,1);//列 行 度
          lucky.ShowCN(32,4,3);//列 行 :
          lucky.ShowCN(112,4,15);//列 行 ℃
   
          lucky.ShowCN(0,6,2);//列 行 湿
          lucky.ShowCN(16,6,1);//列 行 度
          lucky.ShowCN(32,6,3); //列 行 :
          lucky.ShowCN(112,6,16);//列 行 ℃
          if(t>=0)
          {
            lucky.ShowCN(48,4,(int)t/10+4);//列 行 温度十位
            lucky.ShowCN(64,4,(int)t%10+4);//列 行 温度个位
            lucky.ShowCN(80,4,14);//列 行 .
            lucky.ShowCN(96,4,10*(t-(int)t)+4);//列 行 温度小数
          }
          else//温度小于0度时显示下面
          {
            
          }
          lucky.ShowCN(48,6,(int)h/10+4);//列 行 湿度十位
          lucky.ShowCN(64,6,(int)h%10+4);//列 行 湿度个位
          lucky.ShowCN(80,6,14);//列 行 .
          lucky.ShowCN(96,6,4);//列 行 温度小数
      }
      if((sec%10) >= 5)//显示天气情况
      {
          if(sec == 58)//每一分钟查询一次
            Blinker.weather("shijiazhuang");//默认查询设备ip所属地区的当前时刻的天气情况
         
          lucky.ShowCN(0,6,0);//列 行 温
          lucky.ShowCN(16,6,1);//列 行 度
          lucky.ShowCN(32,6,(int)temp_wifi/10+4);//列 行 温度十位
          lucky.ShowCN(48,6,(int)temp_wifi%10+4);//列 行 温度个位
          lucky.ShowCN(16*4,6,41);//列 行 温度个位
          lucky.ShowCN(16*5,6,42);//列 行 温度个位
          lucky.ShowCN(16*6,6,(int)wind_wifi/10+4);//列 行 风速十位
          lucky.ShowCN(16*7,6,(int)wind_wifi%10+4);//列 行 风速个位
          //以下是对天气反馈
          lucky.ShowCN(0,4,43);//列 行 空白字符
          lucky.ShowCN(16,4,43);//列 行 空白字符
          lucky.ShowCN(32,4,43);//列 行 空白字符
          lucky.ShowCN(48,4,43);//列 行 空白字符
          if(weather_wifi == 100)
          {
            lucky.ShowCN(16,4,26);//列 行 晴
            }
          else if(weather_wifi == 101)//多云
          {
            lucky.ShowCN(16,4,27);//列 行 多
            lucky.ShowCN(32,4,28);//列 行 云
            }
          else if(weather_wifi == 102)//少云
          {
            lucky.ShowCN(16,4,45);//列 行 多
            lucky.ShowCN(32,4,28);//列 行 云
            }
          else if(weather_wifi == 103)//晴间多云
          {
            lucky.ShowCN(16,4,44);//列 行 阴
            }
          else if(weather_wifi == 104)//阴
          {
            lucky.ShowCN(16,4,29);//列 行 阴
            }
          else if(weather_wifi>=200 &&weather_wifi<=204)//微风
         {
            lucky.ShowCN(16,4,50);//列 行 微
            lucky.ShowCN(32,4,41);//列 行 风
             }
          else if(weather_wifi>=205 &&weather_wifi<=213)//大风
         {
            lucky.ShowCN(16,4,34);//列 行 大
            lucky.ShowCN(32,4,41);//列 行 风
             }
          else if(weather_wifi==300 || weather_wifi==301)//阵雨
         {
            lucky.ShowCN(16,4,30);//列 行 阵
            lucky.ShowCN(32,4,31);//列 行 雨
             }
          else if(weather_wifi==302 || weather_wifi==303)//雷阵雨
         {
            lucky.ShowCN(16,4,46);//列 行 雷
            lucky.ShowCN(32,4,30);//列 行 阵
            lucky.ShowCN(48,4,31);//列 行 雨
             }
          else if(weather_wifi == 305 || weather_wifi == 309)//小雨
          {
            lucky.ShowCN(16,4,32);//列 行 小
            lucky.ShowCN(32,4,31);//列 行 雨
            }
          else if(weather_wifi == 306 ||weather_wifi == 314)//中雨
          {
            lucky.ShowCN(16,4,33);//列 行 中
            lucky.ShowCN(32,4,31);//列 行 雨
            }
          else if(weather_wifi == 307 ||weather_wifi == 308 || weather_wifi ==315)//大雨
          {
            lucky.ShowCN(16,4,34);//列 行 大
            lucky.ShowCN(32,4,31);//列 行 雨
            }
          else if(weather_wifi == 500 ||weather_wifi == 501)//雾
          {
            lucky.ShowCN(16,4,51);//列 行 雾
            }
          else if(weather_wifi == 514 ||weather_wifi == 515)//大雾
          {
            lucky.ShowCN(16,4,34);//列 行 大
            lucky.ShowCN(32,4,51);//列 行 雾
            }
          else if(weather_wifi <= 513 && weather_wifi >= 511)//霾
          {
            lucky.ShowCN(16,4,36);//列 行 霾
            }
          else if(weather_wifi == 502)//霾
          {
            lucky.ShowCN(16,4,36);//列 行 霾
            }
         else
            {
            //返回错误代码
            }

         //以下返回风向
         lucky.ShowCN(4*16,4,43);//列 行 空白字符
         if(wind_ang_wifi == 90)
         {
            lucky.ShowCN(5*16,4,37);//列 行 东
            lucky.ShowCN(6*16,4,41);//列 行 风
            lucky.ShowCN(7*16,4,43);//列 行 空白字符
            }
            else if(wind_ang_wifi ==270)
         {
            lucky.ShowCN(5*16,4,38);//列 行 西
            lucky.ShowCN(6*16,4,41);//列 行 风
            lucky.ShowCN(7*16,4,43);//列 行 空白字符
            }
            else if(wind_ang_wifi == 180)
         {
            lucky.ShowCN(5*16,4,39);//列 行 南
            lucky.ShowCN(6*16,4,41);//列 行 风
            lucky.ShowCN(7*16,4,43);//列 行 空白字符
            }
            else if(wind_ang_wifi == 360 ||wind_ang_wifi == 0)
         {
            lucky.ShowCN(5*16,4,40);//列 行 北
            lucky.ShowCN(6*16,4,41);//列 行 风
            lucky.ShowCN(7*16,4,43);//列 行 空白字符
            }
            else if(wind_ang_wifi > 0 && wind_ang_wifi<90)
         {
            lucky.ShowCN(5*16,4,37);//列 行 东
            lucky.ShowCN(6*16,4,40);//列 行 北
            lucky.ShowCN(7*16,4,41);//列 行 风
            }
            else if(wind_ang_wifi > 90 && wind_ang_wifi<180)
         {
            lucky.ShowCN(5*16,4,37);//列 行 东
            lucky.ShowCN(6*16,4,39);//列 行 南
            lucky.ShowCN(7*16,4,41);//列 行 风
            }
            else if(wind_ang_wifi > 180 && wind_ang_wifi<270)
         {
            lucky.ShowCN(5*16,4,38);//列 行 西
            lucky.ShowCN(6*16,4,39);//列 行 南
            lucky.ShowCN(7*16,4,41);//列 行 风
            }
             else if(wind_ang_wifi > 270 && wind_ang_wifi<360)
         {
            lucky.ShowCN(5*16,4,38);//列 行 西
            lucky.ShowCN(6*16,4,40);//列 行 北
            lucky.ShowCN(7*16,4,41);//列 行 风
            }
      }
      BLINKER_LOG("Humidity: ", h, " %");
      BLINKER_LOG("Temperature: ", t, " *C");
      BLINKER_LOG("Heat index: ", hic, " *C");
    }
    if(1)
    {
      uint32 times = Blinker.time();
      int8_t hour = Blinker.hour();
      int8_t min = Blinker.minute();
      int8_t sec = Blinker.second();
      lucky.ShowCN(0,0,(int)hour/10+4);//列 行 小时十位
      lucky.ShowCN(16,0,(int)hour%10+4);//列 行 小时个位
      lucky.ShowCN(2*16,0,3);//列 行 :
      lucky.ShowCN(3*16,0,min/10+4);//列 行 分钟十位
      lucky.ShowCN(4*16,0,min%10+4);//列 行 分钟个位
      lucky.ShowCN(5*16,0,3);//列 行 :
      lucky.ShowCN(6*16,0,sec/10+4);//列 行 秒十位
      lucky.ShowCN(7*16,0,sec%10+4);//列 行 秒个位
      int8_t month = Blinker.month();
      int8_t mday = Blinker.mday();
      lucky.ShowCN(0,2,(int)month/10+4);//列 行 月十位
      lucky.ShowCN(16,2,(int)month%10+4);//列 行 月个位
      
      lucky.ShowCN(3*16,2,mday/10+4);//列 行 日十位
      lucky.ShowCN(4*16,2,mday%10+4);//列 行 日个位
      
      int8_t wday = Blinker.wday();
      switch(wday){
         case 0://周日
            lucky.ShowCN(7*16,2,19);//列 行 日
      break;
          case 1://周一
            lucky.ShowCN(7*16,2,20);//列 行 日
      break;
          case 2:
            lucky.ShowCN(7*16,2,21);//列 行 日
      break;
         case 3://周三
            lucky.ShowCN(7*16,2,22);//列 行 日
      break;
      case 4:
            lucky.ShowCN(7*16,2,23);//列 行 日
      break;
      case 5:
            lucky.ShowCN(7*16,2,24);//列 行 日
      break;
      case 6:
            lucky.ShowCN(7*16,2,25);//列 行 日
      break;
      }
    }
}



代码文件:
链接:https://pan.baidu.com/s/1ru37T2ew3RIxJHrDyxEceQ
提取码:edt2

a7178636965 发表于 2020-2-1 12:46

ESP8266通过Arduino开发驱动IIC接口OLED的地址:https://blog.csdn.net/m0_37340681/article/details/84332777

864829550 发表于 2020-5-11 08:19

OLED屏幕出现乱码怎么解决,取字模也是按照教程来的

mr7 发表于 2020-5-11 22:21

感觉还可以进一步提升

tnn0220 发表于 2020-5-24 19:53

编译时卡在 StaticJsonDocument<400> doc;
报错:StaticJsonDocument was not dealared in this scope 请问楼主是何问题。
页: [1]
查看完整版本: 基于Blinker的天气查询和温湿度节点