Chào các bạn!
Rất lâu rồi mới quay lại viết bài trên diễn đàn. Vì đã lâu không tham gia vào việc chế cháo cnc nên cũng không biết phải trao đổi thêm những gì.
Nay viết bài này cũng không liên quan gì đến CNC, mượn phòng Arduino để trao đổi/chia sẻ về việc lập trình ESP8266 một dự án mà mình có chia sẻ video trên youtube.
Nhu cầu là dùng ESP8266, lập lịch hẹn và tắt mở (relay chẵng hạn) theo lịch đã được lập trước đó.
Mô tả:
1. Lập trình Arduino, dùng phần cứng ESP8266. Kết nối qua wifi đến máy chủ Blynk.
2. Đăng ký tài khoản Blynk, tạo dự án mới (New Project), trong dự án đó có thêm vào
- RTC (xem link) đã được config đúng múi giờ.
- Time Input (xem link), tùy nhu cầu mà cài đặt, phần OUPUT đặt cho nó một Virtual PIN mà bạn muốn. Lưu ý xem thêm ấy cái ví dụ (VD 1, VD 2, VD 3)
- Thêm các Widgets hay ABC XYZ gì đó tùy bạn muốn.
3. Lập trình trên giao diện IDE cùa Arduino. Mấy phần khai báo, sử dụng, kết nối wifi, kết nối Blynk các bạn tự tham khảo thêm trên internet. Mình sẽ chỉ chi sẽ phần xử lý thời gian (time chedule) cho nó ngắn gọn.Khai báo sử dụng thư viện, có 2 thư viện cần cho việc này: WidgetRTC.h và TimeLib.h (xem link), ngoài ra còn các thư viện khác để có thể sử dụng ESP8266 và Blynk, các bạn tự thêm vào
Mã:// khai báo biến cần dùng unsigned int TimeStart, TimeStop; byte dayStartSelect = 0; byte dayStopSelect = 0; // 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) { 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 < Time1Start) 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); } } }
Mã:// khai báo biến cần dùng bool timeOnOff = false; // đ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 TimeAuto() sẽ đặt vào trong void loop của chương trình chính.
kiểm tra biến timeOnOff và thực thi công việc tùy theo nhu cầu (tắt mở relay chẵng hạn)
Chúc các bạn thành công!