Mã:
/*************************************************************
* Ví dụ tắt mở theo lịch hẹn trước
* Người viết: Phạm Duy Anh - phamduyanh@gmail.com
* Chia sẻ trên: cncprovn.com và youtube
*
* Ví dụ được tạo từ Example -> Blynk -> Boards_Wifi -> ESP8266_Standalone
* Mạch dùng ESP8266 V1, dung lượng 1MB, không có LED built IN.
* Do đó mình sẽ dùng widget displays LED để hiển thị trạng thái biến timeOnOff
* Đồng thời dùng Serial Monitor để theo dõi trạng thái TimeInput và timeOnOff
*
* Thư viện cần thêm:
* #include <TimeLib.h>
* #include <WidgetRTC.h>
*
* Thay đổi theo nhu cầu các biến:
* YourAuthToken
* YourNetworkName
* YourPassword
* #define LEDV V0 // hiển thị trạng thái biến timeOnOff
* #define timeShow V1 // hiển thị thời gian thự của thiết bị
* #define timeInput V2 // nhận dữ liệu cài đặt thời gian
*
* Khởi tạo các Widget
* WidgetLED LED(LEDV);
* WidgetRTC rtc;
*
* Chương trình
* showTime() // hiển thị thời gian thự của thiết bị mỗi giây một lần
* TimeAuto() // so sánh thời gian thực và lịch cài đặt
* twoDigits(int digits) // chuyển đổi thành 2 ký tự
*
* Lưu ý:
* Việc truy cập blynk chỉ nên thực hiện mỗi giây/lần hoặc chậm hơn.
*
*************************************************************/
/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <TimeLib.h> //https://github.com/PaulStoffregen/Time
#include <WidgetRTC.h>
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "YourAuthToken";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "YourNetworkName";
char pass[] = "YourPassword";
// khai báo biến cần dùng
bool timeOnOff = false;
bool oldtimeOnOff;
bool isFirstConnect;
unsigned int TimeStart, TimeStop;
byte dayStartSelect = 0;
byte dayStopSelect = 0;
int oldSecond, nowSecond;
#define LEDV V0 // hiển thị trạng thái biến timeOnOff
#define timeShow V1 // hiển thị giờ thật của thiết bị
#define timeInput V2 // nhận dữ liệu cài đặt thời gian
#define PinOut 2 //led built in
WidgetLED LED(LEDV);
WidgetRTC rtc;
void setup()
{
// Debug console
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
pinMode(PinOut, OUTPUT);
digitalWrite(PinOut, !timeOnOff);
}
void loop()
{
Blynk.run();
TimeAuto();
showTime();
}
BLYNK_CONNECTED()
{
Blynk.syncAll();
rtc.begin();
}
// timeInput là Virtual PIN mà mình đã setting trong dự án Blynk
// đoạn chương trình bên dưới sẽ tự động làm việc mỗi khi có sự thay đổi Time Input trên app Blynk
BLYNK_WRITE(timeInput)
{
Serial.println("Time Input");
TimeInputParam t(param); //blynk-library/src/WidgetTimeInput.h
// Process start time
if (t.hasStartTime())
{
TimeStart = t.getStartHour()*60 + t.getStartMinute();
}
else TimeStart = 0;
// Process stop time
if (t.hasStopTime())
{
TimeStop = t.getStopHour()*60 + t.getStopMinute();
}
else TimeStop = 0;
// Process Blynk TimeInput weekdays (1. Mon, 2. Tue, 3. Wed, 4. Thu, 5. Fri, 6. Sat, 7. Sun)
// Process RTC weekday(); (1. Sun, 2. Mon, 3. Tue, 4. Wed, 5. Thu, 6. Fri, 7. Sat)
// Bit dayStart/StopSelect (0. None 1. Sun, 2. Mon, 3. Tue, 4. Wed, 5. Thu, 6. Fri, 7. Sat)
dayStartSelect = 0;
dayStopSelect = 0;
for (int i = 1; i <= 7; i++)
{
if (t.isWeekdaySelected(i))
{
if (i == 7) bitWrite(dayStartSelect, 1, 1);
else bitWrite(dayStartSelect, i+1, 1);
if (TimeStop < TimeStart)
if (i == 6) bitWrite(dayStopSelect, 1, 1);
else if (i == 7) bitWrite(dayStopSelect, 2, 1);
else bitWrite(dayStopSelect, i+2, 1);
else
if (i == 7) bitWrite(dayStopSelect, 1, 1);
else bitWrite(dayStopSelect, i+1, 1);
}
}
}
// đoạn chương trình sẽ kiểm tra điều kiện và bật/tắt biến timeOnOff
void TimeAuto()
{
unsigned int times = hour()*60 + minute();
byte today = weekday(); //the weekday now (Sunday is day 1, Monday is day 2)
if (bitRead(dayStartSelect, today))
{
if (TimeStart == TimeStop) timeOnOff = false;
else if (TimeStart <= times) timeOnOff = true;
}
if (bitRead(dayStopSelect, today))
{
if ((TimeStart < TimeStop ) && (TimeStop <= times)) timeOnOff = false;
if ((TimeStop < TimeStart) && (TimeStop <= times) && (times < TimeStart)) timeOnOff = false;
if ((TimeStop < TimeStart) && !bitRead(dayStartSelect, today) && (TimeStop <= times)) timeOnOff = false;
}
}
void showTime()
{
nowSecond = second();
if (oldSecond != nowSecond)
{
oldSecond = nowSecond;
String currentTime;
if (isPM()) currentTime = twoDigits(hourFormat12()) + ":" + twoDigits(minute()) + ":" + twoDigits(second()) + " PM";
else currentTime = twoDigits(hourFormat12()) + ":" + twoDigits(minute()) + ":" + twoDigits(second()) + " AM";
Blynk.virtualWrite(timeShow, currentTime);
if (oldtimeOnOff != timeOnOff)
{
if (timeOnOff)
{
LED.on();
digitalWrite(PinOut, !timeOnOff);
Serial.println("Time schedule is ON");
}
else
{
LED.off();
digitalWrite(PinOut, !timeOnOff);
Serial.println("Time schedule is OFF");
}
oldtimeOnOff = timeOnOff;
}
}
}
String twoDigits(int digits)
{
if(digits < 10) return "0" + String(digits);
else return String(digits);
}