Obrazek użytkownika cytrynek

Symulator świateł ulicznych w ARDUINO

Światła uliczne Arduino
Światła uliczne schemat
Treść: 

Wyobraźcie sobie, że postawiono przed Wami zadanie konstrukcji świateł ulicznych do ruchu wahadłowego lub na wąskim moście. Niestety z braku czujnika ruchu musi on być załączany manualnie przez kierowców. Swoją drogą idealne rozwiązanie :)

Urządzenie ma posiadać 2 przyciski: jeden po stronie zachodniej, drugi po stronie wschodniej drogi/mostu. Oczywiście są pewne warunki wpływające na funkcjonowanie urządzenia:

  • po pierwsze podczas przełączania ma pojawić się sekwencja 5 mignięć diodą żółtą poprzedzająca zmianę koloru światła
  • jeżeli użytkownik wcisnął już aktywny przycisk ponownie - nie pojawia się, żadana rekacja ze strony oświetlenia

Poniżej znajduje się filmik z gotowego projektu

A także kod źródłowy programu (w wersji pliku txt - poniżej w dziale pliki) oraz lista niezbędnych części.

Kod programu

/*
SYGNALIZACJA ULICZNA
Jeżeli naciśniemy określony przycisk (zach,wchod) wywołamy zapalenie zielonego światła po jednej i czerwonego po drugiej z jednoczesnym jej miganiem diody żółtej
 */
 
#define CZAS_MIGANIA 500 // definicja stałej - czas migania żółtej diody

int ledzach[] = {8,9,10}; // ustawienie pinów diód po stronie zachodniej: czerwona, żółta, zielona
int ledwsch[] = {11,12,13}; // ustawienie pinów diód po stronie wschodniej: czerwona, żółta, zielona
int button[] = {1,2}; // ustawienie pinów dla strony zachodniej i wschodniej
boolean stan[]={HIGH, LOW}; // ustawinie stanu dla przycisków (buttonów) - domyślnie dopuszczamy zielone światło na zachodzie więc pierwszy elem. tablicy ma wartość HIGH
boolean prz=0, prw=0; // zmienne informujące czy miganie już raz zostało włączone, jeśli prz (miganie po stronie zachodniej) zostało włączone prz=1, jeśli nie prz=0. Bez tej zmiennej pętla loop powoduje ciągłe miganie żółtej diody
boolean first=true; // zmienna jest prawdziwa jeśli została uruchomiona pierwszy raz aby diody nie migaly na starcie
boolean ruchz = true; // ustawiamy domyslnie na ruch z zachodu, czyli dioda po lewej jest zielona, po prawej czerwona


void setup() {                
// ustawiene trybu pracy diód na wyjście
for(int i=0; i<3; i++){
  pinMode(ledzach[i], OUTPUT);   
  pinMode(ledwsch[i], OUTPUT);
}   
// ustawiene trybu pracy przycisków na wejście
pinMode(button[0], INPUT);  
pinMode(button[1], INPUT);  

// ustawiene stanu wysokiego dla przycisków
digitalWrite(button[0], HIGH); // Naciśnięcie przycisku spowoduje wywołanie stanu LOW
digitalWrite(button[1], HIGH); // Naciśnięcie przycisku spowoduje wywołanie stanu LOW

// zapalenie startowe diód
digitalWrite(ledzach[0], LOW);
digitalWrite(ledzach[1], LOW);
digitalWrite(ledzach[2], HIGH);

digitalWrite(ledwsch[0], HIGH);
digitalWrite(ledwsch[1], LOW);
digitalWrite(ledwsch[2], LOW);

}


void loop() {
  stan[0]=digitalRead(button[0]); // przypisanie stanu z odczytu stanu przycisku, jeśli został naciśnięty ma stan LOW
  stan[1]=digitalRead(button[1]); // przypisanie stanu z odczytu stanu przycisku, jeśli został naciśnięty ma stan LOW
  
      if (stan[0]==LOW && stan[1]==HIGH){ // jeżeli zostanie naciśnięty przycisk od strony zachodu
        prz=0; // migotanie diody żółtej po stronie zach nie wystąpiło 
        ruchz=true; // ruch od strony zachodu jest prawdą
        first=false; // niezbedne przy pierwszym uruchomieniu aby diody zolte nie migaly na starcie
      }
      else if (stan[0]==HIGH && stan[1]==LOW){ // jeżeli zostanie naciśnięty przycisk od strony wschodu
        prw=0; // migotanie diody żółtej po stronie wsch nie wystąpiło 
        ruchz=false; // ruch od strony zachodu jest fałszem
        first=false; // niezbedne przy pierwszym uruchomieniu aby diody zolte nie migaly na starcie
       }
  
  
  if (ruchz==true){ //jeżeli ruch jest z zachodu (czyli został naciśnięty przycisk z zachodu, określony jest z poprzedniego warunku ruchz=true; lub ruchz=false
  
      if(digitalRead(ledzach[2]!=HIGH)){ //jeżeli światło zielone się nie świeci 

        
        
        if(first==false){ // niezbedne przy pierwszym uruchomieniu aby diody zolte nie migaly na starcie
            if (prz==0){ // jeżeli prz=0 to znaczy, że jeszcze żółty LED nie migał
             if(digitalRead(ledzach[2])!=HIGH) // jeżeli dioda zielona już się świeci to nie ma sensu migać, bo żółta by migała przy świecącej się zielonej
              blinkYellow(CZAS_MIGANIA, ledzach[1], ledwsch[1]); //migamy zoltym
            }
            if(prz==0)
             prz=1; // żółty już migał więc ma 1 
        }
   digitalWrite(ledwsch[2], LOW);  //gasimy ziel
        digitalWrite(ledzach[0], LOW);  //gasimy czerwone zach
        digitalWrite(ledzach[2], HIGH); //zapalamy zielone na zach
        digitalWrite(ledwsch[0], HIGH); //zapalamy czerwone na wsch
      }
    }
   else{ 
         if(digitalRead(ledwsch[2]!=HIGH)){ //jeżeli światło zielone się nie świeci
            if (prw==0){
              if(digitalRead(ledwsch[2])!=HIGH) // jeżeli dioda zielona już się świeci to nie ma sensu migać, bo żółta by migała przy świecącej się zielonej
                  blinkYellow(CZAS_MIGANIA, ledwsch[1], ledzach[1]); //migamy zoltym
            }
           if(prw==0)
           prw=1;// żółty już migał więc ma 1
           digitalWrite(ledwsch[0], LOW);  //gasimy czerwone na wsch
           digitalWrite(ledzach[2], LOW);  //gasimy zielone na zach        
           digitalWrite(ledwsch[2], HIGH); //zapalamy zielone
           digitalWrite(ledzach[0], HIGH); //zapalamy czerwone na zach
      }
   } 
  
  } // koniec pętli loop 

void blinkYellow(int time, int nr1, int nr2) //funkcja do migania 2 diód (żółtych)
{ 

      for(int i=0; i<5; i++){
        delay(time);
        digitalWrite(nr1, HIGH);
        digitalWrite(nr2, HIGH);
        delay(time);
        digitalWrite(nr1, LOW);
        digitalWrite(nr2, LOW);        
      }  

  }

Lista elementów

SZTUKI NAZWA CZĘŚCI
2 Ceramiczne kondensatory, pojemność 100nF
2 Dioda LED Czerwona - 5mm
2 Dioda LED Żółta - 5mm
2 Dioda LED Zielona - 5mm
2 10k Ω Rezystor
6 330 Ω Rezystor
2 Przyciski
1 Arduino Uno (Rev3)
Kategoria wpisu: