blogy logo
login PRIHLÁS SA
BLOG deadawp
ČLÁNKY
DISKUSIE
2
SLEDOVAŤ BLOG
PHP, Arduino programátor
deadawp



Hasičské stopky - časomiera - Arduino + LCD
pridal deadawp 1.4. 2020 o 9:26



Vytvoril som stopky pre hasičský šport - časomieru pre záznam útokov. Stopky umožňujú výpis až dvoch časov (pre ľavý a pravý útok) na LCD znakový displej s I2C prevodníkom. Stopky sú vybavené štyrmi tlačidlami (spínacími kontaktmi) pre akcie štartu, zastavenie ľavého času, zastavenie pravého času a reštart času.

Spínací kontakt pre štart stopiek je možné pripojiť aj ku signálnej pištoli. Kontakty pre zastavenie času pre ľavý a pravý útok sú umiestnené na terčoch. Nakoľko sú tieto kontakty vystavené vode, je nutné aby sa použil buď mechanický krytý (bezúdržbový) kontakt, alebo zlatú kontaktnú plôšku, ktorá nepodiela oxidácii. 

Hardvér pre projekt:

  • Arduino Uno / Nano / samostatný čip AtMega328P
  • 4x spínací kontakt / tlačidlo
  • LCD znakový displej 20x4 / 16x2 s I2C prevodníkom

Stopky sú vhodné pre DHZ a tréningové orientačné meranie časov. Tieto stopky nemôžu nahrádzať certifikovanú časomieru. Časovanie stopiek funguje na princípe interného časovača - funkcie millis(), ktorá vracia počet milisekúnd.

Verzie stopiek:

  • Stopky na desatiny
  • Stopky na stotiny

Logika stopiek na desatiny sa vykonáva každých 100 milisekúnd. Raz za 100 milisekúnd sa teda pripočíta jedna desatina (ak je daný čas aktívny) a aktualizuje sa displej (vypíšu sa oba časy). Výpis na displej trvá 32 milisekúnd. Problémom pri realizácii stopiek na stotiny bolo, že logika systému sa vykonáva každých 10 milisekúnd. Nakoľko výpis na displej trval 32 milisekúnd. Pri behu stopiek v takejto konfigurácii by sa stopky znepresnili o 3 stotiny na každý výpis displeja..

Z toho dôvodu bolo nutné zmeniť logiku výpisu na displej (aktualizovať iba konkrétnu pozíciu na displeji pri jej zmene, nie celý riadok), zvýšiť rýchlosť I2C zbernice (z pôvodných 400 kHz). Výsledkom sú stopky, ktoré umožňujú merať a vyobrazovať čas na stotiny sekundy.

Presnosť stopiek závisí od použitého kryštálu (oscilátora). Originálne Arduino dosky majú presnejší kryštál 16MHz ako čínske. Z toho dôvodu je aj časovanie presnejšie. Nakoľko sú ale rozdiely vo frekvencii kryštálov veľmi malé, odchýlka sa prejaví až pri porovnaní na dlhší čas. Keďže sa stopky využívajú predovšetkým na rátanie času útoku, ktorý trvá približne do jednej minúty, sú tieto rozdiely zanedbateľné a pre orientačné merania je presnosť dostatočná.

Spínacie kontakty, ktoré sa v tomto zapojení stopiek používajú využívajú interný PULLUP rezistor 50kohm Arduina, ktorým sú tieto digitálne vstupy paralélne pripojené k 5V napájaniu. Spínaním tlačidla sa na daný vývod privedie hodnota 0V (GND).

Táto zmena je registrovaná v programe ihneď, rádovo sa každý vstup testuje niekoľko krát za milisekundu. Pre kontakty sa nevyužíva debounce, z toho dôvodu je nutné pri dlhšom vedení ku kontaktom použiť znížený externý pullup rezistor.

V závislosti od dĺžky použitého vedenia k spínačom je nutné počítať aj s oneskorením. Keďže sa dĺžka vedenia nemení, toto oneskorenie je vždy rovnaké a započítané do vysledného času (do dorazenia signálu). 

Viac o hasičských stopkách je možné prečítať si na: https://arduino.php5.sk/hasicske-stopky.php 
Schéma zapojenia pre stopky na desatiny / stotiny:


Verzia stopiek na desatiny je dostupná zdarma na stiahnutie a využívanie pod MIT licenciou. Funkčnosť stopiek na desatiny je možné prezrieť si na priloženom videu:

 

Zdrojový kód pre stopky na desatiny sekundy:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//I2C adresa, stlpce, riadky, pouziva sa i 0x3F pre displej 20x4, 0x27 pre 16x2, skontruj cez I2C scanner https://playground.arduino.cc/Main/I2cScanner/
LiquidCrystal_I2C lcd(0x3F, 20, 4);

//DEKLARACIA DIGITALNYCH PINOV NA KTORE SU NAPOJENE TLACIDLA
const int start_tlacidlo = 12;
const int lavy_terc_kontakt = 11;
const int pravy_terc_kontakt = 10;
const int vynulovat_cas_tlacidlo = 9;

boolean run = false; //bezi cas pre LAVY UTOK?
boolean run2 = false; //bezi cas pre PRAVY UTOK?

//STAVY NACITANYCH LOGICKYCH HODNOT TLACIDIEL
int start_tlacidlo_stav = HIGH;
int lavy_terc_kontakt_stav = HIGH;
int pravy_terc_kontakt_stav = HIGH;
int vynulovat_cas_tlacidlo_stav = HIGH;

