• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Alarm z "podtrzymaniem"
#1
Witam mam mały problem na arduino nano a mianowicie prubuję napisać program alarmu do garażu.

Niby wszystko działa okej ale nie do końca może od początku.

Mam podłączone do Nano kontrakton, buzer, dwie diody zworkę.
Ogólnie zasada jest taka na bramie jest zamoacowny kontrakton bramę garazu otwieram z pilota
Myślałem aby wykorzystać sygnał w chwili otwarcia z bramy który by wył. alarm.
a teraz sytuacja co się dzieje.

pilot daje impuls bramie brama się otwiera rozłączany jest układ i teraz kontrakton ma stan wysoki bo jest rozwarty
natomiast brama ma stan niski bo impuls przestał być wysyłany i włącza się ponownie alarm nie wiem jak napisać aby po otwarciu bramy program czekał do ponownego zamknięcia kontaktronu i nie aktywował alarmu. Lub jak wykonać pętle tylko raz ?

tu moje pierwsze wypociny. Jestem początkujący proszę o wyrozumiałość.

Kod:
const int buzzer = 10;
const int kontrakton = 5;
const int brama = 7;
int kon;
int bram;
void setup()
{
pinMode(kontrakton, INPUT_PULLUP);
pinMode(brama, INPUT_PULLUP);
}

void loop()
{
kon = digitalRead(kontrakton);
bram = digitalRead(brama);

while (bram == LOW)
{
 while (kon == LOW)
 {
   pinMode (12,OUTPUT);
   digitalWrite(12, HIGH);
   break;
 }
 while (kon == HIGH)
 {
   tone(buzzer, 2000);
   digitalWrite(12, LOW);
   delay(500);
  break;
//do tego momentu jest okej ale jak napisać by czekał aż kontrakton będzie miał znów LOW i nie wzubdzał przez ten czas alarmu
   
   while (kon == LOW)
   {
     pinMode (11,OUTPUT);
     digitalWrite(11, HIGH);
     noTone(buzzer);
 
   break;
   }
  }noTone(buzzer);
 break;
 }
}
 
Odpowiedź
#2
Alarm jest uzbrojony gdy nie dostaje sygnału z pilota: while (bram == LOW)
A powinien być uzbrojony niezależnie, czyli stanem jakiejś zmiennej:
Kod:
bool uzbrojAlarm;
while( bool uzbrojAlarm == true)

I wtedy możesz sprawdzać:
Kod:
//*************************************************
//
//     wyłącz alarm gdy odbierzesz sygnał otwarcia bramy
//
//*************************************************

if (bram==LOW) uzbrojAlarm=false;

//*************************************************
//
//     jeśli alarm uzbrojony i ktoś otworzy bramę to włącz dźwięki
//
//*************************************************

if (uzbrojAlarm==true && kon==HIGH) włącz_syrenę();

//*************************************************
//
//     w tym miejscu jest rozwiązanie Twojego problemu
//
//*************************************************

if (kon==LOW && uzbrojAlarm==false) uzbrojAlarm=true;
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
Witam dziękuje za szybką odpowiedz ale niestety teraz brak reakcji ze strony układu  ?
Nie wiem gdzie popełniłem błąd ?

Kod:
const int buzzer = 10;
const int kontrakton = 5;
const int brama = 7;
int kon;
int bram;
bool uzbrojAlarm;
void setup()
{
pinMode(kontrakton, INPUT_PULLUP);
pinMode(brama, INPUT_PULLUP);
pinMode (12,OUTPUT);
pinMode (11,OUTPUT);
pinMode (9,OUTPUT);

}

void loop()
{
kon = digitalRead(kontrakton);
bram = digitalRead(brama);
while (bram == LOW)
{
 while(uzbrojAlarm == true)
 {
   if (bram==LOW) uzbrojAlarm=false;

   {
   digitalWrite(12, HIGH); //zielona dioda
   digitalWrite(9, LOW);
       digitalWrite(11, LOW);
   }
   if (uzbrojAlarm==true && kon==HIGH)
   {
     digitalWrite(12, LOW);
      digitalWrite(9, LOW);
       digitalWrite(11, HIGH)   ;  //czerwona dioda
   
   }
   if (kon==LOW && uzbrojAlarm==false) uzbrojAlarm=true;
   {
    digitalWrite(12, LOW);
      digitalWrite(9, HIGH); //żółta dioda
       digitalWrite(11,LOW);
   }
  }
 }
}
 
 
Odpowiedź
#4
Bo nadal wszystko masz w pętli while (bram == LOW), czyli działa gdy brak sygnału z pilota.

