Leírás


A projectben egy közlekedési lámpát szimulálunk. A szükséges anyagok:


Áramkőr összeállítás


A lenti képen az összeállított áramkőr látható. Áramkorlátozó ellenállások értéke 220 Ohm. A LED-ek anódjai a következő GPIO portokhoz vannak kötve:


Arduino kód

A kód első részében (#define) definiálom a LED-ekhez tartozó GPIO protokat, valamit a működéshez szükséges időket. A state változó fogja tárolni azt, hogy a lámpa melyik állapotban van, a lastChange pedig az utolsó változás idejét. A setup() metódusban az alapértékeket határozom meg. Itt a pirossal kezdünk, ezt fel is kapcsolom itt. Ahhoz hogy a LED-eket használni tudjam, be kell állítani a PIN típust OUTPUT-ra, ezzel lehetőség lesz 5V tápfeszültséget küldeni rájuk. A trafficLight() void metódus fogja a kapcsolgatást intézni. Első lépésként az aktuális időt mentjük. Ez az idő az UNO bekapcsolása óta eltelt idő ms-ben. Ez mindíg növekszik. A switch szerkezet kezeli az állapotokat. Ha 0 állapotban vangyunk, ez a kezdés, akkor itt fogjuk beállítani a következő állapotnak megfelelő ledeket, de csak akkor, ha a meghatározott idő (RED_PERIOD) letelt. Ebben az esetben bekapcsolja a sárgát is és a state is új értéket kap. Az if blokkban tehát nem az aktuális üzemmódot állítom be, hanem azt, hogy mi lesz a következő. Jogos kérdés lenne, hogy mit vacakolok az időkkel, mert van delay() is. Igen van de ezzel az a gond, hogy leállítja az egész progam futását, ami azért nem a legjobb, mert ha egy PIN-re jön egy jelváltozás amíg fel van függesztve a program akkor azt nem fogod tudni feldolgozni, tehát elveszik. Ezért nem javasolják a delay() használatát. A switch további részeit nem részletezem, a fenti logika alapján működnek.

                            
#define RED (2)                         //Vörös LED GPIO
#define GREEN (3)                       //Zöld LED GPIO
#define YELLOW (4)                      //Sárga LED GPIO

#define RED_PERIOD (5000)               //Meddig legyen piros
#define GREEN_PERIOD (2500)             //Meddig legyen zöld
#define RY_TO_G_DELAY (1500)            //Meddig világítson a piros és sárga együtt
#define SINGLE_YELLOW_PERIOD (2000)     //Meddig világítson a sárga

int state = 0;                          //Állapotkódok 0-> Piros, 1 -> Piros és sárga, 2 -> Zöld, 3 -> Sárga
unsigned long lastChange = 0;           //Az utolsó változás ideje lesz benne

void setup(void) {
  //Kimenetre állítom a GPIO pin-eket, ezen van a LED + kivezetése
  pinMode(RED, OUTPUT);
  pinMode(YELLOW, OUTPUT);
  pinMode(GREEN, OUTPUT);

  //Felveszek egy induló állapotot (Piros)
  digitalWrite(RED, HIGH);
  digitalWrite(YELLOW, LOW);
  digitalWrite(GREEN, LOW);
}

void loop(void) {
  trafficLight();
}

void trafficLight() {
  unsigned long currentTime = millis();

  switch (state) {
    case 0:  //Piros
      {
        if (currentTime - lastChange >= RED_PERIOD) {
          digitalWrite(YELLOW, HIGH);
          state = 1;
          lastChange = currentTime;
        }
        break;
      }

    case 1:  //Piros + sárga
      {
        if (currentTime - lastChange >= RY_TO_G_DELAY) {
          digitalWrite(RED, LOW);
          digitalWrite(YELLOW, LOW);
          digitalWrite(GREEN, HIGH);
          state = 2;
          lastChange = currentTime;
        }
        break;
      }

    case 2:  //Zöld
      {
        if (currentTime - lastChange >= GREEN_PERIOD) {
          digitalWrite(GREEN, LOW);
          digitalWrite(YELLOW, HIGH);
          state = 3;
          lastChange = currentTime;
        }
        break;
      }

    case 3:   //Sárga
      {
        if (currentTime - lastChange >= SINGLE_YELLOW_PERIOD ) {
          digitalWrite(YELLOW, LOW);
          digitalWrite(RED, HIGH);
          state = 0;
          lastChange = currentTime;
        }
        break;
      }
  }
} 
                            
                        

Teszt video