|
这台设备可以在0.96寸OLED上显示DHT11读取到的温湿度,并且可以通过Blinker的时间获取和天气查询功能显示时间和天气情况。传感器DHT11温湿度和天气情况每5秒切换一次。
视频如下:视频地址:https://v.youku.com/v_show/id_XNDUyODYyNzM3Mg==.html
硬件连接:
主控 : ESP-12F
屏幕:0.96 SSD1306 OLED SCL GPIO14 | SDA GPIO2
温湿度传感器: DHT11 数据脚 GPIO5
天气获取可见大佬的帖子:[分享] 【已更新】ArduinoJson6结合blinker分析获取weather数据
DHT11接入可见另外一位大佬的帖子[使用文档] [Arduino物联网开发实战2]数据反馈
0.96寸OLED显示可见:ESP8266通过Arduino开发驱动IIC接口OLED
源码如下:
[mw_shl_code=arduino,true]/* *****************************************************************
*
* 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;
}
}
}[/mw_shl_code]
代码文件:
链接:https://pan.baidu.com/s/1ru37T2ew3RIxJHrDyxEceQ
提取码:edt2
|
|