受限于點燈科技貧民版沒有定時的苦惱,我自己在代碼里面加了獲取網絡時間,然后根據本地設置的時間進行定時開關任務,代碼里面已經備注了接線,和按鍵的控制方法,不明白的地方,歡迎留言討論
- //接線:輸出口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);
- }
復制代碼
|