一个不错的arduino项目,自画板子做了一个智能排查项目
用到的元器件有esp8266、eda做的pcb版子、降压模块、继电器
用blink控制继电器来控制排查的电源开关。
代码如下
#define BLINKER_WIFI
#include <Blinker.h>
#include <Arduino.h>
#include <U8g2lib.h>//oled驱动库
#include <Wire.h>//IIC库
#include "DHT.h" //加载DHT11的库
#define DHTTYPE DHT11 // 定义传感器 DHT11
#define DHTPIN 12 //宏定义DHT数据接口,编译时DHTPIN会替换成2
int button1Flag = 0;
int button2Flag = 0;
DHT dht(DHTPIN, DHTTYPE);//声明 dht 函数(创建对象)
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);//定义oled屏幕型号
char auth[] = "20a15e6b4d69";
char ssid[] = "MMM";
char pswd[] = "331388572";
BlinkerNumber HUMI("humi");//湿度数据键
BlinkerNumber TEMP("temp");//温度数据键
BlinkerText Button1State("text1");//显示插口1状态
BlinkerText Button2State("text2");//显示插口2状态
BlinkerButton BUTTON1("button1");
BlinkerButton BUTTON2("button2");
float humi = 0, temp = 0;
long now = 0;//当前时间
long lastTime = 0;//上次的时间
//oled刷新
void printOled()
{
u8g2.setFont(u8g2_font_crox2hb_tr); //定义字符集
u8g2.setFontDirection(0);//设置字体方向
u8g2.clearBuffer();//清除屏幕缓冲区内容
u8g2.setCursor(10, 20);
u8g2.print("temp:");
u8g2.print(temp);
u8g2.print("C");
u8g2.setCursor(10, 40);
u8g2.print("humi:");
u8g2.print(humi);
u8g2.print("%");
u8g2.sendBuffer();//发送数据到屏幕缓冲区
}
//心跳包
void heartbeat()
{
HUMI.print(humi);
TEMP.print(temp);
}
//按键一回调函数
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);
if( button1Flag==0 ){
digitalWrite(13,LOW);//按键1打开
Button1State.print("状态:开");
button1Flag = 1;
}else{
digitalWrite(13,HIGH);//按键1关闭
Button1State.print("状态:关");
button1Flag = 0;
Blinker.vibrate();
}
}
//按键二回调函数
void button2_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);
if( button2Flag==0 ){
digitalWrite(14,LOW);;//按键2打开
Button2State.print("状态:开");
button2Flag = 1;
}else{
digitalWrite(14,HIGH);;//按键2关闭
Button2State.print("状态:关");
button2Flag=0;
Blinker.vibrate();
}
}
void setup()//程序进来最先执行这个函数,只执行一次
{
Serial.begin(115200);//定义硬串口,初始化串口波特率为115200
u8g2.begin();//oled驱动显示库初始化
pinMode(13,OUTPUT);//定义IO13口为输出口(继电器输入引脚)
digitalWrite(13,HIGH);//IO13口输出高电平(继电器低电平有效)
pinMode(14,OUTPUT);//定义IO14口为输出口(继电器输入引脚)
digitalWrite(14,HIGH);//IO14口输出高电平(继电器低电平有效)
u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function//支持UTF-8字符集
BLINKER_DEBUG.stream(Serial);//blinker日志打印到串口
//BLINKER_DEBUG.debugAll();
Blinker.begin(auth, ssid, pswd);
Blinker.attachHeartbeat(heartbeat);//注册心跳包
BUTTON1.attach(button1_callback);//注册按键一回调函数
BUTTON2.attach(button2_callback);//注册按键二回调函数
dht.begin();//dht传感器库初始化
}
void loop()//程序进来执行完setup()后就会进入这里面一直循环执行,没有结束,除非程序跑死。
{
Blinker.run();
now = millis();//获取系统运行时长(ms)
if(now - lastTime >=5000)
{
lastTime = now;
getSensorData();//获取传感器数据
sendSensorDataToBlinker();//将数据发送
printOled();//刷新屏幕
}
}
void getSensorData()
{
humi = dht.readHumidity();//读取湿度
temp = dht.computeHeatIndex(dht.readTemperature(), humi, false);//读取摄氏度,用摄氏度计算酷热指数,摄氏度设参数为false
}
void sendSensorDataToBlinker()
{
HUMI.print(humi);
TEMP.print(temp);
if(digitalRead(13) == LOW){
Button1State.print("状态:开");
}else{
Button1State.print("状态:关");
}
if(digitalRead(14) == LOW){
Button2State.print("状态:开");
}else{
Button2State.print("状态:关");
}
}
电路图如下: