Arduino + a4001sr + 74ch4049h

Тема в разделе "Arduino & Shields", создана пользователем dreadfull, 4 апр 2021.

  1. dreadfull

    dreadfull Гик

    ладно, кнопки подключены, всё работает, вот теперь точно тема закрыта.
     
  2. dreadfull

    dreadfull Гик

    кину тут, может кому-то и сгодится
    Код (C++):
    #define dataPin  10  // пин подключен к входу DS
    #define latchPin 11  // пин подключен к входу ST_CP
    #define clockPin 12  // пин подключен к входу SH_CP
    #define pin_SW_SDA 2                                    // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C.
    #define pin_SW_SCL 3                                    // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C.
    byte numbers_array[10] = { // cоздаём массив цифр 0-9 в двоичном коде
      B11111100,
      B01100000,
      B11011010,
      B11110010,
      B01100110,
      B10110110,
      B10111110,
      B11100000,
      B11111110,
      B11110110     // 9
    };
    #include <Wire.h>                            // подключаем библиотеку для работы с шиной I2C
    #include <iarduino_RTC.h>                 // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
    iarduino_RTC watch(RTC_DS3231);
    const uint8_t PIN_button_UP   = 4;           // указываем номер вывода arduino, к которому подключена кнопка UP
    const uint8_t PIN_button_DOWN = 6;           // указываем номер вывода arduino, к которому подключена кнопка DOWN
         bool flag = false;
    uint32_t btnTimer = 0;

    void setup()
    {  Serial.begin(9600);
       pinMode(latchPin, OUTPUT);// устанавливаем режим работы пинов OUTPUT
       pinMode(clockPin, OUTPUT);
       pinMode(dataPin, OUTPUT); // ставим HIGH на "защёлку", чтобы регистр не принимал сигнал
       digitalWrite(latchPin, HIGH);
       watch.begin();
       pinMode(PIN_button_UP,   INPUT);           // устанавливаем режим работы вывода кнопки, как "вход"
       pinMode(PIN_button_DOWN, INPUT);           // устанавливаем режим работы вывода кнопки, как "вход"
       delay(300);  
       watch.settime(00 , 00, 12);// ждем 300мс
    }

    void loop()
    { watch.gettime();
        int hundredsofthousands =  watch.Hours/10%10;  // вычисляем десятки часов
        int tensofthousands =  watch.Hours%10;       // вычисляем часы
        int thousands =  watch.minutes/10%10;              // вычисляем десятки минут
        int hundreds =  watch.minutes%10;                // вычисляем  минуты
        int tens =  watch.seconds/10%10;                     // вычисляем десятки секунд
        int unit =  watch.seconds%10;                        // вычисляем секунды
        Serial.print("tens");Serial.print((tens)); Serial.println((unit));
        Serial.print("thousands");Serial.print((thousands)); Serial.println((hundreds));
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[hundredsofthousands]);// отправляем на регистр байт секундой
        shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[tensofthousands]);// отправляем на регистр байт секундой
        shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[thousands]);// отправляем на регистр байт секундой
        shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[hundreds]);// отправляем на регистр байт секундой
        shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[tens]);// отправляем на регистр байт секундой
        shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[unit]);// отправляем на регистр байт секундой
        digitalWrite(latchPin, HIGH);
        delay(100);
        Serial.println(watch.gettime("H:i:s"));

      bool btnState = !digitalRead(4);
      if (btnState && !flag && millis() - btnTimer > 100) {
        flag = true;
        btnTimer = millis();
        watch.settime(-1, watch.minutes==59?0: watch.minutes+1);
        Serial.println("press");
      }
      if (btnState && flag && millis() - btnTimer > 250) {
        btnTimer = millis();
        watch.settime(-1, watch.minutes==59?0: watch.minutes+1);
        Serial.println("press hold");
      }
      if (!btnState && flag && millis() - btnTimer > 250) {
        flag = false;
        btnTimer = millis();
        Serial.println("release");
      }
    bool btnState2 = !digitalRead(6);
      if (btnState2 && !flag && millis() - btnTimer > 100) {
        flag = true;
        btnTimer = millis();
        watch.settime(watch.Hours==23?0: watch.Hours+1);
        Serial.println("press");
      }
      if (btnState2 && flag && millis() - btnTimer > 250) {
        btnTimer = millis();
        watch.settime(watch.Hours==23?0: watch.Hours+1);
        Serial.println("press hold");
      }
      if (!btnState2 && flag && millis() - btnTimer > 250) {
        flag = false;
        btnTimer = millis();
        Serial.println("release");
      }
    }
     
  3. akl

    akl Гуру

    работает потому что убрана дичь вроде digitalRead(PIN_button_DOWN==HIGH)
    подумай - какой конкретно пин будет опрашивать digitalRead если PIN_button_DOWN это например 5 ?
     
  4. b707

    b707 Гуру

    то есть вы считаете, что эта строчка читает состояние пина PIN_button_UP ?
    Код (C++):
    digitalRead(PIN_button_UP==HIGH )
    должен вас огорчить - ничего подобного

    Ну прочитайте уже наконец инструкцию!
     
  5. b707

    b707 Гуру

    вряд ли кому-то пригодится код, написанный не рабирающимся в элементарных вещах автором. Мусора в интернете и так хватает.
     
    Последнее редактирование: 9 апр 2021
    Feofan и parovoZZ нравится это.
  6. dreadfull

    dreadfull Гик

    вопрос не в том что я плохо разбираюсь в коде, или вы разбираетесь хорошо, вопрос в том что код работает и вам тут спорить нечего, а о том как автор этого добился, это уже мелочи на фоне глобальной истории. а вы сидите дальше на куче собственных знаний.
     
  7. b707

    b707 Гуру

    то что вы не замечаете в своем коде ошибок - вовсе не означает что он "работает".
    Например, у вас на обоих кнопках одни и те же переменные для антидребезга - и если оно у вас не глючит - это всего лишь везение. Понажимайте кнопки чуть быстрее - сразу секунды и минуты в перемешку менятся начнут...
    И это только один пример.
    Скетчи, что выкладывают мастера типа вас - "главное работает а остальное не важно" - полны таким ошибками и ляпами, с которыми потом другие новички мучаются. Весь инет забит подобным творчеством. Это самый настоящий мусор,и уж лучше совсем не выкладывать, чем забивать этим сеть