Секундомер для огненного спорта через Arduino


  • У пожарной команды есть каждая деревня или часть города.
  • Деревенские еженедельные соревнования проводятся каждую неделю, особенно летом, и команды набирают ценные очки, достижения и неудачи, которые определяются сотнями или тысячами секунд.
  • Секундомер использует миллис, внутренний таймер Arduino, который возвращает количество миллисекунд с момента запуска процессора.
  • Поэтому мы можем измерить время с точностью до 3 знаков после запятой (1000 мс = 1 секунда).
  • Системная логика выполняется каждую миллисекунду!
  • Функциональность системы
  • Секундомер начинается с кнопки, вторая кнопка может сбросить время.
  • 2 переключающих контакта, расположенных на мишенях, активируются, когда мишень падает, ток левого / правого секундомера прекращается.
  • (Часть системной логики времени)

  • (Отправка данных в строку дисплея)
  • Что использует проект после технической (аппаратной) страницы проекта?
  • Arduino, или автономный чип AtMega
  • ЖК-дисплей 16x2 или 20x4 с преобразователем I2C
  • 2 кнопки
  • 2 переключающих контакта
  • Секундомер в действии:

    Логика секундомера - до десятых долей - может быть отредактирована для вашего проекта тысячами (бесплатно)


    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 16, 2); //I2C adresa, stlpce, riadky, pouziva sa i 0x3F pre displej
    const int spustacresettlacidlo = 12;
    unsigned long lastPressedspustacresettlacidlo = 0; //berie cas z millisu - unsigned long
    boolean run = false;         //bezi cas?
    int spustacresettlacidloState = HIGH;
    int spustacresettlacidloCurrState = HIGH;
    long timer = 0; //The timer
    int second = 0;
    int minute = 0;
    int tenth = 0;
    void setup() {
      lcd.begin();
      lcd.backlight();
      pinMode(spustacresettlacidlo, INPUT_PULLUP);
      lcd.setCursor(0, 0);
      lcd.print("00:00:0");
    }
    
    void tickClock() {
      Serial.println(millis() / 10);
      if ((timer - millis() / 100) >= 100 || timer == 0) {
        tick();
        timer = millis() / 100;
      }
    }
    
    void loop() {
      tickClock();
      spustacresettlacidloState = digitalRead(spustacresettlacidlo);
      checkStart();
    }
    
    void checkStart() {
      if (spustacresettlacidloState != spustacresettlacidloCurrState) {
        if (spustacresettlacidloState == LOW && (millis() - lastPressedspustacresettlacidlo) > 100 || lastPressedspustacresettlacidlo == 1) {
          lastPressedspustacresettlacidlo = millis();
          run = !run;
        }
      }
      spustacresettlacidloCurrState = spustacresettlacidloState;
    }
    
    
    void tick() {
      if (run) {
        updateLCD();
        if (tenth == 9) {
          tenth = 0;
          if (second == 59) {
            second = 0;
            minute++;
          } else {
            second++;
          }
        } else {
          tenth++;
        }
      }
    }
    
    void updateLCD() {
      lcd.setCursor(0, 0);
      if (minute < 10) {
        lcd.print("0");
      }
      lcd.print(minute, DEC);
      lcd.print(":");
      if (second < 10) {
        lcd.print("0");
      }
      lcd.print(second, DEC);
      lcd.print(":");
      lcd.print(tenth, DEC);
    }
    

    Lib (I2C) pre LCD 16x2, 20x4

    Scheme: