• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
4 przyciski 4 ledy
#1
Cześć, mam problem na poziomie piaskownicy arduino.
Mam 4 przyciski i 4 ledy. Założenie jest takie, 1. przycisk włącza led nr 1 na  5s i led sam sie wyłącza, 2. przycisk włącza led nr 2 na 5s i led sam sie wyłącza itd. Napisałem poniższy kod. Niestety nie działa tak, jak bym chciał. Gdzie tkwi problem?


Kod:
void setup() {
  pinMode(8, OUTPUT); //Dioda jako wyjście niebieska
  pinMode(7, INPUT_PULLUP); //Przycisk jako wejście
  digitalWrite(8, LOW); //Wyłączenie diody
 
  pinMode(9, OUTPUT); //czerwona
  pinMode(6, INPUT_PULLUP);
  digitalWrite(9, LOW);
 
  pinMode(10, OUTPUT); //zielona
  pinMode(5, INPUT_PULLUP);
  digitalWrite(10, LOW);
 
  pinMode(11, OUTPUT); //biala
  pinMode(5, INPUT_PULLUP);
  digitalWrite(11, LOW);
}

void loop()
{
  if (digitalRead(7) == LOW) { //Jeśli przycisk wciśnięty niebieska
    digitalWrite(8, HIGH); //Włącz diodę
    delay(5000); //Czekamy 5 sekund
    digitalWrite(8, LOW); //Wyłączamy diodę
   
  if (digitalRead(6) == LOW) //czerwona
    digitalWrite(9, HIGH);
    delay(5000);
    digitalWrite(9, LOW);
   
   if (digitalRead(5) == LOW) //zielona
    digitalWrite(10, HIGH);
    delay(5000);
    digitalWrite(10, LOW);
   
  if (digitalRead(4) == LOW) //biala
    digitalWrite(11, HIGH);
    delay(000);
    digitalWrite(11, LOW);
  }
}
 
Odpowiedź
#2
w delay(5000), w ostatniej diodzie masz delay(000) wiec też nie zadziała.

A raczej zadziała zgodnie z tym co napisałeś, jak naciśniesz jakiś guzik to ta dioda się zapali na 5s, ale w tym czasie program nie zareaguje na żaden inny guzik bo go zablokowałeś delayem.
 
Odpowiedź
#3
Twoja bolączka

https://forbot.pl/blog/kurs-arduino-ii-w...is-id18418
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#4
(22-11-2019, 21:04)error105 napisał(a): w delay(5000), w ostatniej diodzie masz delay(000) wiec też nie zadziała.

A raczej zadziała zgodnie z tym co napisałeś, jak naciśniesz jakiś guzik to ta dioda się zapali na 5s, ale w tym czasie program nie zareaguje na żaden inny guzik bo go zablokowałeś delayem.
 Dzięki za odpowiedź.
Jaką funkcją zastąpić delay żeby nie blokował?
 
Odpowiedź
#5
(22-11-2019, 21:04)error105 napisał(a): w delay(5000), w ostatniej diodzie masz delay(000) wiec też nie zadziała.

A raczej zadziała zgodnie z tym co napisałeś, jak naciśniesz jakiś guzik to ta dioda się zapali na 5s, ale w tym czasie program nie zareaguje na żaden inny guzik bo go zablokowałeś delayem.
Nie zobaczyłem Twojej odpowiedzi. Dzięki!
 
Odpowiedź
#6
Ewentualnie biblioteka Timers działa całkiem poprawnie jak na poczatek Smile
 
Odpowiedź
#7
Już abstrahując od tego, że delay się do takich zadań nie nadaje to masz tak:



Kod:
if (digitalRead(6) == LOW) //czerwona
    digitalWrite(9, HIGH);
    delay(5000);
    digitalWrite(9, LOW);


Powinno być tak:

Kod:
if (digitalRead(6) == LOW) //czerwona

    {
     digitalWrite(9, HIGH);
     delay(5000);
     digitalWrite(9, LOW);
    }

Jeśli poprawnie napiszesz instrukcje if, to wiesz że jak zaświeci się dioda to zablokuje działanie programu na 5 sekund, więc nie masz możliwości zaświecenia innej dopóki nie zgaśnie ta pierwsza?

Edit: o widzę, że koledzy już podpowiedzieli.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#8
Może tak

Kod:
unsigned long czas1 = 0;
unsigned long czas2 = 0;
unsigned long czas3 = 0;
unsigned long czas4 = 0;


void setup() {
  pinMode(8, OUTPUT); //Dioda jako wyjście niebieska
  pinMode(7, INPUT_PULLUP); //Przycisk jako wejście
  digitalWrite(8, LOW); //Wyłączenie diody

  pinMode(9, OUTPUT); //czerwona
  pinMode(6, INPUT_PULLUP);
  digitalWrite(9, LOW);

  pinMode(10, OUTPUT); //zielona
  pinMode(5, INPUT_PULLUP);
  digitalWrite(10, LOW);

  pinMode(11, OUTPUT); //biala
  pinMode(5, INPUT_PULLUP);
  digitalWrite(11, LOW);
}

void loop()
{
  if (digitalRead(7) == LOW)//Jeśli przycisk wciśnięty niebieska
  {
    digitalWrite(8, HIGH); //Włącz diodę
    czas1 = millis();
  }
  if ( millis() - czas1 > 5000)
  {
    digitalWrite(8, LOW); //Wyłączamy diodę
  }
  // ---------------------------------------------

  if (digitalRead(6) == LOW) //czerwona
  {
    digitalWrite(9, HIGH);
    czas2 = millis();
  }
  if ( millis() - czas2 > 5000)
  {
    digitalWrite(9, LOW);
  }
  //-------------------------------------------

  if (digitalRead(5) == LOW)//zielona
  {
    digitalWrite(10, HIGH);
    czas3 = millis();
  }
  if ( millis() - czas3 > 5000)
  {
    digitalWrite(10, LOW);
  }
  //--------------------------------------------

  if (digitalRead(4) == LOW)//biala
  {
    digitalWrite(11, HIGH);
    czas4 = millis();
  }
  if ( millis() - czas4 > 5000)
  {
    digitalWrite(11, LOW);
  }
}
 
Odpowiedź
#9
Dzięki!
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości