Arduino UNO - Covid szimulátor kisboltokra kitalálva

Az áramkör és a programkód utóélete

Nagyon sok hasznos tanácsot kaptam tőletek a poszt hozzászólásai között, ami arra ösztönzött, hogy továbbgondoljam a projektet. RGB LED-re cseréltem a négy különálló LED-et, optimalizáltam a kódot főként a memóriafoglalás csökkentése miatt. A tanácsok alapján elhagytam a nyomógomb lenyomása után a delay-el történő várakozást és "debounce" megoldást alkalmaztam. A továbbfejlesztett programkód:

//felső gomb +
#define buttonPin1 5
//alsó gomb -
#define buttonPin2 2

//zöld LED
#define ledZold 12
//piros LED
#define ledPiros 9
//kék LED
#define ledKek 11

byte emberekSzama = 0;  // Kezdeti érték

Hirdetés

// Gomb állapot tárolás
bool lastButtonState1 = HIGH;  // Az előző állapot (button 1)
bool lastButtonState2 = HIGH;  // Az előző állapot (button 2)
bool button1Pressed = false;   // Gomb 1 nyomásának figyelése
bool button2Pressed = false;   // Gomb 2 nyomásának figyelése

// Debounce változók (unsigned int - 16 bit, elég a kis időintervallumhoz)
unsigned int lastDebounceTime1 = 0;  // Az utolsó gombnyomás ideje (gomb 1)
unsigned int lastDebounceTime2 = 0;  // Az utolsó gombnyomás ideje (gomb 2)
byte debounceDelay = 50;     // Debounce késleltetés (50 ms)

void zoldenVilagit() {
  digitalWrite(ledPiros, 0);
  digitalWrite(ledZold, 255);
  digitalWrite(ledKek, 0);
}

void sarganVilagit() {
  digitalWrite(ledPiros, 255);
  digitalWrite(ledZold, 255);
  digitalWrite(ledKek, 0);
}

void pirosanVilagit() {
  digitalWrite(ledPiros, 255);
  digitalWrite(ledZold, 0);
  digitalWrite(ledKek, 0);
}

void kekenVilagit() {
  digitalWrite(ledPiros, 0);
  digitalWrite(ledZold, 0);
  digitalWrite(ledKek, 255);
}

void gombok() {
  switch (emberekSzama) {
    case 0:
      kekenVilagit();
      break;
    case 1:
      zoldenVilagit();
      break;
   /* case 7:
      zoldenVilagit();
      break;
    case 8:
      sarganVilagit();
      break;
    case 9:
      sarganVilagit();
      break;
    case 10:
      pirosanVilagit();
      break;*/
    
    case 2:
      sarganVilagit();
      break;
    case 3:
      pirosanVilagit();
      break;
  }
}

void setup() {
  pinMode(ledZold, OUTPUT);
  pinMode(ledPiros, OUTPUT);
  pinMode(ledKek, OUTPUT);

  pinMode(buttonPin1, INPUT_PULLUP);  // Gomb 1
  pinMode(buttonPin2, INPUT_PULLUP);  // Gomb 2
  
  /*
  
  //LED teszt, egyesével felkapcsolás, majd lekapcsolás
  //zöld
       zoldenVilagit();
      delay(1000);
  
  //sárga
      sarganVilagit();
      delay(1000);
  
  //piros
      pirosanVilagit();
      delay(1000);
   
  //kék
    kekenVilagit();
      delay(1000);
    
   */
}

void loop() {
  // Olvassuk be a gombok aktuális állapotát
  bool buttonState1 = digitalRead(buttonPin1);
  bool buttonState2 = digitalRead(buttonPin2);

  unsigned int currentMillis = millis();  // Aktuális idő (unsigned int)

  // Ellenőrizzük gomb 1 állapotát (növelés)
  if (buttonState1 == LOW && lastButtonState1 == HIGH && (currentMillis - lastDebounceTime1) > debounceDelay) {
    emberekSzama++;
    if (emberekSzama > 3) emberekSzama = 3;  // Ne lépje túl a 3-at
    lastDebounceTime1 = currentMillis;  // Frissítjük az utolsó nyomás idejét
  }

  // Ellenőrizzük gomb 2 állapotát (csökkentés)
  if (buttonState2 == LOW && lastButtonState2 == HIGH && (currentMillis - lastDebounceTime2) > debounceDelay) {
    emberekSzama--;
    if (emberekSzama < 0) emberekSzama = 0;  // Ne lépje túl a 0-t
    lastDebounceTime2 = currentMillis;  // Frissítjük az utolsó nyomás idejét
  }

  // Frissítjük az előző gomb állapotokat
  lastButtonState1 = buttonState1;
  lastButtonState2 = buttonState2;

  // Változó értékének vizsgálata és a LED vezérlése
  gombok();
}