Stopky pre požiarny šport cez Arduino


  • Súťažné hasičské družstvo má hádam každá dedina, či časť mesta.
  • Každý týždeň najmä letnom období sa konajú súťaže po dedinách a mužstvá si pripisujú cenné body, úspechy i neúspechy, o ktorých rozhodujú stotiny, či tisíciny sekundy.
  • Stopky používajú millis, čo je funkcia interného časovača Arduina, ktorá vracia počet milisekúnd od štartu procesora.
  • Vieme teda merať čas na 3 desatinné miesta (1000 ms = 1 sekunda).
  • Logika systému sa vykonáva každú milisekundu!
  • Funkčnosť systému
  • Stopky sa odštartujú tlačidlom, druhým tlačidlom je možné čas vynulovať.
  • 2 spínacie kontakty umiestnené na terčoch sa aktivujú pri spadnutí terča, zastaví sa ľavý/pravý prúd na stopkách.
  • (Časť logiky systému pracujúcej s časom)

  • (Odosielané dáta na displej do riadku)
  • Čo využíva projekt po technickej (hardvérovej) stránke projektu?
  • Arduino, alebo samostatný AtMega čip
  • LCD displej 16x2 alebo 20x4 s I2C prevodníkom
  • 2 tlačidlá
  • 2 spínacie kontakty
  • Stopky v akcii:

    Logika pre stopky - na desatiny - možno si upraviť pre váš projekt na tisíciny (verzia zdarma)


    #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: