Проверьте код.

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

  1. Максим B

    Максим B Гуру

    Всем привет. Использую данный код для управления люстрой через 433 передатчик и TSOP, а так же вывод времени через МК PT 6961 на экран-сегментный. Все работает. НО, как только отключаю из розетки, время отстает. DS3231 -выпаял диод, резистор и замкнул контакты- отставания остались. У меня етсь подозрение на мой код:

    Код (Text):

    #include "Wire.h"   //код полностью рабочий 2015
    #define DS1307_I2C_ADDRESS 0x68

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

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


    int RECV_PIN = 11;
    int push_button=0;

    long  buttons[]={836800,836656,836611};


    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(251);
     
     
      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 == 0x37) || (results.value == 0x10037) )
        {
            push_button++;
            if (push_button==0){regim3();}
            if (push_button==1){regim1();}
            if (push_button==2){regim2();}

    if (push_button>2){push_button=0;}
           // mySwitch.send(buttons[0],24);
        }
       
        delay (500);  
        irrecv.resume();
      }
       
    }

    void regim1()
    {
    mySwitch.send(buttons[0],24);
    }

    void regim2()
    {
    mySwitch.send(buttons[1],24);
    }

    void regim3()
    {
    mySwitch.send(buttons[2],24);
    }



     
     
  2. ostrov

    ostrov Гуру

    Насколько отстает? Сам rtc, если ему обеспечить автономное питание, отсчитывает время несмотря на обвязку и код. Может с питанем что то не то или сам модуль неисправный?
     
  3. Максим B

    Максим B Гуру

    Вот так еще не пробовал, т.к. когда подключал все было норм, потом сделал готовый проект и начались такие проблемы.
     
  4. ostrov

    ostrov Гуру

    Откройте уже тайну, на сколько отстает то? На час в сутки? Вообще стоит? Идет назад?
     
  5. Максим B

    Максим B Гуру

    Если заливаю код например в 23:00 подаю напругу - все ок, начинают сбиваться в среднем за где-то 5 суток на 1-2 минуты, но как только отключаю напряжение с мк и если подождать немного (минут 5) - начинают отставать в среднем на 2-3 минуты. И так далее, чем дольше были выключен - тем больше отставание
     
  6. ostrov

    ostrov Гуру

    Проверьте напряжение батарейки.
     
  7. Максим B

    Максим B Гуру

    Уже измерял 3.1V, заменил на 3.2 - наблюдаю