Skocz do zawartości

Sterowanie diodami za pomocą przycisków


Adikon

Pomocna odpowiedź

Gość es2
14 minut temu, Adikon napisał:

Nie chciałem zaśmiecać po prostu 🙂

KOD 


void setup() {
  pinMode(10, OUTPUT); //Dioda czerwona
  pinMode(8, OUTPUT); //Dioda zielona
 
  pinMode(7, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);//Przycisk
 
  digitalWrite(10, LOW); //Wyłączenie diod
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
}

void loop()
{
  digitalWrite(10, HIGH); //Czerwona
  delay(200); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  if (digitalRead(7) == HIGH);  //Jeśli przycisk jest wciśnięty 

  digitalWrite(10, LOW); //Czerwona
  delay(200); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  if (digitalRead(7) == HIGH);  //Jeśli przycisk jest wciśnięty 
  
   
  digitalWrite(8, HIGH); //Zielona
  delay(200); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  if (digitalRead(7) == HIGH);  //Jeśli przycisk jest wciśnięty 

  digitalWrite(8, LOW); //Zielona
  delay(200); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  if (digitalRead(7) == HIGH); //Jeśli przycisk jest wciśnięty 
}

 

Wywal te delay gdzie jest komentarz //zatrzymujemy program przed wejściem do pętli, to na początek.

Zapoznaj sie z podstawowym kursem Arduino, bo za warunkiem if masz ";" czyli jeśli warunek spełniony to nie rób nic.

Link do komentarza
Share on other sites

Ułatwię jeszcze trochę (bez podawania kodu)

Zastanów się co ty chcesz zrobić:

Jeżeli dioda się świeci -> zgaś
W przeciwnym wypadku -> zapal

Proponuje abyś zrobił blok if/else wyglądający mniej więcej tak:

  1. Jeżeli przycisk jest wciśnięty
    1. Jeżeli dioda się świeci
      1. zgaś
    2.  Jeżeli dioda się nie świeci
      1. Zapal

 

Edytowano przez Aiden_Pearce
Link do komentarza
Share on other sites

Gość es2
4 minuty temu, Adikon napisał:

Powyżej wstawiłem kod poprawiony, lecz nie działa nadal ;/

Nie działa bo nie znasz C/C++! Poczytaj o "if" bo nadal jeśli warunek spełniony nie rób nic.

Kod zmieniasz nie wiedząc co robią poszczególne instrukcje. To tak, jakbym ja chciał zmienić sens powieści napisanej po chińsku podmieniając na oślep wyrazy. Jak myślisz, udało by mi się?. Metoda chybił trafił jest dobra w lotto a nie w programowaniu.

Edytowano przez es2
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

KOD

void setup() {
  pinMode(8, OUTPUT); //Dioda jako wyjście
  pinMode(7, INPUT_PULLUP); //Przycisk jako wejście
  digitalWrite(8, LOW); //Wyłączenie diody
    pinMode(9, OUTPUT); //Dioda jako wyjście
  pinMode(6, INPUT_PULLUP); //Przycisk jako wejście
  digitalWrite(9, LOW); //Wyłączenie diody
}
 
void loop()
{
  if (digitalRead(7) == LOW) { //Jeśli przycisk wciśnięty
    digitalWrite(8, HIGH); //Włącz diodę
  } else { //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty)
    digitalWrite(8, LOW); //Wyłącz diodę
     if (digitalRead(6) == LOW) { //Jeśli przycisk wciśnięty
    digitalWrite(9, HIGH); //Włącz diodę
  } else { //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty)
    digitalWrite(9, LOW); //Wyłącz diodę
  }
  }}

Udało mi się coś takiego. Tylko tyle, że diody świecą tylko wtedy, kiedy wciskam przyciski.

Rozumiem, że if działa wtedy kiedy warunek jest spełniony, a else na odwrót.

Link do komentarza
Share on other sites

Nawiasy masz źle.

void loop()
{//początek metody loop
  if (digitalRead(7) == LOW) { //początek if
    digitalWrite(8, HIGH);
  } else { //koniec if początek else
    digitalWrite(8, LOW); 
     if (digitalRead(6) == LOW) {//początek if
    digitalWrite(9, HIGH); 
  } else { //koniec if początek else
    digitalWrite(9, LOW); 
  }//koniec else
  }}//koniec else koniec metody

Diody się zapalają wtedy gdy warunek if jest spełniony w przeciwnym wypadku wykonuje się else.
Widzisz błąd?

Edytowano przez Aiden_Pearce
Link do komentarza
Share on other sites

Gość es2
11 minut temu, Adikon napisał:

Tylko tyle, że diody świecą tylko wtedy, kiedy wciskam przyciski.

Jakiś sukces jest. Teraz wywal else i to co tam jest. Stwórz dwie zmienne globalne bool (globalne, bo nie chcę na razie mieszać w głowie z statycznymi) nazwij sobie np prev7 i prev6.  Warunek if zamień na

