Наболело - надоело DS1307+ИК приемник+LCD+433Mhz

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

  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(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))
        {
         
         mySwitch.send(836656,24); // если код код получен зажигаем зал
        }
     
        delay (500);  
        irrecv.resume();
      }
     
    }


     
    Отправляю с ИК пульта от ТВ команду на ИК приемник- ик приеник принимает код пульта philips 0x10037 и ардуина через 433 Transmitted отправляет команду на люстру в которой установлены реле. Собственно все работает. НО

    1. Когда отключаю питание от ардуино - часы отстают, т.е. если отключил на 30 минут не заметно отставание, если на 2 дня, то все время ставить по новой и разница аж в несколько часов ((((
    2. Как добавить в данный код такую логику: нажал кнопку на пульте (кнопка всегда одна и та же) - послалась 1 - команда на люстру, нажал еще раз -2 я , нажал 3-й - еще 1 команда. Спасибо.
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Т.е. нужно перебирать команды? Для этого введите счетчик нажатий, зациклите его по количеству команд и из массива выбирайте код команды.
     
  3. Максим B

    Максим B Гуру

    Я думал уже об этом - попробую код написать. Отпишусь.
     
  4. Максим B

    Максим B Гуру

    Вот сделал, но почему-то не хотит работать (((


    Код (Text):


    int push_button=0;

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

        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);
    }

     
     
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    if (push_button==0){regim3;} - а вот эта запись что делать должна? Здесь нет вызова функции.
     
    Максим B нравится это.
  6. Максим B

    Максим B Гуру

    Поправил на
    Код (Text):

     if (push_button==0){regim3();}
            if (push_button==1){regim1();}
            if (push_button==2){regim2();}

     
    Вроде заработало. Осталось с часами разобраться.
     
  7. JEKONYA

    JEKONYA Нерд

    По поводу часов

     
    Максим B нравится это.
  8. Максим B

    Максим B Гуру

    Хм.... ооочень интересно на самом деле. На деле сами не пробовали???
     
  9. JEKONYA

    JEKONYA Нерд

    Пробовал, стало намного точнее, но все равно за несколько дней убежали на 10 секунд вперед, ставил кварц с материнки, подумываю еще раз попробовать сменить кварц, а вообще лучше взять другой модуль:)
     
  10. Максим B

    Максим B Гуру

    Вот и я о том же- везде данный модуль пользуют и у всех одни и теже проблемы. Интересно почему же на материнках он работает отлично (я про кварц), а на данный модуль ставят фигню ((( Типа дешевле?
     
  11. JEKONYA

    JEKONYA Нерд

    разумеется)))