• 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

Object Storage Arubacloud
0 głosów
1,954 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 986 wizyt
pytanie zadane 29 stycznia 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
1 odpowiedź 370 wizyt
0 głosów
1 odpowiedź 723 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...