if ( prev7 != digitalRead(7) ){
	prev7 = digitalRead(7);
	digitalWrite(7, prev7 );
	//i dodaj, tymczasowo
	Delay(500)
	

To samo zrób dla wejścia 6.

Teraz po naciśnięciu przycisku będzie negowany stan diody. Jak zadziała zrobisz kolejne zmiany. Trzeba wyeliminować drżenie styków i pozbyć się delay.

Edytowano przez es2
Link do komentarza
Share on other sites

A nie prościej tak?

if (digitalRead(7)==HIGH) { //Przycisk 7 wciśnięty
    if (RedIsOn) { //Jeżeli czerwona się świeci
      digitalWrite(10,LOW);//Zgaś diodę czerwoną
      RedIsON = false;//Indykator: czerwona dioda się nie świeci
    }
    else {//W przeciwnym wypadku
      digitalWrite(10,HIGH);//Zapal diodę
      RedIsON = true;//Indykator: dioda się świeci
    }
  }

Powinno działać

Link do komentarza
Share on other sites

Ten błąd jest przy twojej wersji Aiden :). I naprawdę chłopaki zrozumcie mnie. Przepraszam was za takie głupie pytania jak się domyślam, ale chcę się tego nauczyć. Nie mam 15 lat i nagle zachciało mi się tym zająć. Myślałem nad tym długi czas i wreszcie postanowiłem spróbować. Praca jako elektryk daje mi satysfakcję tymbardziej, że to kopalnia, ale chcę spróbować czegoś nowego co też da mi z pewnością dużo frajdy. Sporą barierą jest dla mnie nieznajomość angielskiego, ale cóż...

O co chodzi z tym RedIsON ? 

Dobra. Bardzo dziękuję za waszą pomoc. Wrócę do tego rano. Nie daję już rady, gdyż męczę się z tym programowaniem, a do tego z gorączką itp. Tylko moje ambicje nie pozwalają przerwać, lecz zdrowie ważniejsze. I jeszcze raz przepraszam za głupie pytania. Przerobię jeszcze całą pierwszą część kursu i może mi się coś rozjaśni. 

Link do komentarza
Share on other sites

11 godzin temu, Adikon napisał:

Przerobię jeszcze całą pierwszą część kursu i może mi się coś

I to jest super podejście. Na początek zwróć uwagę na pętle, warunki, stałe, zmienne i funkcje. Bez znajomości i zrozumienia tych konstrukcji nie da się niczego zrobić samemu. Warto też zanim usiądziesz do komputera by pisać swój program wziąć do ręki ołówek i usiąść przed ... kartką papieru by narysować sobie jak ten program ma działać - stworzyć algorytm tego programu. Może tak?

Zeskanowany dokument.png

Mając pomysł na program (dogłębnie przemyślany algorytm) możesz rozpocząć jego zapis w postaci linii kodu programu. Potraktuj taki algorytm jak schemat elektryczny - sam dobrze wiesz że bez schematu złożonego obwodu nie zbudujesz.

Pisząc program musisz wiedzieć, że najczęściej ten sam efekt możesz uzyskać na wiele sposobów. Przykładem może być np. sprawdzenie czy naciśnięto w programie przycisk. Tu np. możesz zastosować konstrukcję if, ale możesz ją w zasadzie użyć na 2 sposoby i tak:

Sposób 1 (if):

//gdzieś tam w programie
if(digitalRead(D0)==HIGH) 
{ //...ciąg instrukcji do wykonania gdy warunek jest spełniony ... 
  digitalWrite(D2,HIGH);
  //etc.
 }
//tu reszta programu która się wykona zawsze, niezależnie od wcześniejszego warunku

Sposób 2 (if - else):

//gdzieś tam w programie
if(digitalRead(D0)==HIGH) 
{ //...ciąg instrukcji do wykonania gdy warunek jest spełniony ... 
  digitalWrite(D2,HIGH);
  //etc.
 }
else
{
  //..ciąg instrukcji do wykonania tylko wtedy gdy wcześniejszy warunek if nie został spełniony
  
}
//tu reszta programu która się wykona zawsze, niezależnie od wcześniejszego warunku

Jak widzisz else nie jest obowiązkowe. Co będzie lepsze w Twoim programie? Moim zdaniem sposób 1, ale to Ty jesteś programistą i to Ty świadomie decydujesz.

Edytowano przez Belferek
Link do komentarza
Share on other sites

11 godzin temu, Adikon napisał:

O co chodzi z tym RedIsON ?

Użyłem tego jako wyznacznika w jakim stanie obecnie jest czerwona dioda.

Warto również wspomnieć, że można zrobić taki blok:

//gdzieś tam w programie
if(digitalRead(D0)==HIGH) 
{ //...ciąg instrukcji do wykonania gdy warunek jest spełniony ... 
  digitalWrite(D2,HIGH);
  //etc.
 }
else if()//warunek
{  
 //..ciąg instrukcji do wykonania tylko wtedy poprzedni warunek nie został spełniony a obecny został
}
else {
  //..ciąg instrukcji do wykonania tylko wtedy gdy żaden warunek if nie został spełniony
}
//tu reszta programu która się wykona zawsze, niezależnie od wcześniejszego warunku

 

 

  • Lubię! 1
Link do komentarza
Share on other sites

Ja właśnie chcę tylko pomocy/ wyjaśnienia. Z wyszukiwarki umiem korzystać i to robię. Lecz, niektóre rzeczy chciałbym mieć wytłumaczone na chłopski rozum. Myślałem, że właśnie po to jest dział zupełnie zieloni. Na początku wszystko jest trudne. Nie oczekuję, że od razu będę wszystko potrafił. Sam tłumaczę młodszym pracownikom( choć nie zawsze młodszym) rzeczy, które są dla mnie bardzo proste. Jednak rozumiem takich ludzi i staram się im pomóc. Niekiedy po prostu lepiej człowiek się uczy na przykładzie czy w praktyce. Nigdy nie miałem styczności z programowaniem, ale sądzę, że warto spróbować wszystkiego co nas interesuje.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.