受限于点灯科技贫民版没有定时的苦恼,我自己在代码里面加了获取网络时间,然后根据本地设置的时间进行定时开关任务,代码里面已经备注了接线,和按键的控制方法,不明白的地方,欢迎留言讨论
- //接线:输出口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);
- }
复制代码
|