A co to takiego robi????
Kod:
while (bram == LOW)
{
while(uzbrojAlarm == true)
{
   if (bram==LOW) uzbrojAlarm=false;
Dopóki brak sygnału otwarcia bramy i dopóki alarm uzbrojony-->jeśli alarm uzbrojony to go rozbrój (maszyna Ci pentelkuje).

Założenie jest takie:

(15-04-2018, 13:59)gorylla napisał(a): Myślałem aby wykorzystać sygnał w chwili otwarcia z bramy który by wył. alarm.
 

czyli tak jak napisałem:

Kod:
if (bram==LOW) uzbrojAlarm=false;


(15-04-2018, 13:59)gorylla napisał(a): pilot daje impuls bramie brama się otwiera rozłączany jest układ i teraz kontrakton ma stan wysoki bo jest rozwarty natomiast brama ma stan niski bo impuls przestał być wysyłany



(15-04-2018, 13:59)gorylla napisał(a): jak napisać aby po otwarciu bramy program czekał do ponownego zamknięcia kontaktronu i nie aktywował alarmu.


No przecież napisałem:
Kod:
if (kon==LOW && uzbrojAlarm==false) uzbrojAlarm=true;

Nie rozumiem, czego jeszcze nie rozumiesz?
Ja naprawdę nie napiszę za Ciebie tego kodu, chociaż zajęło by to pewnie 3 minuty.
Jesteśmy w dziale "Piaskownica", czyli ty budujesz babki z piasku, a ja doglądam czy go sypiesz do wiaderka, a nie za koszylkę kolegi. Ja  za ciebie tej budowli nie skonstruuję, z czystej sympatii do niczym nie skrępowanej pomysłowości młodych adeptów sztuki programowania. 
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#5
Dziękuje jeszcze raz dziś już to zostawię ale załapałem o co chodzi jutro podrzucę działający program prawdopodobnie. Smile

pozdrawiam
 
Odpowiedź
#6
Witam ponownie. Niestety w dalszym ciągu mam problem a mianowicie niby wszystko działa okej. Ale po złożeniu i podłączeniu pod bramę mam problem którego nie umiem obejść mimo usilnych prób. A mianowicie program działa poprawnie z tym że gdy podawany jest impuls z bramy następuje rozbrojenie alarmu ale funkcja loop zdąży się wykonać po raz kolejny zanim kontrakton się rozłączy, tak mi się wydaje i całość alarmu ponownie się uzbraja powodując alarm. Co muszę poprawić w kodzie ktoś ma jakiś pomysł ? kombinacja z czasem opóźnienia też nie działa nie wiem ?

Kod:
void loop()
{
pinMode(kontrakton, INPUT_PULLUP);
pinMode(brama, INPUT_PULLUP);
kon = digitalRead(kontrakton);
bram = digitalRead(brama);
//while (bram == LOW)
   
   if (uzbrojAlarm==false)
   {
  // uzbrojAlarm = false;
   
   digitalWrite(6, LOW);
    digitalWrite(5, LOW);  //nic
      digitalWrite(4, LOW);
     // delay(2000);  
      }

 while(uzbrojAlarm == true)
 {
   digitalWrite(6, HIGH);//zielonsa dioda
      digitalWrite(5, LOW);
       digitalWrite(4,LOW);
     //  delay(25);
       if (uzbrojAlarm==true && kon==HIGH)
   {
     digitalWrite(6, LOW);
      digitalWrite(5, LOW);
       digitalWrite(4, HIGH)   ;  //czerwona dioda
   //    delay(25);
       }
   if (bram==HIGH)
   {
   uzbrojAlarm = false;
   
   digitalWrite(6, LOW);
    digitalWrite(5, HIGH);  //żółta dioda
      digitalWrite(4, LOW);
      delay(2205);
       
   }
    break;
   }
   

   while (uzbrojAlarm==false)

   {
     
     if (kon==LOW && uzbrojAlarm==false)
   {
     uzbrojAlarm=true;      
     delay(25);
   }
     delay(50);
   
    break;
   }
 
Odpowiedź
#7
Reaguj na zmianę stanu a nie na poziom.
Wywal dealay.
 
Odpowiedź
#8
Takie pytanko do gorylla:
Czy wiesz co robi z pętlą słowo kluczowe "break"?
W powyższym przypadku można powiedzieć, że pętle wykonują się tylko raz.
Nie mam czasu na analizę, ale podejrzewam, że ten kod nie mama sensu.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości