1. Chú ý: Các bạn nên tham khảo Nội quy trước khi viết bài (click vào liên kết bên dưới).
    * Nội quy và Thông báo diễn đàn CNCProVN.com
    * Nếu bạn thấy hứng thú với bài viết. Hãy dùng chức năng Share to facebook để chia sẻ bài viết lên facebook.

          
Kết quả 1 đến 6 của 6

Chủ đề: ESP8266 - dùng Blynk tắt mở theo điều kiện thời gian (time schedule)

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Thợ bậc 6 CKD's Avatar
    Ngày tham gia
    Nov 2013
    Bài viết
    6,681
    Cám ơn
    1,737
    Được cám ơn 5,330 lần
           ở 2,595 bài viết
    Cập nhật full code để anh em thử nghiệm nhe.
    Soft dùng Arduino IDE
    Hardware dùng ESP8266 V1

    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);
    }
    DT: O7837277II - CKD's Youtube Channel - Facebook - Tổng hợp chủ đề
    17 ds 3, Thạnh Mỹ Lợi, Q2, tp.HCM

  2. Thành viên đã cám ơn CKD cho bài viết hữu ích này:


Các Chủ đề tương tự

  1. Trả lời: 6
    Bài viết cuối: 06-12-2019, 05:47:05 AM
  2. Trả lời: 1
    Bài viết cuối: 31-08-2017, 06:54:40 AM
  3. Mach3 - ToolPath On/Off - giảm thời gian Load file khi chạy 3D
    Bởi CKD trong diễn đàn Phần mềm CAD, CAM và các tiện ích
    Trả lời: 2
    Bài viết cuối: 07-08-2017, 09:54:17 PM
  4. Xin hỏi. tính toán thời gian gia công GCode
    Bởi diepckk25 trong diễn đàn Phần mềm CAD, CAM và các tiện ích
    Trả lời: 1
    Bài viết cuối: 09-06-2017, 10:31:58 PM
  5. Hỏi cách tính thời gian chạy G-code
    Bởi h-d trong diễn đàn Thắc mắc
    Trả lời: 6
    Bài viết cuối: 20-01-2016, 08:33:26 AM

Tag của Chủ đề này

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •