Zakúpiť projekt

Hasičské stopky 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


    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #define I2C_ADDR    0x3F  //Adresa na I2C zbernici -  pouzivana i 0x27
    #define BACKLIGHT_PIN 3
    #define En_pin  2
    #define Rw_pin  1
    #define Rs_pin  0
    #define D4_pin  4
    #define D5_pin  5
    #define D6_pin  6
    #define D7_pin  7
    LiquidCrystal_I2C lcd(I2C_ADDR, En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin, BACKLIGHT_PIN, POSITIVE);
    const int spustacresettlacidlo = 12; 
    unsigned long lastPressedspustacresettlacidlo = 0; //berie cas z millisu - unsigned long
    boolean run = false;         //bezi cas?
    int spustacresettlacidloState = LOW; 
    int spustacresettlacidloCurrState = LOW;
    long timer = 0; //The timer
    int second = 0;
    int minute = 0;
    int tenth = 0;
    void setup() {
      lcd.begin(20, 4); //rozmer lcd.begin(16, 2);
      lcd.setBacklight(HIGH); //podsvietenie
      pinMode(spustacresettlacidlo, INPUT);
      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 == HIGH && (millis()-lastPressedspustacresettlacidlo) > 100 || lastPressedspustacresettlacidlo == 0) {
          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); 
    }