• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program do włączania bramy wjazdowej za pomocą Arduino

Aruba Cloud - Virtual Private Server VPS
0 głosów
2,214 wizyt
pytanie zadane 15 lipca 2017 w C i C++ przez nikodemsz Nowicjusz (140 p.)

Witam, zabawe z arduino zacząłem od niedawna i srednio idzie mi programowanie w języku C.
Wymysliłem sobie, że zrobie model bramyna arduino.
przycisk S1 i S2 to będą przyciski S1-w lewo, S2-w prawo
do tego czyjnik (przycisk na modelu) gdy brama sie zamknie C1 i drugi czujnik na drugim koncu bramy gdy brama sie otworzy C2, do tego dwie diody imitujące w którą strone będzie się okręcał silnik K1-silnik bedzie sie krecil w lewo(brama bedzie zamykana)  i K2(silnik bedzie otwierał brame)
Więc działanie miało byc takie. Naciskam przycisk w LEWO(S1) i brama się zamyka, naciskam S2 i brama się otwiera, jesli ktos wejdzie na kurs kolizyjny, brama staje i wtedy moge sobie zarządzic czy chce ją zamknąć czy otworzyć. Fajnie byłoby tez gdyby szlo zrobic tak ze gdy sie OTWIERA/ZAMYKA to moge od razu zmienic na ZAMYKANIE/OTWIERANIE sie bramy bez czekania az dojedzie do konca i czujnk zadziała
Tutaj przedstawiam mój marny sketch.... Smile
chciałem też dodac czujnik w razie gddyby ktoś  stanął na kursie kolizyjnym z bramą stad czujnik C3 i lampe ktora migałaby podczas zamykania i otwierania, stad SYGNALIZATOR.

 

int c1 = 12;
int c2 = 11;
int c3 = 10;
int s1 =9;
int s2 = 8;
int k1 = 7;
int k2 = 6;
int sygnalizator = 5;

void setup () {
  pinMode(k1, OUTPUT);
  pinMode(k2, OUTPUT);
  pinMode(sygnalizator, OUTPUT);
  pinMode(c1, INPUT_PULLUP);
  pinMode(c2, INPUT_PULLUP);
  pinMode(c3, INPUT_PULLUP);
  pinMode(s1, INPUT_PULLUP);
  pinMode(s2, INPUT_PULLUP);
}

void loop() {


  if  (digitalRead(c1^s2) == LOW)//jesli c1 i s2 beda zwarte to
   { digitalWrite(k2, HIGH); //k2 czyli silnik w prawo sie zalaczy
   while (digitalRead(c2) == HIGH)//bedzie tak dlugo pracowal az
   { 
   digitalWrite(k2, LOW); //na czujniku c2 pojawi sie sygnal 
   }
   }   else if (digitalRead(c2^s1) == LOW) //tutaj podobnie co wyzej
   { digitalWrite(k1, HIGH);
   while (digitalRead(c1) == HIGH) {
   digitalWrite(k1, HIGH);
   }
   }
}

 

1 odpowiedź

+1 głos
odpowiedź 15 lipca 2017 przez Łukasz Boguszewski Nowicjusz (160 p.)
int czujnik_brama_zamknieta = 12;
int czujnik_brama_otwarta = 11;
int czujnik_kolizja = 10;
int przycisk_zamknij =9;
int przycisk_otworz = 8;
int silnik_lewo = 7;
int silnik_prawo = 6;
int sygnalizator = 5;
 
 
 
int opoznienie = 50;    // opoznienie powiedzy kolejnymi obiegami funkcji
boolean stan_pracy;     //  true otwiera, false zamyka brame
boolean stan_lapki;     // lampka zapalona lub nie
boolean migaj;          // czy lampa ma migac
int  licznik_obieg;     // będzie zliczał obiegi i gdy będzie
                        // odpowiednią wartość zmieni stan
                        // lampki
                    

void setup () {
  pinMode(silnik_prawo, OUTPUT);    // otwiera brame
  pinMode(silnik_lewo, OUTPUT);     // zamyka brame
  pinMode(sygnalizator, OUTPUT);    // czy ktoś stoi w bramie
  pinMode(czujnik_brama_zamknieta, INPUT_PULLUP);
  pinMode(czujnik_brama_otwarta, INPUT_PULLUP);
  pinMode(czujnik_kolizja, INPUT_PULLUP);
  pinMode(przycisk_zamknij, INPUT_PULLUP);
  pinMode(przycisk_otworz, INPUT_PULLUP);
  
  
  stan_pracy= false;     // tryb pracy ustawiony na zamykanie
  migaj = false;
}
 
void loop() {
  
   if (digitalRead(przycisk_otworz) == LOW)       stan_pracy = true;
   else if(digitalRead(przycisk_zamknij) == LOW)   stan_pracy = false;


   if(digitalRead(czujnik_kolizja) == HIGH ){
      // w pierwszej kolejności sprawdza czy nic nie blokuje bramy
      // wyłącza dwa silniki i czeka 1 sekunde  na ponowne sprawdzenie
      digitalWrite(silnik_lewo, LOW);
      digitalWrite(silnik_prawo, LOW);
      migaj = false;
      delay(1000);
    }
    else if(stan_pracy){
    
      digitalWrite(silnik_lewo, LOW); // wyłącza drugi silnik
       // stan pracy otwieranie bramy 
       // Sprawdza czy czujnik pozwala na otwieranie bramy
     
      if (digitalRead(czujnik_brama_otwarta) == HIGH){  
        
              digitalWrite(silnik_prawo, LOW); 
              migaj = false;

         }
      else{
          //silnik pracuje i otwiera brame
            digitalWrite(silnik_prawo, HIGH); 
            migaj = true;  
        } 
    }
    else{
    
      digitalWrite(silnik_prawo, LOW); // wyłącza drugi silnik
        // stan pracy zamykanie bramy 
         // Sprawdza czy czujnik pozwala na zamykanie bramy
       
       if (digitalRead(czujnik_brama_zamknieta) == HIGH){  
       
            digitalWrite(silnik_lewo, LOW);
            migaj = false; 
         }
       else{
          //silnik pracuje i zamyka brame
            digitalWrite(silnik_lewo, HIGH);
            migaj = true;    
          }
      }
      
      // miganie lampki
      if(migaj){
        licznik_obieg++;
        //miga co dwie sekundy
        if(licznik_obieg * opoznienie > 2000 ){
           licznik_obieg = 0;
          stan_lapki = !stan_lapki;
        }
        digitalWrite(sygnalizator, stan_lapki);
        
      }else{
        
        digitalWrite(sygnalizator, LOW);
      }
      
   
      delay(opoznienie);    // zwiększenie przerwy między odczytami
}  
  

Proszę. Zmieniłem nazwy na bardziej czytelne dla ludzi. Popatrz jeszcze na stany tych czujników czy są dobrze dobrane w tych if'ach bo nie jestem pewien jaki stan czujnika co wskazuje, przyjąłem że stan HIGH wskazuje że czujnik coś wykrył ;) 
Jak coś to pytaj.

Podobne pytania

0 głosów
2 odpowiedzi 1,293 wizyt
pytanie zadane 29 stycznia 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
1 odpowiedź 544 wizyt
0 głosów
1 odpowiedź 912 wizyt

93,327 zapytań

142,325 odpowiedzi

322,396 komentarzy

62,657 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...