Всем добрый вечер. Подскажите пожалуйста. Сделал настройку времени через кнопки: 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); }
если надо различать состояния кнопок, то создавай структуру для каждой кнопки и в её поля записывай значения кнопок для каждой по отдельности. А так ты запутаешься в конец.
Так не смогу, сделал по другому опрос кнопок. Теперь сотался вопрос- как изменить только часы и отрисовать их верно.
У Вас currentState один и для минут и для часов. Поэтому меняя одно автоматически меняется другое. Переименуйте одно из них а лучше оба. Например minState и horState чтоб было два разных статуса. И подправьте код для каждого из них.
Переменные: Код (C++): byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; объявлены и глобально, и в setup локально, и в параметрах функций имеют те же имена. Не запутаетесь?