继上次nodemcu(esp8266)的小升级
为啥做这个呢,回家后每次睡觉不方便关灯,于是就想了这个,都是因为懒惰哈哈哈哈
上视频、看看实现啥了
实现:温湿度的上传,加上继电器开关等
nodemcu(esp8266)
硬件
面包板一个(其实不需要,纯属为了美观)
esp8266模块一个(应该叫nodemcu) 12.8元
继电器开关一个(1路5v) 4.2元
光敏电阻模块一个 3.2元
温湿度传感器一个 9元(严重怀疑买贵了)
杜邦线若干
软件配置的话直接看上一篇哦,有详细说明
https://blog.csdn.net/weixin_44695217/article/details/121429305?spm=1001.2014.3001.5502
程序代码
因为是在之前的舵机基础上改的代码,所以涉及到舵机程序可以忽略
里面的程序有详细的注释
#include <Servo.h>
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT
#include <Blinker.h>
#include <DHT.h>//包含DHT头文件
// oled用
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
//blinker 提供的key
char auth[] = " "; //点灯Key
char ssid[] = " "; //wifi名称
char pswd[] = " "; //wifi密码
//发送到 blinker 的湿度数据key,和blink组件名字相对应
BlinkerNumber HUMI("humi");
//发送到 blinker 的温度数据key
BlinkerNumber TEMP("temp");
BlinkerNumber LIGHT("Light"); //光敏电阻
float light=0;
/*-----------------------------开关继电器和舵机-------------------------------------------------*/
// 新建组件对象(按键+滑块)
BlinkerButton Button1("btn-maxm"); //位置1 按钮 数据键名
BlinkerButton Button2("btn-closed");
BlinkerSlider Slider1("max-num"); //位置1 滑块 数据键名 范围0-180
Servo myservo;
int servo_max=180;
int servo_close=0;
void button1_callback(const String & state) { //位置1 按钮
BLINKER_LOG("get button state: ", servo_max);
myservo.write(servo_max);
digitalWrite(D3, HIGH);
Blinker.vibrate();
/*--------2021.11.23添加舵机复位程序----------------------*/
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();//反馈状态
delay(1000);//延时1秒
myservo.write(72);//舵机归零,回到垂直状态
Blinker.vibrate();
}
void button2_callback(const String & state) { //位置1 按钮
BLINKER_LOG("get button state: ", servo_close);
myservo.write(servo_close);
digitalWrite(D3, LOW);
Blinker.vibrate();
/*--------2021.11.23添加舵机复位程序----------------------*/
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();//反馈状态
delay(1000);//延时1秒
myservo.write(72);//舵机归零,回到垂直状态
Blinker.vibrate();
}
/*
void slider1_callback(int32_t value)
{
BLINKER_LOG("get slider value: ", value);
servo_max = value;
Slider1.color("#1E90FF");
Slider1.print();
//digitalWrite(D3, value);
myservo.write(value);//如果包含这句,APP中的按键是不起作用的,只有滑块管用。
}
*/
/*-----------------------------引入 DHT 库,温湿度--------------------------------------------------*/
#define DHTPIN D6 // 定义温湿度引脚接D6
#define DHTTYPE DHT11 // 定义温湿度传感器的类型
DHT dht(DHTPIN, DHTTYPE); //生成DHT对象,参数是引脚和DHT的类型
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();//此函数用于返回Arduino板开始运行当前程序时的毫秒数。这个数字在大约50天后溢出,即回到零。
Blinker.print("millis", BlinkerTime);
}
/*---------------------------------心跳包,用来给blink发温湿度----------------------------------------------*/
void heartbeat()
{
HUMI.print(humi_read);
TEMP.print(temp_read);
LIGHT.print(light);
}
/*---------------------------------定义存储时间---------------------------------------------*/
void dataStorage() {
//添加数据存储 以便于图标数据展示
Blinker.dataStorage("humi", humi_read);
//添加数据存储 以便于图标数据展示
Blinker.dataStorage("temp", temp_read);
}
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); // 读取并在手机上打印时间
Blinker.attachHeartbeat(heartbeat);
Blinker.attachDataStorage(dataStorage);//函数的意思就是每次循环的时候就会调用上面的dataStorage函数,达到可以将每次获得的数据云存储的效果。
dht.begin();
u8g2.begin();
u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function
}
void loop()
{
Blinker.run();
/*--------------------------------------------------温湿度传感器设置 2022.1.20-------------*/
if (read_time == 0 || (millis() - read_time) >= 2000)
{
read_time = millis();
//读取湿度
float h = dht.readHumidity();
//读取温度
float t = dht.readTemperature();
// 读取华氏度
float f = dht.readTemperature(true);// 读取华氏度
// 判断读取是否成功,不成功则返回
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;
//
// BLINKER_LOG("Humidity: ", h, " %");
// BLINKER_LOG("Temperature: ", t, " *C");
// BLINKER_LOG("Heat index: ", hic, " *C");
// BLINKER_LOG("HuaTemp: ", f, " F");
}
/*---------------------------------- 光照检测模块加入,2021.12.21 -----------*/
light=digitalRead(D4); //读出D4的高低电平赋值给v
BLINKER_LOG("Light: ", light);
if(light==1)// 有光---0
digitalWrite(D1, HIGH);
else
digitalWrite(D1, LOW);
Blinker.delay(1000);//延时函数
/*------------------------oled显示-----------*/
u8g2.setFont(u8g2_font_unifont_t_chinese2); // use chinese2 for all the glyphs of "你好世界"
u8g2.setFontDirection(0);
u8g2.clearBuffer();
u8g2.setCursor(0, 15);
u8g2.print("temp:",temp_read);
u8g2.sendBuffer();
delay(2000);
// u8g2.setCursor(0, 15);
// u8g2.print("humi:",humi_read);
// u8g2.setCursor(0, 40);
// u8g2.print("我有一个美丽的"); // Chinese "Hello World"
u8g2.sendBuffer();
delay(2000);
}
/*
* sg90舵机:
5v--vv 信号线-----D2
温湿度:
D6----DA
光照:
D4
led:
D3
oled :
D7 (SCL) 和D8 SDA)
*/