Fungovanie: Po prvom stlačení sa spustí funkcie spustenie(). Ak počas nej, alebo po nej stlačím tlačidlo, spustí sa funkcia vypnutie(). Počas funkcie vypnutie tlačidlo nefunguje(nereaguje na stlačenia.) Po vykonaní funkcie vypnutie() a následnom tlačení tlačidla sa začne opäť vykonávať funkcia spustenie().
To, čo je popísané vyššie funguje okrem prepnutia počas funkcie spustenie() na funkciu vypnutie. V kóde využívam attachInterrupt na pine D2 na Arduine UNO. Celé som to nahral online, kde je možné prezrieť kód a odtestovať riešenie aj v simulátore. Bol by som vám veľmi vďačný! Myslím si, že problém bude iba v delayoch, je možné to poupraviť aby to fungovalo s existujúcim kódom to plynulé prepínanie počas funkcie?
Stránka so simulátorom a kódom: https://circuits.io/circuits/5029269-attachinterrupt/
Kód: Vybrať všetko
int led = 6;
int rele1 = 3;
int rele2 = 4;
int rele3 = 5;
int ButtonState=LOW;
long LastPushTime=0;
long PushTime=0;
int pocitadlo=0;
// the setup routine runs once when you press reset:
void setup() {
Serial.begin(9600);
// initialize the digital pin as an output.
analogReference(INTERNAL);
pinMode(led, OUTPUT);
pinMode(rele1,OUTPUT);
pinMode(rele2 ,OUTPUT);
pinMode(rele3 ,OUTPUT);
attachInterrupt(0,PushButton,CHANGE);
}
void spustenie(){
//FUNKCIA PROCESU SPUSTENIA
digitalWrite(rele1, HIGH);
digitalWrite(rele2, LOW);
digitalWrite(rele3, LOW);
for(int i=0; i<5; i++){
Serial.print(i);
Serial.print(". ");
Serial.println("cyklus prveho foru spustenia");
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
delay(500);
}
for(int i=0; i<30; i++){
Serial.print(i);
Serial.print(". ");
Serial.println("cyklus druheho foru spustenia");
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
delay(500);
}
digitalWrite(rele1, HIGH);
digitalWrite(rele2, HIGH);
digitalWrite(rele3, LOW);
for(int i=0; i<15; i++){
Serial.print(i);
Serial.print(". ");
Serial.println("cyklus posledneho foru spustenie");
digitalWrite(led, HIGH);
delay(250);
digitalWrite(led, LOW);
delay(250);
}
Serial.println("Za poslednym for spustenie");
digitalWrite(rele1, HIGH);
digitalWrite(rele2, HIGH);
digitalWrite(rele3, HIGH);
digitalWrite(led, HIGH);
}
void vypnutie(){ //FUNKCIA PROCESU VYPNUTIA
digitalWrite(rele1, HIGH);
digitalWrite(rele2, HIGH);
digitalWrite(rele3, LOW);
for(int i=0; i<1; i++){
Serial.print(i);
Serial.print(". ");
Serial.println("cyklus prveho foru vypnutie");
digitalWrite(led, HIGH);
delay(300);
digitalWrite(led, LOW);
delay(700);
}
digitalWrite(rele1, HIGH);
digitalWrite(rele2, LOW);
digitalWrite(rele3, LOW);
for(int i=0; i<5; i++){
Serial.print(i);
Serial.print(". ");
Serial.println("cyklus posledneho foru vypnutie");
digitalWrite(led, HIGH);
delay(300);
digitalWrite(led, LOW);
delay(700);
}
Serial.println("Vypnutie vsetkych LED, cakam na vstup z tlacidla");
digitalWrite(rele1, LOW);
digitalWrite(rele2, LOW);
digitalWrite(rele3, LOW);
digitalWrite(led, LOW);
}
// the loop routine runs over and over again forever:
void loop(){
}
void PushButton() {
PushTime=millis()-LastPushTime;
if(PushTime>150) {
pocitadlo++;
switch(pocitadlo)
{
case 1:
spustenie();
break;
case 2:
vypnutie();
pocitadlo=0;
break;
}
}
LastPushTime=millis();
}