一、前言
使用esp8266、DHT11、0.96寸7脚oled和点灯科技平台,来制作一个当前室内温湿度+显示到oled上+上传到物联网平台使手机可以远程看到当前温湿度。
二、需要安装的库
安装ESP8266开发板的库
再在Arduino中安装OLED库(分别在搜索框中输入SSD1306(Adafruit SSD1306 by Adafruit库),然后再输入GFX(Adafruit GFX Library by Adafruit))
然后安装DHT传感器库(在搜索框中输入DHT(DHT sensor library by Adafruit库),我用的是1.4.4版本的)
最后装blinker Arduino库(blinker by i3water库),然后重启Arduino,库就安装好了。
三、接线
OLED屏接线:
4脚:3.3V --- VCC
G (GND) --- GND
D1(GPIO5)--- SCL
D2(GPIO4)--- SDA
7脚spi OLED屏幕改造成IIC屏幕:将模块背面的电阻R3换到R1位置,此时将模块切换为IIC接口;电阻R8可以用0欧姆电阻或是用焊锡短接电阻两端
7脚:CS---GND
DC---GND(在 IIC 通信中 DC 的高低电平是用来选择 IIC 通信地址的;当 DC 接地时 IIC从机地址为:0x78,当 DC 接高电平时 IIC 地址为 0x7A;测试程序中所用的为 0x78; 通常直接将 DC 接地)
RES---RES
D0 为 IIC 时钟线或者SCK为时钟线,
D1 为 IIC 数据线或者SDA为数据线;
GND---GND
VDD---VDD
DHT11接线:
VCC ---- 3V3(+)
GND --- -GND(-)
输出---- D5
四、下载配置Blinker
点我们新建的页面设置(右上角的…)中进行界面配置,把下面的内容全部复制到里面,然后点击更新配置:{¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/bg/f3.jpg¨¨isFull¨»}}¨dashboard¨|{¨type¨¨num¨¨t0¨¨实时温度¨¨ico¨¨fad fa-thermometer-three-quarters¨¨clr¨¨#EA0909¨¨min¨É¨max¨¢1c¨uni¨´℃´¨bg¨É¨cols¨Í¨rows¨Í¨key¨¨temp¨´x´É´y´Ë¨speech¨|÷¨lstyle¨Í}{ßCßDßE¨实时湿度¨ßG¨fad fa-humidity¨ßI¨#389BEE¨ßKÉßLº0ßM´%´ßNÉßOÍßPÍßQ¨humi¨´x´Í´y´ËßS|÷ßTÍ}{ßC¨cha¨ßNɨsty¨¨line¨ßI¨#076EEF¨¨sty1¨ßa¨clr1¨ßJ¨sty2¨ßa¨clr2¨ßWßOÑßPÍßQ´´´x´É´y´¤AßS|÷¨key0¨¨cha-humi¨ßE¨湿度¨ßTʨkey1¨´´¨t1¨´´}{ßC¨tex¨ßE´´ßk¨运行时间¨¨size¨¤EßNÉßG¨fad fa-signal¨ßOÍßPËßQ¨tex-s¨´x´Í´y´ÉßS|÷ßIßbßTÌ}{ßCßYßNÉßZßaßIßJßcßaßdßWßeßaßfßWßOÑßPÍßQ´´´x´É´y´ÏßS|÷ßTÊßg¨cha-temp¨ßE¨温度¨}{ßC¨deb¨¨mode¨ÉßNÉßOÑßPÌßQ¨debug¨´x´É´y´¤E}{ßCßlßE¨ESP8266温湿度计¨ßk¨DHT11+SSD1306¨ßn¨17¨ßNÉßG´´ßOÍßPËßQ¨state¨´x´É´y´ÉßS|÷ßTÌ}÷¨actions¨|÷¨triggers¨|÷´rt´|÷}
五、全部代码
只需要修改密钥、WIFI名称、WIFI密码:
char auth[] = "图2一步骤的密钥"; //点灯科技密钥
char ssid[] = "ssid"; //连接的WIFI名称
char pswd[] = "password"; //连接WIFI的密码
全部代码:
#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_MIOT_SENSOR
#include <Blinker.h>
//#include <ESP8266WiFiMulti.h>
char auth[] = "图2一步骤的密钥"; //点灯科技密钥
char ssid[] = "ssid"; //连接的WIFI名称
char pswd[] = "password"; //连接WIFI的密码
BlinkerNumber HUMI("humi");
BlinkerNumber TEMP("temp");
BlinkerText TEXT1("tex-s");
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#define DHTPIN 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
uint32_t read_time = 0;
float humi_read, temp_read;
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate(); //让手机震动
uint32_t BlinkerTime = millis();
Blinker.print("millis", BlinkerTime);
}
void dataStorage()
{
Blinker.dataStorage("cha-temp", temp_read);
Blinker.dataStorage("cha-humi", humi_read);
}
String rts()//计算运行时间
{
int rt =Blinker.runTime();
int r,e,f,s;
String fh;
Blinker.delay(100);
if(rt >= 86400)//天数
{r = rt / 86400;
e = rt / 3600 - r*24;
f = rt / 60 - r*1440 - e*60;
s = rt - r*86400 - e*3600 - f*60;}
else if(rt >= 3600)
{r = 0;
e = rt / 3600;
f = rt / 60 - e*60;
s = rt - e*3600 - f*60;}
else
{r = 0;
e = 0;
f = rt / 60;
s = rt - f*60;}
//BLINKER_LOG(r," ",e," ",f," ",s);//输出数据测试
if(f==0 & e==0 & r==0)
{fh = String("")+ s +"秒";}
else if(r == 0 & e == 0 )
{fh = String("")+ f + "分" + s +"秒";}
else if(r == 0)
{fh = String("")+ e + "时" + f + "分" + s +"秒"; }
else
{fh = String("")+ r + "天" + e + "时" + f + "分" + s +"秒";}
return(fh);
}
void heartbeat()//心跳
{
HUMI.print(humi_read);
TEMP.print(temp_read);
TEXT1.print(rts());
}
void setup()
{
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Blinker.attachHeartbeat(heartbeat);//附加心跳
Blinker.attachDataStorage(dataStorage);//附加数据存储
dht.begin();
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
Blinker.delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);
}
void loop()
{
Blinker.run();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t))
{
BLINKER_LOG("Failed to read from DHT sensor!");
}
else
{
// BLINKER_LOG("Humidity: ", h, " %");
//BLINKER_LOG("Temperature: ", t, " *C");
humi_read = h;
temp_read = t;
float hic = dht.computeHeatIndex(t, h, false);
// 显示
display.clearDisplay();
// 显示温度
display.setTextSize(3);
display.setCursor(0,5);
display.print(t);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");
// 显示湿度
display.setTextSize(3);
display.setCursor(0,40);
display.print(h);
display.print(" ");
display.setTextSize(2);
display.print("%");
//刷新显示
display.display();
}
Blinker.delay(60000);
}