unsigned long timer = 0; //timer

//PREMENNE PRE PRVY CAS - LAVY UTOK
int second = 0;
int minute = 0;
int tenth = 0;

//PREMENNE PRE DRUHY CAS - PRAVY UTOK
int second2 = 0;
int minute2 = 0;
int tenth2 = 0;

void setup() {
lcd.begin(); //incializacia displeja na I2C zbernici
lcd.backlight(); //zapnutie podsvietenia
pinMode(start_tlacidlo, INPUT_PULLUP); //nastav ako vstup proti internemu 50kohm pullup rezistoru
pinMode(lavy_terc_kontakt, INPUT_PULLUP);
pinMode(pravy_terc_kontakt, INPUT_PULLUP);
pinMode(vynulovat_cas_tlacidlo, INPUT_PULLUP);
lcd.setCursor(0, 0); //nastav kurzor pre zapis na 1. riadok, 1. stlpec
lcd.print(" AUTOR PROJEKTU");
lcd.setCursor(0, 1); //nastav kurzor pre zapis na 2. riadok, 1. stlpec
lcd.print(" MARTIN CHLEBOVEC");
delay(2500);
lcd.setCursor(0, 0); //nastav kurzor pre zapis na 1. riadok, 1. stlpec
lcd.print("00:00:0 L. PRUD ");
lcd.setCursor(0, 1); //nastav kurzor pre zapis na 2. riadok, 1. stlpec
lcd.print("00:00:0 P. PRUD ");
}

void tickClock() {
Serial.println(millis() / 10);
if ((timer - millis() / 100) >= 100 || timer == 0) {
tick();
timer = millis() / 100;
}
}

void loop() {
tickClock();
start_tlacidlo_stav = digitalRead(start_tlacidlo);
lavy_terc_kontakt_stav = digitalRead(lavy_terc_kontakt);
pravy_terc_kontakt_stav = digitalRead(pravy_terc_kontakt);
vynulovat_cas_tlacidlo_stav = digitalRead(vynulovat_cas_tlacidlo);
checkStart();
}

void checkStart() {
if (start_tlacidlo_stav == LOW ) {
run = true; //aktivuj cas pre lavy prud
run2 = true; //aktivuj cas pre pravy prud
}
if (lavy_terc_kontakt_stav == LOW ) {
run = false;
}
if (pravy_terc_kontakt_stav == LOW ) {
run2 = false;
}
if (vynulovat_cas_tlacidlo_stav == LOW ) {
run = false;
run2 = false;
second = 0;
minute = 0;
tenth = 0;
second2 = 0;
minute2 = 0;
tenth2 = 0;
updateLCD();
updateLCD2();
}
}


void tick() { //tick sa vykonava kazdych 100 miliseund, teda kazdu desatinu sekundy
//LOGIKA BEZIACEHO CASU PRVEHO UTOKU (UTOK LAVY)
if (run) {
updateLCD();
if (tenth == 9) {
tenth = 0;
if (second == 59) {
second = 0;
minute++;
} else {
second++;
}
} else {
tenth++;
}
}

//LOGIKA BEZIACEHO CASU DRUHEHO UTOKU (UTOK PRAVY)
if (run2) {
updateLCD2();
if (tenth2 == 9) {
tenth2 = 0;
if (second2 == 59) {
second2 = 0;
minute2++;
} else {
second2++;
}
} else {
tenth2++;
}
}
}

//VYPIS PRVEHO UTOKU NA DISPLEJ (UTOK LAVY)
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);
}

//VYPIS DRUHEHO UTOKU NA DISPLEJ (UTOK PRAVY)
void updateLCD2() {
lcd.setCursor(0, 1);
if (minute2 < 10) {
lcd.print("0");
}
lcd.print(minute2, DEC);
lcd.print(":");
if (second2 < 10) {
lcd.print("0");
}
lcd.print(second2, DEC);
lcd.print(":");
lcd.print(tenth2, DEC);
}



Prístupov 2407
Kvalita článku
hlasov 0

PRÍSPEVKY
SLEDOVAŤ
Prosím prihláste sa pre možnosť pridania komentáru.
Prihláste sa, alebo použite facebook login facebook login
ĎALŠIE ČLÁNKY V BLOGU
Ovládanie Arduina cez UART z počítača
[ 19.11.2020] (príspevkov 0)
ArduinoJson - knižnica pre parsovanie JS...
[ 15.11.2020] (príspevkov 0)
Overenie kradnutých vozidiel - Arduino +...
[ 11.11.2020] (príspevkov 0)
Hladinomer + Zrážkomer - Arduino / ESP82...
[ 2.11.2020] (príspevkov 0)
RFID vrátnik - update Október 2020
[ 29.10.2020] (príspevkov 0)
Digitálny potenciometer, prerušenie, deb...
[ 28.10.2020] (príspevkov 0)
Integrácia zrážkomera RG-11 do projektu ...
[ 22.10.2020] (príspevkov 0)
WiFi Termostat - ESP8266 - WiFiManager -...
[ 28.9.2020] (príspevkov 0)
Izbový termostat - Portovanie programu -...
[ 22.9.2020] (príspevkov 0)
RFID vrátnik - Ukončenie projektu
[ 9.9.2020] (príspevkov 0)