Skocz do zawartości

switch case i millis() w systemie alarmowym


A10

Pomocna odpowiedź

Cześć,

piszę centralę alarmową na arduino. Po aktywowaniu alarmu używam funkcji millis() do odmierzenia 30 sekund na dezaktywacje, w przeciwnym wypadku ma zostać podniesiony alarm. Za pomocą przycisku na klawiaturze chcę przejść z case-a "Aktywowany" do case-a "Rozbrajanie", a program przechodzi najpierw do rozbrajania po czym natychmiast podnosi alarm. Podejrzewam że robię coś nie tak z millis ale nie rozumiem co dokładnie

case Aktywowany1:
  i2c_lcd.setCursor(0,0);
  i2c_lcd.print("Alarm aktywowany");
  czas_o=millis();
  if(czas_o - czas >= 30000UL)
  {
    stan_maszyny = Alarm1;
  }
  else
  { 
    key=klawiatura.getKey();
    if(key == '0')
    {
      stan_maszyny = Rozbrajanie;
      i2c_lcd.clear();
    }
  }
  break;

case Rozbrajanie:
  i2c_lcd.setCursor(0,0);
  i2c_lcd.print("Rozbrajanie");
  if(czas_o - czas >= 30000UL)
  {
    
    // PIN
    
  }
  break;

 

Aha i dodam jeszcze że jak w kodzie zmienie case-y

stan_maszyny=Rozbrajanie;

na 

stan_maszyny=Rozbrojony

to alarm się nie podnosi i przechodzi bezproblemowo, a są to różne case-y

Link do komentarza
Share on other sites

Wolałem zapytać, bo tylko to mi przychodziło do głowy widząc ten fragment kodu. Wydaje mi się, że coś źle jest w pozostałym kodzie.

Na pewno jest coś nie tak tutaj:

case Rozbrajanie:
  i2c_lcd.setCursor(0,0);
  i2c_lcd.print("Rozbrajanie");
  if(czas_o - czas >= 30000UL)
  {
    
    // PIN
    
  }
  break;

Nie aktualizujesz zmiennej czas_o jak w poprzednim przypadku, w sumie czas też ma jakąś starą wartość. Ale ciężko jest powiedzieć o co chodzi widząc tylko fragmenty kodu.

Zgaduję że czas_o powinien być aktualizowany za pomocą millis(), a do zmiennej czas należałoby wstawić wartość z millis() albo czas_o podczas przechodzenia do stanu Rozbrajanie.

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@Elvis tak, zapomniałem dopisać tutaj aktualizacje czas_o, ale po dopisaniu i tak nie działa jak powinno. zmienna czas jest jest zapisywana przy rozwarciu kontaktronu w casie Uzbrojony1 bo chce zeby cały proces od podniesienia do rozbrojenia/uruchomienia buzzera trwał tylko 30 sekund. Tu jest cały kod w loopie

void loop() {

switch(stan_maszyny)
{



  case Rozbrojony:
  
  i2c_lcd.setCursor(0,0);
  i2c_lcd.print("ROZBROJONY");
  
  key = klawiatura.getKey();
  
  if(key == 'A')
  {
    stan_maszyny = Uzbrajanie;
    i2c_lcd.clear();
  }
  break;





  case Uzbrajanie:
  {
    delay(100);
    i2c_lcd.setCursor(0, 0);
    i2c_lcd.print("Uzbr. Alarmu");
    i2c_lcd.setCursor(0, 1);
    i2c_lcd.print("Wybor trybu 1/2");
    
    key = klawiatura.getKey();
    
    if(key == '1')
    {
      i2c_lcd.clear();
      
      for(int i=3; i>0; i--)
      {
        i2c_lcd.setCursor(0,0);
        i2c_lcd.print("Alarm 1 za:");
        i2c_lcd.setCursor(0,1);
        i2c_lcd.print(i);
        delay(1000);
        i2c_lcd.clear();
      }
      stan_maszyny = Uzbrojony1;
      i2c_lcd.clear();
    }
    
    else if(key == '2')
    {
      i2c_lcd.clear();
      
      for(int i=3; i>0; i--)
      {
        i2c_lcd.setCursor(0,0);
        i2c_lcd.print("Alarm 2 za:");
        i2c_lcd.setCursor(0,1);
        i2c_lcd.print(i);
        delay(1000);
        i2c_lcd.clear();
      }
      stan_maszyny = Uzbrojony2;
      i2c_lcd.clear();
    }
  }
  break;




  case Uzbrojony1:

  czas = 0;
  suma_kontrolna_otw = 0;
  suma_kontrolna_R = 0;
  i2c_lcd.setCursor(0,0);
  i2c_lcd.print("Alarm aktywny");

   //zczytywanie stanu alarmów
   
  for(int i = 0; i<8; i++)
  {
    czujniki0[i] = expander0.digitalRead(i);
    czujniki1[i] = expander1.digitalRead(i);
    czujnikiR[i] = expander2.digitalRead(i);
  }


  for(int i = 0; i<8; i++)
  {
    suma_kontrolna_otw = suma_kontrolna_otw + czujniki0[i] + czujniki1[i];
  }

  for(int i = 0; i<8; i++)
  {
    suma_kontrolna_R = suma_kontrolna_R + czujnikiR[i];
  }

  if(suma_kontrolna_otw == 1 || suma_kontrolna_R == 1)
  {
    stan_maszyny = Aktywowany1;
    i2c_lcd.clear();
    czas = millis();
  }
  break;




  case Aktywowany1:
  i2c_lcd.setCursor(0,0);
  i2c_lcd.print("Alarm aktywowany");
  czas_o=millis();
  if(czas_o - czas >= 30000UL)
  {
    stan_maszyny = Alarm1;
  }
  else
  { 
    key=klawiatura.getKey();
    if(key == '0')
    {
      stan_maszyny = Rozbrajanie;
      i2c_lcd.clear();
    }
  }
  break;



  case Alarm1:
  i2c_lcd.setCursor(0,0);
  i2c_lcd.print("ALARM!");
  for(int i = 0; i<3; i++)
  {
    digitalWrite(10, HIGH);
    delay(500);
    digitalWrite(10,LOW);
    delay(500);
  }
  stan_maszyny = Rozbrojony;
  i2c_lcd.clear();
  break;




  case Rozbrajanie:
  i2c_lcd.setCursor(0,0);
  i2c_lcd.print("Rozbrajanie");

  czas_o=millis();
  if(czas_o - czas >= 30000UL)
  {
    key=klawiatura.getKey();
    if(key=='#')
    {
      stan_maszyny = Rozbrojony;
    }
    else
    {
      stan_maszyny = Alarm1;
    }
  }
  else
  {
    stan_maszyny=Alarm1;
  }
  break;
}
}

 

Link do komentarza
Share on other sites

(edytowany)

@Elvis ale głupi błąd xD dzięki za pomoc, teraz działa

case Rozbrajanie:
  i2c_lcd.setCursor(0,0);
  i2c_lcd.print("Rozbrajanie");

  czas_o=millis();
  if(czas_o - czas < 30000UL)
  {
    key=klawiatura.getKey();
    if(key)
    {
    if(key=='#')
    {
      stan_maszyny = Rozbrojony;
    }
    else
    {
      stan_maszyny = Alarm1;
    }
  }
  }
  else
  {
    stan_maszyny=Alarm1;
  }
  break;

 

fp.jpg

Edytowano przez A10
  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.