標(biāo)題:
點(diǎn)燈科技可以定時(shí)控制的Arduino代碼分享
[打印本頁]
作者:
leanco
時(shí)間:
2022-11-14 00:10
標(biāo)題:
點(diǎn)燈科技可以定時(shí)控制的Arduino代碼分享
受限于點(diǎn)燈科技貧民版沒有定時(shí)的苦惱,我自己在代碼里面加了獲取網(wǎng)絡(luò)時(shí)間,然后根據(jù)本地設(shè)置的時(shí)間進(jìn)行定時(shí)開關(guān)任務(wù),代碼里面已經(jīng)備注了接線,和按鍵的控制方法,不明白的地方,歡迎留言討論
//接線:輸出口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; //按鈕開關(guān)
bool oState = false;
String str = "";//定義字符串為空,后面會用到,你這里不定義,后面用到的時(shí)候他會告訴你字符串沒有定義
String hour1 = "";
String min1 = "";
String sec1 = "";
int timeZone = 8; //東八區(qū)的時(shí)間
WiFiUDP ntpUDP;
#include <string.h>
String sethourK = "22";//幾點(diǎn)比如輸入01表示1點(diǎn),13表示13點(diǎn)
String setminK = "15";//幾分開比如輸入05表示5分,22表示22分
////////////////////////////
String sethourG = "22"; //幾點(diǎn)
String setminG = "16";//幾分關(guān)
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();//顯示獲取的時(shí)間,比如22:05:20
hour1 = str.substring(0, 2); //shi//截取小時(shí)
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("已設(shè)置開燈時(shí)間:");
Serial.print(sethourK);
Serial.print("點(diǎn)");
Serial.print(setminK);
Serial.println("分");
Serial.print("已設(shè)置關(guān)燈時(shí)間:");
Serial.print(sethourG);
Serial.print("點(diǎn)");
Serial.print(setminG);
Serial.println("分");*/
if (hour1 == sethourK and min1 == setminK) { //如果設(shè)置的小時(shí)等于獲取的小時(shí)
//digitalWrite(led, HIGH);
oState =1;
Serial.println("已開燈");
}
if (hour1 == sethourG and min1 == setminG) { //如果設(shè)置的小時(shí)等于獲取的小時(shí)
//digitalWrite(led, LOW);
oState =0;
Serial.println("已關(guān)燈");
}
}
void oled() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_unifont_t_chinese2); //設(shè)置OLED顯示的字體,需要支持的字體才行,可以去示例里面看
u8g2.setFontDirection(0);//不知道
u8g2.clearBuffer();//清空原來存在oled的圖像
u8g2.setCursor(0, 15);//設(shè)置開始顯示的位置
u8g2.print("開時(shí)間:");//顯示的內(nèi)容,用的print,就好比打印機(jī)打印
u8g2.setCursor(58, 15);
u8g2.print(sethourK);
u8g2.setCursor(74, 15);
u8g2.print(":");
u8g2.setCursor(81, 15);
u8g2.print(setminK);
u8g2.setCursor(0, 60);//設(shè)置開始顯示的位置
u8g2.print("關(guān)時(shí)間:");//顯示的內(nèi)容,用的print,就好比打印機(jī)打印
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);
}
復(fù)制代碼
作者:
zwf470
時(shí)間:
2022-11-15 21:34
謝謝樓主分享,希望可以把實(shí)物照片和電路連接圖發(fā)一下,再次感謝!
作者:
zying
時(shí)間:
2022-12-11 22:29
謝謝分享�。�!請問怎嗎編譯不成功。
2022-12-09_115053.png
(10.03 KB, 下載次數(shù): 148)
下載附件
2022-12-11 22:29 上傳
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1