Ahoj, snažil som sa to vytvoriť čo najjednoduchšie, dalo by sa to asi zapísať aj efektívnejšie, ale verím, že na začiatok to bude stačiť.
Systém má 3 režimy:
- Režim 0 - čaká sa na impulz log 1 --> 5V na vstupe v nekonečnej slučke
- Režim 1 - každú sekundu sa vykonáva meranie na vstupe, ak sa vykoná 120+ meraní log 1 za sebou, systém skočí do Režimu 2. Ak počas týchto 120 cyklov (120 sekúnd) nameria kedykoľvek log 0 --> skočí do Režimu 0
- Režim 2 (Default v switch case) - Arduino v tomto režime čaká na hardvérový reset cez tlačidlo RESET na doske, nemožno z tohto režimu vyskočiť, je to akoby while(true), cyklus tam ostane navždy.
Do toho Režimu 1 som doplnil aj tú logiku, ktorú potrebuješ. Predpokladám, že pri prekročení 120 sekúnd chceš aj zhasnúť zelenú LED pri rozsvietení červenej LED, nastavil som to tak.
Uprav si digitálne vývody podľa tvojho zapojenia. Čo sa týka merania každú sekundu, dá sa to zmeniť aj pre meranie každú milisekundu... Len sa zmení počet maximálnych impulzov (napríklad *1000), ktoré si schopný odmerať za 120 sekúnd (pozor, potrebuješ potom zmeniť aj dátový typ pre túto premennú [pocet_merani ], nakoľko int je len do 32,767, unsigned int 65535 ). Meranie cez digitalRead() trvá približne 4ns.
Kód: Vybrat vše
const int buttonPin = 2; //kontakt, na ktory sa privedie +5V
unsigned long lastDebounceTime = 0; //premenna pre cas millis()
int rezim = 0; //rezim systemu
int pocet_merani = 0; //pocet merani (cyklov), rataju sa do 2 minut --> 120 sekund
const int zelenaLED = 6; //D pin zelenej LED
const int cervenaLED = 7; //D pin cervenej LED
const int vystup = 8; //D pin pre rele
int reading;
int reading2;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(zelenaLED, OUTPUT);
pinMode(cervenaLED, OUTPUT);
pinMode(vystup, OUTPUT);
digitalWrite(vystup, HIGH);
digitalWrite(zelenaLED, LOW);
digitalWrite(cervenaLED, LOW);
}
void loop() {
switch (rezim) {
case 0:
reading = digitalRead(buttonPin);
if (reading == HIGH) {
lastDebounceTime = millis();
rezim = 1;
digitalWrite(zelenaLED, HIGH);
digitalWrite(vystup, LOW);
}
break;
case 1:
if (millis() - lastDebounceTime >= 1000) {
lastDebounceTime = millis();
reading2 = digitalRead(buttonPin);
if (reading2 == HIGH) {
pocet_merani++;
} else {
rezim = 0;
pocet_merani = 0;
digitalWrite(zelenaLED, LOW);
digitalWrite(vystup, HIGH);
}
if (pocet_merani > 120) {
rezim = 2;
digitalWrite(cervenaLED, HIGH);
digitalWrite(zelenaLED, LOW);
digitalWrite(vystup, HIGH);
}
}
break;
default:
// NUTNY RESTART ARDUINA NATVRDO CEZ RESET
break;
}
}