标题:
点灯科技可以定时控制的Arduino代码分享
[打印本页]
作者:
leanco
时间:
2022-11-14 00:10
标题:
点灯科技可以定时控制的Arduino代码分享
受限于点灯科技贫民版没有定时的苦恼,我自己在代码里面加了获取网络时间,然后根据本地设置的时间进行定时开关任务,代码里面已经备注了接线,和按键的控制方法,不明白的地方,欢迎留言讨论
//接线:输出口4,按钮5,oled的SCL接2,SDA接
#include <Arduino.h>
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
#define BLINKER_WIFI
#define BLINKER_DUEROS_OUTLET
#include <Blinker.h>
char auth[] = "76ce30884a64";
char ssid[] = "MERCURY_0FE8";
char pswd[] = "12345678";
#define BUTTON_1 "ButtonKey"
BlinkerButton Button1(BUTTON_1);
const int led = 4; ////IO口
uint8_t bedroomdoorswitch = 5; //按钮开关
bool oState = false;
String str = "";//定义字符串为空,后面会用到,你这里不定义,后面用到的时候他会告诉你字符串没有定义
String hour1 = "";
String min1 = "";
String sec1 = "";
int timeZone = 8; //东八区的时间
WiFiUDP ntpUDP;
#include <string.h>
String sethourK = "22";//几点比如输入01表示1点,13表示13点
String setminK = "15";//几分开比如输入05表示5分,22表示22分
////////////////////////////
String sethourG = "22"; //几点
String setminG = "16";//几分关
unsigned long lastmill = 0;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", timeZone * 3600, 60000);
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 2, /* data=*/ 0, /* reset=*/ U8X8_PIN_NONE); // All Boards without Reset of the Display
//////////////////////////////////
void setup() {
Serial.begin(9600);
pinMode(bedroomdoorswitch, INPUT_PULLUP);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
BlinkerDuerOS.attachPowerState(duerPowerState);
BlinkerDuerOS.attachQuery(duerQuery);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
u8g2.begin();
u8g2.enableUTF8Print();
WiFi.begin(ssid, pswd);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
timeClient.begin();
}
void button1_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
if (state == BLINKER_CMD_ON) {
BLINKER_LOG("Toggle on!");
Button1.icon("icon_1");
Button1.color("#FFFFFF");
Button1.text("Your button name or describe");
Button1.print("on");
oState = true;
}
else if (state == BLINKER_CMD_OFF) {
BLINKER_LOG("Toggle off!");
Button1.icon("icon_1");
Button1.color("#FFFFFF");
Button1.text("Your button name or describe");
Button1.print("off");
oState = false;
}
BlinkerDuerOS.powerState(oState ? "on" : "off");
BlinkerDuerOS.report();
digitalWrite(led, oState);
}
void duerPowerState(const String & state) {
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON) {
digitalWrite(led, HIGH);
BlinkerDuerOS.powerState("on");
BlinkerDuerOS.print();
oState = true;
}
else if (state == BLINKER_CMD_OFF) {
digitalWrite(led, LOW);
BlinkerDuerOS.powerState("off");
BlinkerDuerOS.print();
oState = false;
}
}
void duerQuery(int32_t queryCode) {
BLINKER_LOG("DuerOS Query codes: ", queryCode);
switch (queryCode)
{
case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
BLINKER_LOG("DuerOS Query power state");
BlinkerDuerOS.powerState(oState ? "on" : "off");
BlinkerDuerOS.print();
break;
case BLINKER_CMD_QUERY_TIME_NUMBER :
BLINKER_LOG("DuerOS Query time");
BlinkerDuerOS.time(millis());
BlinkerDuerOS.print();
break;
default :
BlinkerDuerOS.powerState(oState ? "on" : "off");
BlinkerDuerOS.print();
break;
}
}
void dataRead(const String & data) {
BLINKER_LOG("Blinker readString: ", data);
BlinkerDuerOS.powerState("off");
BlinkerDuerOS.report();
}
void timer() {
timeClient.update();
str = timeClient.getFormattedTime();//显示获取的时间,比如22:05:20
hour1 = str.substring(0, 2); //shi//截取小时
min1 = str.substring(3, 5); //fen截取分钟
sec1 = str.substring(6, 8); //miao截取秒
/*Serial.println(timeClient.getFormattedTime());
Serial.println(hour1);//串口输出
Serial.println(min1);
Serial.println(sec1);
Serial.print("已设置开灯时间:");
Serial.print(sethourK);
Serial.print("点");
Serial.print(setminK);
Serial.println("分");
Serial.print("已设置关灯时间:");
Serial.print(sethourG);
Serial.print("点");
Serial.print(setminG);
Serial.println("分");*/
if (hour1 == sethourK and min1 == setminK) { //如果设置的小时等于获取的小时
//digitalWrite(led, HIGH);
oState =1;
Serial.println("已开灯");
}
if (hour1 == sethourG and min1 == setminG) { //如果设置的小时等于获取的小时
//digitalWrite(led, LOW);
oState =0;
Serial.println("已关灯");
}
}
void oled() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_unifont_t_chinese2); //设置OLED显示的字体,需要支持的字体才行,可以去示例里面看
u8g2.setFontDirection(0);//不知道
u8g2.clearBuffer();//清空原来存在oled的图像
u8g2.setCursor(0, 15);//设置开始显示的位置
u8g2.print("开时间:");//显示的内容,用的print,就好比打印机打印
u8g2.setCursor(58, 15);
u8g2.print(sethourK);
u8g2.setCursor(74, 15);
u8g2.print(":");
u8g2.setCursor(81, 15);
u8g2.print(setminK);
u8g2.setCursor(0, 60);//设置开始显示的位置
u8g2.print("关时间:");//显示的内容,用的print,就好比打印机打印
u8g2.setCursor(58, 60);
u8g2.print(sethourG);
u8g2.setCursor(74, 60);
u8g2.print(":");
u8g2.setCursor(81, 60);
u8g2.print(setminG);
u8g2.setFont(u8g2_font_inb16_mf);
u8g2.setCursor(0, 40);//
u8g2.print(str); //
u8g2.sendBuffer();
}
void key() {
if (digitalRead(bedroomdoorswitch) == LOW)
delay(50);
if (digitalRead(bedroomdoorswitch) == LOW) {
oState = !oState;
}
while (digitalRead(bedroomdoorswitch) == LOW) {}
digitalWrite(led, oState);
}
void loop() {
Blinker.run();
timer();
if (lastmill - millis() > 1000) {
oled();
}
key();
lastmill = millis();
digitalWrite(led, oState);
}
复制代码
作者:
zwf470
时间:
2022-11-15 21:34
谢谢楼主分享,希望可以把实物照片和电路连接图发一下,再次感谢!
作者:
zying
时间:
2022-12-11 22:29
谢谢分享!!!请问怎吗编译不成功。
2022-12-09_115053.png
(10.03 KB, 下载次数: 148)
下载附件
2022-12-11 22:29 上传
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1