Помогите с секундомером!

Тема в разделе "Arduino & Shields", создана пользователем Ikdan, 29 ноя 2020.

  1. Ikdan

    Ikdan Нуб

    Нужен секундомер, чтобы при нажатии и удержании кнопки секундомер работал, а при отжиме кнопки - не работал.
    Помогите пожалуйста!
    Я сделал так, но не работает:
    upload_2020-11-29_22-8-31.png
    upload_2020-11-29_22-8-44.png
    Вот код:
    Код (C++):
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    void setup() {
      lcd.begin(16,2);
      lcd.print("Seconds:");
    }
    void loop() {
      lcd.setCursor(0,1);
      lcd.print(millis()/1000);
      if  (digitalRead(8) ==HIGH)
      {
        digitalWrite(2, HIGH) ;
        digitalWrite(3, HIGH) ;
        digitalWrite(4, HIGH) ;
        digitalWrite(5, HIGH) ;
        digitalWrite(11, HIGH) ;
        digitalWrite(12, HIGH) ;
      }
      else
      {
        digitalWrite(2, LOW) ;
        digitalWrite(3, LOW) ;
        digitalWrite(4, LOW) ;
        digitalWrite(5, LOW) ;
        digitalWrite(11, LOW) ;
        digitalWrite(12, LOW) ;
    }
    }
     
  2. NikitOS

    NikitOS Король шутов Администратор

    Что это и откуда выдрано?
    https://www.arduino.cc/en/Reference/LiquidCrystal
     
    issaom нравится это.
  3. a1000

    a1000 Гуру

    Автор! А вы можете прокоментировать каждую строку вашего кода. Ну например так
    Код (C++):
    #include <LiquidCrystal.h> // подключаем библиотеку для работы с дисплеем
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // создаём объект для работы с дисплеем
    void setup() {
      lcd.begin(16,2); // задаём размерность дисплея (16 символов, 2 строки)  
      lcd.print("Seconds:"); // выводим на дисплей надпись "Seconds:"
    }
    продолжите далее.
     
    Andrey12 нравится это.
  4. Svyatslav

    Svyatslav Начинающий

    Это конечно неважно (необязательно).
     
  5. a1000

    a1000 Гуру

    Почему?
     
  6. NikitOS

    NikitOS Король шутов Администратор

    Для понимания собственного говнокода может пригодиться.
    Хотя комментировать очевидное не имеет смысла, лишь то, что сразу не понятно. «Хороший код — это самодокументируемый код» ©
     
    issaom и Андрей01 нравится это.
  7. Андрей01

    Андрей01 Нерд

    Нужен секундомер, чтобы при нажатии и удержании кнопки секундомер работал, а при отжиме кнопки - не работал.
    Помогите пожалуйста!

    ПОМОГУ, Разбей код на две составляющие, одна считает секунды!!! и работает!!
    Другой код опрашивает кнопку и при ее нажатии запускает пин 13. Когда это тоже заработает. Правь и ОБЪЕДИНЯЙ!!!
     
  8. fogary

    fogary Гик

    Код (C++):
    void loop() {
      static unsigned long stopwatch;
      static unsigned long interval_start;
      static bool button_down = false;

      if (digital_read(8) != button_down) {
        if (button_down == false) {
          interval_start = mills();
          stopwatch = 0;
          lcd.clear;
          lcd.print("Seconds:");
          lcd.setCursor(0, 1);
          lcd.print(stopwatch);
        }
        button_down = !button_down;
      } else {
        if ((button_down == true) && (mills() - interval_start >= 1000)) {
          interval_start = mills();
          stopwatch++;
          lcd.setCursor(0, 1);
          lcd.print(stopwatch);
        }
      }
    }
     
  9. Ikdan

    Ikdan Нуб

    • 5.10. Запрещено публиковать исходный код и ошибки без BB-кода — CODE.
    Не работает:
    upload_2020-11-30_14-39-37.png
    и
    upload_2020-11-30_14-39-51.png
     
  10. Ikdan

    Ikdan Нуб

  11. NikitOS

    NikitOS Король шутов Администратор

    Код и ошибки вставляются текстом.
    Можно сразу в переводчик, ибо там все сказано.
     
  12. Ikdan

    Ikdan Нуб

    Админ, BB код есть...
     
  13. NikitOS

    NikitOS Король шутов Администратор

    Держите в курсе. Что дальше?
     
  14. fogary

    fogary Гик

    Сорян, очепятолся.
    digital_read(8) - должно быть digitalRead(8)
    mills() - должно быть millis()
    lcd.clear - должно быть (вероятно) lcd.clear()
     
  15. Ikdan

    Ikdan Нуб

    А в void setup не надо ничего менять?


    lcd.clear - должно быть (вероятно) lcd.clear()[/QUOTE]
    О, да... Код заработал - я исправил ошибки.
    Но! Кнопка не работает! Подскажи как её подключить


    Я сделал, только секундомер не работает, цифр нету:(
     
    Последнее редактирование модератором: 30 ноя 2020
  16. fogary

    fogary Гик

    Попробуйте добавить в setup():
    Код (C++):
    pinMode(8, INPUT);
     
  17. b707

    b707 Гуру

    ,бессмысленно
     
    a1000, parovoZZ и Andrey12 нравится это.
  18. parovoZZ

    parovoZZ Гуру

    GPIO выводы всех МК сразу после ресета или подачи питания находятся в состоянии входа.
     
    Последнее редактирование: 1 дек 2020
    Andrey12 нравится это.
  19. fogary

    fogary Гик

    В симуляторе (судя по картинкам) то же?
     
  20. a1000

    a1000 Гуру

    Открываем книгу Юрия Ревича "Практическое программирование микроконтроллеров Atmel АVR...." и читаем
    А установка регистра DDRx в ноль, как раз и переводит выводы порта в совсояние входа.
    Ну а если симулятор делает как-то по другому - нафиг такой симулятор.