前言
很久没有更新了,该好好反思了,废话不多说,fighting!
代码开源,喜欢的给个star吧!
git链接!!!
物联那点事儿专栏往期回顾:
- arduino+点灯科技+温湿度DHT11+esp01=自制网络温湿度计
- arduino+点灯科技+wifi继电器+esp01=网络远程控制开关机
- ardunio+点灯科技+温湿度+云存储=温湿度变化曲线
- arduino+点灯科技+DHT11+smartConfig=一键配网
- arduino+点灯科技+人体感应模块=红外安保
一、硬件
所需材料
1.nodemcu(这里就不做过多说明了)。
2.DS18B20(温湿度传感器)。
3.阻值大于4.7K的电阻一个(满足条件即可)。
4.杜邦线若干,面包板一个。(看具体实际要求)
硬件连线
在单片机中我们知道,单片机的io口接DS18B20需要一个上拉电阻,只是开发板在生产时便焊接好了上拉电阻,然后这个Nodemcu并没有上拉电阻,所以我们要自己接一个电阻,阻值范围大于4.7k,否则检测不到DS18B20设备接入Nodemcu上。
硬件连线入如下图所示:
程序部分
1.下载部分
下载DS18B20使用的库文件OneWire和DallasTemperature。
(可以手动在项目->加载库->管理库 中搜素对应的库文件进行下载安装)
OneWire库文件的作用是它的构造可以使Arduino指定应用于单总线的引脚,而DallasTemperature库文件的作用就是可以拿到DS18B20读取的温度数据,程序中必须包含这两个头文件。
2.代码解读
(1)引入blinker头文件和下载的OneWire.h、DallasTemperature.h头文件。
#define BLINKER_WIFI //定义wifi模块
#include <Blinker.h>
#include<OneWire.h>
#include<DallasTemperature.h>
2.定义要使用的引脚、全局变量和OneWire对象(13号引脚对应NodeMCU的D7)。
#define PIN 13 //定义DHT11模块连接管脚io2
//定义一个OneWire对象,并使用13引脚作为单总线的引脚
float temp_read = 0;//定义浮点型全局变量 储存传感器读取的温湿度数据
//单总线的引脚的对象作为传感器的参数。
DallasTemperature sensors(&onewire);
OneWire onewire(PIN);
3.使用SmartConfig技术给设备一键配网,原理类似wifi共享,比直接配网的可用性强。
void smartConfig()//配网函数
{
WiFi.mode(WIFI_STA);//使用wifi的STA模式
Serial.println("\r\nWait for Smartconfig...");//串口打印
WiFi.beginSmartConfig();//等待手机端发出的名称与密码
//死循环,等待获取到wifi名称和密码
while (1)
{
//等待过程中一秒打印一个.
Serial.print(".");
delay(1000);
if (WiFi.smartConfigDone())//获取到之后退出等待
{
Serial.println("SmartConfig Success");
//打印获取到的wifi名称和密码
Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
break;
}
}
}
void WIFI_Init()
{
Serial.println("\r\n正在连接");
//当设备没有联网的情况下,执行下面的操作
while(WiFi.status()!=WL_CONNECTED)
{
if(WIFI_Status)//WIFI_Status为真,尝试使用flash里面的信息去 连接路由器
{
Serial.print(".");
delay(1000);
count++;
if(count>=5)
{
WIFI_Status = false;
Serial.println("WiFi连接失败,请用手机进行配网");
}
}
else//使用flash中的信息去连接wifi失败,执行
{
smartConfig(); //smartConfig技术配网
}
}
//串口打印连接成功的IP地址
Serial.println("连接成功");
Serial.print("IP:");
Serial.println(WiFi.localIP());
}
4.温度回传给手机app端,提前定义blinker组件。
BlinkerNumber TEMP("temp"); //定义温度数据键名
void heartbeat()
{
TEMP.print(temp_read); //给blinkerapp回传温度数据
}
65setup主函数中对串口、blinker初始化操作和数据回传函数的回调。
void setup()
{
//初始化端口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
WIFI_Init();//调用WIFI函数
Blinker.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str());//运行blinker
Blinker.attachHeartbeat(heartbeat);//将传感器获取的数据传给blinker app上
}
6.loop函数中不停地读取温度,把读取温度操作放到loop函数中,并把读取到的温度赋值给全局变量。
Blinker.run();//运行Blinker
sensors.requestTemperatures();
Serial.write("温度:");
float t=sensors.getTempCByIndex(0);
temp_read=t;
Serial.print(t);
Serial.println("摄氏度");
delay(1000);
3.调试与结果
(1)串口监视器打印出的效果截图如下所示。
(2)