Помогите поправить код ds3231 + buttons

Тема в разделе "Arduino & Shields", создана пользователем Максим B, 5 ноя 2020.

  1. Максим B

    Максим B Гуру

    Всем добрый вечер. Подскажите пожалуйста. Сделал настройку времени через кнопки: 2 кнопки - подключены к пинам 7 и 12. Сделал 2 функции: одна для увеличения минут, другая часов - соответственно. Но, когда нажимаю добавить час - добавляется так же минуты ((( .Как исправить?

    Весь код:

    Код (Text):


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

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

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

      byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

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

    int n=0;  // переключение режимов работы

    // constants won't change. They're used here to set pin numbers:
    const int BUTTON_PIN1 = 12; // the number of the pushbutton pin
    const int BUTTON_PIN2 = 7; // the number of the pushbutton pin
    const int LONG_PRESS_TIME  = 100; // 1000 milliseconds

    // Variables will change:
    int lastState = LOW;  // the previous state from the input pin
    int currentState;     // the current reading from the input pin
    unsigned long pressedTime  = 0;
    unsigned long releasedTime = 0;






    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()
    {
      pinMode(BUTTON_PIN1, INPUT_PULLUP);
      pinMode(BUTTON_PIN2, INPUT_PULLUP);
       
      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 = 00;
      minute = 28;
      hour = 16;
      dayOfWeek = 4;
      dayOfMonth = 5;
      month = 11;
      year = 20;
      //setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);   // установка даты
    }



    void loop()
    {
     // read the state of the switch/button:
      currentState = digitalRead(BUTTON_PIN1);

      if(lastState == HIGH && currentState == LOW)        // button is pressed
        pressedTime = millis();
      else if(lastState == LOW && currentState == HIGH) { // button is released
        releasedTime = millis();

        long pressDuration = releasedTime - pressedTime;

        if( pressDuration > LONG_PRESS_TIME )
        minPlus();  
      }

       // read the state of the switch/button:
      currentState = digitalRead(BUTTON_PIN2);

      if(lastState == HIGH && currentState == LOW)        // button is pressed
        pressedTime = millis();
      else if(lastState == LOW && currentState == HIGH) { // button is released
        releasedTime = millis();

        long pressDuration = releasedTime - pressedTime;

        if( pressDuration > LONG_PRESS_TIME )
        hourPlus();  
      }

      // save the the last state
      lastState = currentState;
     
      printTime();
      ledDisplay.toggleColon();
      delay (1000);  
      ledDisplay.toggleColon();
      delay(1000);
      ledDisplay.reset();
    }



    void minPlus()
    {
      getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &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());
     
      minute = minute + 1;
      setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);

    }

    void hourPlus()
    {
      getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &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());
     
      hour = hour + 1;
      setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);

    }


    void printTime()
    {
      getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
      ledDisplay.setValue(hour*100+minute);
           
    }
     
     
  2. parovoZZ

    parovoZZ Гуру

    если надо различать состояния кнопок, то создавай структуру для каждой кнопки и в её поля записывай значения кнопок для каждой по отдельности. А так ты запутаешься в конец.
     
  3. Максим B

    Максим B Гуру

    Так не смогу, сделал по другому опрос кнопок. Теперь сотался вопрос- как изменить только часы и отрисовать их верно.
     
  4. Airbus

    Airbus Радиохулиган Модератор

    У Вас currentState один и для минут и для часов. Поэтому меняя одно автоматически меняется другое. Переименуйте одно из них а лучше оба. Например minState и horState чтоб было два разных статуса. И подправьте код для каждого из них.
     
    Максим B нравится это.
  5. SergeiL

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

    Переменные:
    Код (C++):
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    объявлены и глобально, и в setup локально, и в параметрах функций имеют те же имена.
    Не запутаетесь? ;)
     
    Максим B нравится это.
  6. fogary

    fogary Гик

    Это-то ничего, вот lastState хранит состояние только второй кнопки - это да.
     
    Airbus нравится это.
  7. Airbus

    Airbus Радиохулиган Модератор

    А ну да. Там все переменные на одно лицо что для часов что для минут
     
  8. b707

    b707 Гуру

    ТС замолчал... он видно ждал. что ему готовый код напишут... а тут одни советы :)
     
  9. Максим B

    Максим B Гуру

    Нет не ждал, просто редко бываю здесь.
     
  10. Максим B

    Максим B Гуру

    Спасибо и ведь точно )))