Поправить код

Тема в разделе "Микроконтроллеры AVR", создана пользователем Максим B, 23 окт 2018.

  1. Максим B

    Максим B Гуру

    Всем привет. Давно уже не писал тут, собственно помогите поправить код:

    Код (Text):

    #include "Wire.h"
    #define DS1307_I2C_ADDRESS 0x68

    #include "OasisLED.h"
    #include <Arduino.h>

    #include <IRremote.h>
    #include <RCSwitch.h>


    int RECV_PIN = 11;

    uint8_t clockPin = 3;
    uint8_t strobePin = 2;
    uint8_t dataPin = 4;
    OasisLED ledDisplay = OasisLED(clockPin, strobePin, dataPin);

    IRrecv irrecv(RECV_PIN);
    decode_results results;
    RCSwitch mySwitch = RCSwitch();


    byte decToBcd(byte val)
    {
      return ( (val/10*16) + (val%10) );
    }

    byte bcdToDec(byte val)
    {
      return ( (val/16*10) + (val%16) );
    }

    void setDateDs1307(byte second,        // 0-59
                       byte minute,        // 0-59
                       byte hour,          // 1-23
                       byte dayOfWeek,     // 1-7
                       byte dayOfMonth,    // 1-28/29/30/31
                       byte month,         // 1-12
                       byte year)          // 0-99
    {
       Wire.beginTransmission(DS1307_I2C_ADDRESS);
       Wire.write(0);
       Wire.write(decToBcd(second));    
       Wire.write(decToBcd(minute));
       Wire.write(decToBcd(hour));    
       Wire.write(decToBcd(dayOfWeek));
       Wire.write(decToBcd(dayOfMonth));
       Wire.write(decToBcd(month));
       Wire.write(decToBcd(year));
       Wire.endTransmission();
    }

    void getDateDs1307(byte *second,
              byte *minute,
              byte *hour,
              byte *dayOfWeek,
              byte *dayOfMonth,
              byte *month,
              byte *year)
    {

      Wire.beginTransmission(DS1307_I2C_ADDRESS);
      Wire.write(0);
      Wire.endTransmission();

      Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

      *second     = bcdToDec(Wire.read() & 0x7f);
      *minute     = bcdToDec(Wire.read());
      *hour       = bcdToDec(Wire.read() & 0x3f);
      *dayOfWeek  = bcdToDec(Wire.read());
      *dayOfMonth = bcdToDec(Wire.read());
      *month      = bcdToDec(Wire.read());
      *year       = bcdToDec(Wire.read());
    }

    void setup()
    {
      byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
      Wire.begin();
      ledDisplay.initialize();
      Serial.begin(9600);

      irrecv.enableIRIn(); // Start the receiver
      mySwitch.enableTransmit(10);
      mySwitch.setPulseLength(237);
     
     
      second = 30;
      minute = 00;
      hour = 23;
      dayOfWeek = 7;
      dayOfMonth = 17;
      month = 5;
      year = 15;
    //  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
    }

    void loop()
    {
     printTime();

    }

    void printTime()
    {
         byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
             getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

            ledDisplay.setValue(hour*100+minute);
           
            if(irrecv.decode(&results))
      {
        Serial.println(results.value, HEX);
        if ((results.value == 0x36) || (results.value == 0x10036))
        {
         
         mySwitch.send(7652200,24);
        }
     
        delay (500);  
        irrecv.resume();
      }
     
    }


     
    Часы начинают отставать со временем. Как внести корректировку? Спасибо
     
  2. b707

    b707 Гуру

    Общий принцип такой - Допустим, часы отстают на секунду в сутки. Тогда раз в сутки, например в 00 часов - вызываете команду setDate с текущим временем + 1 секунда.

    Не в тот раздел запостили вопрос - причем тут Микроконтроллеры?
     
    DetSimen нравится это.
  3. DIYMan

    DIYMan Guest

    Лучшим выходом, пмсм, будет отказ от DS1307 в пользу DS3231 - они сильно точнее. Общение с ними на том уровне, что нужно вам - такое же.
     
    DetSimen нравится это.
  4. Максим B

    Максим B Гуру

    Заменил модуль. Понаблюдаю.