• 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
Problem z ciągle świecącą się diodą
#1
    Witam,

Przychodzę do was zirytowany borykając się z błahym problemem, ale męczę już się z nim chyba z miesiąc. Robię prosty kurs arduino, który zaznaczam robiłem jakoś rok temu i udało mi się dojść nawet dosyć daleko, więc jestem początkujący, no ale coś już tam wiem. Prosty projekt, naciskamy przycisk, świeci się dioda, puszczamy - gaśnie. Kiedyś kończąc ten kurs robiłem projekty gdzie były podłączone nawet 6 diody i wykorzystywane komendy jak For, loop itd, ale do rzeczy. Gdy robię  tak jak na kursie i załączonym schemacie dioda cały czas mi się świeci a jak naciskam przycisk to gaśnie i to jest ten problem, z którym nie mogę sobie poradzić. Nie wiem gdzie leży problem. Nawet gdy do drugiego Pinu jest podłączony kabel, ale nie ma kontaktu z GND czyli jest wpięty luźno kabel to dioda wciąż się świeci. Gaśnie tylko gdy z pinu drugiego jest podłączenie  do uziemienia dlatego dioda gaśnie gdy naciskam przycisk, bo obieg się zamyka. Gdy nie ma przycisku tylko podłączam z pinu bezpośrednio do GND to dioda gaśnie. Gdy dotykam jakieś metalowe elementy na arduino np. tam gdzie jest podłączone zasilane to dioda gaśnie, ewentualnie od spodu gdzie jest lut do drugiego pinu też gaśnie. Próbowałem już chyba wszystkiego, gdy kabel jest luźno podłączony do pinu drugiego i przybliżam rękę to dioda zaczyna świecić, bo pewnie łapie prąd statyczny ode mnie, ale gdy wszystko jest podłączone przecież przez Rezystor Pull-down to chyba nie powinno wyłapywać jakiegoś prądu statycznego a tak się ta dioda zachowuje. Jeszcze na schemacie zakreśliłem połączenie 5V do przycisku, bo gdy tak robię to dioda świeci się jeszcze mocniej i nigdy tak nie robiłem, gdy bawiłem się tym kursem tak jak mówiłem rok temu i miałem z 8 diod to również nie podłączałem przycisku pod 5V tylko bezpośrednio z drugiego pinu do masy układu i wszystko działało. Naprawdę proszę o pomoc, nie mogę zacząć przygody od nowa bez obejścia tego problemu a jestem już naprawdę na skraju wytrzymałości. A tak, kupiłem nawet drugą płytkę myśląc, że może się arduino zepsuło, ale na drugiej dzieje się tak samo. Aha, zapomniałem dopisać, że kod nawet kopiuje bezpośrednio z kursu, żeby uniknąć mojego błędu, wcześniej tak robiłem wszystko działało a teraz borykam się chyba z najprostszym problemem i nie potrafię sobie z nim poradzić.
int ledCzerwonaPin = 11;
int przycisk = 2;

void setup() {
  pinMode(ledCzerwonaPin, OUTPUT);
  pinMode(przycisk, INPUT);
}

void loop() {
  if(digitalRead(przycisk) == HIGH)
  {
    digitalWrite(ledCzerwonaPin, HIGH);
  }else{
    digitalWrite(ledCzerwonaPin, LOW);    
  }
}
 
Odpowiedź
#2
A spróbuj inaczej zamiast rezystora daj włącznik, a to czerwone zakreślone wyrzuć. A program daj taki

int ledCzerwonaPin = 11;
int przycisk = 2;

void setup() {
pinMode(ledCzerwonaPin, OUTPUT);
pinMode(przycisk, INPUT_PULLUP;
}

void loop() {
if(digitalRead(przycisk) == LOW)
{
digitalWrite(ledCzerwonaPin, HIGH);
}else{
digitalWrite(ledCzerwonaPin, LOW);
}
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
Masz rację, że powinno działać.
Układ wg opisu zachowania nie jest podłączony rezystorem 10k do GND, a stany są wynikiem oddziaływania polami elektrycznymi zbieranymi z otoczenia.
Stan na przycisku ma być ustalony w taki sposób, by wciśnięcie jednoznacznie zmieniało stan na wejściu na przeciwny. Można to zrobić używając INPUT_PULLUP i to w zupełności wystarcza, aktywujesz przycisk wciskając go do GND, tak jak pokazał Jarewa0606.
Można tak jak sam zrobiłeś, że rezystorem zewnętrznym 10k utrzymujesz pewny stan 0 i zwierasz pin do VCC.
Nie wiem jakie zabawy uczyniłeś w między czasie, ale nie wolno podłączać wprost 5V do przycisku i potem go zwierać do GND. Bez rezystora robisz brzydkie zwarcie i coś faktycznie mogło się upalić.
Jak nie działa to szukaj winnych w rezystorze, połączeniach kabelkami, styków na płytce. Bardzo przydatny jest multimetr i możesz sobie niezależnie sprawdzać jakie wartości napięcia pojawiają się na wejściu pomiarowym, czy rezystor 10k to na pewno 10k, bo może jest 10M i wtedy już może coś się zakłócać.
Wewnętrzny pullup to rezystor znacznie większy, jakieś 20-100k, jak im wyjdzie, ale zazwyczaj w zupełności wystarcza, tyle że w UNO jest tylko w kierunku UP.
Zmień pin 2 na inny, może wszystko masz dobrze, tylko faktycznie już coś tam upaliłeś.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#4
(22-09-2023, 19:52)Jarewa0606 napisał(a): A spróbuj inaczej  zamiast rezystora daj włącznik, a to czerwone zakreślone wyrzuć.  A program daj taki

int ledCzerwonaPin = 11;
int przycisk = 2;

void setup() {
  pinMode(ledCzerwonaPin, OUTPUT);
  pinMode(przycisk, INPUT_PULLUP;
}

void loop() {
  if(digitalRead(przycisk) == LOW)
  {
    digitalWrite(ledCzerwonaPin, HIGH);
  }else{
    digitalWrite(ledCzerwonaPin, LOW);
  }
}
Ja nie mogę klękajcie narody działa, a przez miesiąc nie pisałem postu, bo nie chciałem zawracać i zaśmiecać tak błahym problemem a naprawdę próbowałem wszystkiego. Jeszcze raz dzięki chociaż nadal nie rozumiem dlaczego kiedyś działało tak jak robiłem wcześniej a teraz były potrzebne te zmiany w kodzie.
 
Odpowiedź
#5
(22-09-2023, 20:12)kaczakat napisał(a): Masz rację, że powinno działać.
Układ wg opisu zachowania nie jest podłączony rezystorem 10k do GND, a stany są wynikiem oddziaływania polami elektrycznymi zbieranymi z otoczenia.
Stan na przycisku ma być ustalony w taki sposób, by wciśnięcie jednoznacznie zmieniało stan na wejściu na przeciwny. Można to zrobić używając INPUT_PULLUP i to w zupełności wystarcza, aktywujesz przycisk wciskając go do GND, tak jak pokazał Jarewa0606.
Można tak jak sam zrobiłeś, że rezystorem zewnętrznym 10k utrzymujesz pewny stan 0 i zwierasz pin do VCC.
Nie wiem jakie zabawy uczyniłeś w między czasie, ale nie wolno podłączać wprost 5V do przycisku i potem go zwierać do GND. Bez rezystora robisz brzydkie zwarcie i coś faktycznie mogło się upalić.
Jak nie działa to szukaj winnych w rezystorze, połączeniach kabelkami, styków na płytce. Bardzo przydatny jest multimetr i możesz sobie niezależnie sprawdzać jakie wartości napięcia pojawiają się na wejściu pomiarowym, czy rezystor 10k to na pewno 10k, bo może jest 10M i wtedy już może coś się zakłócać.
Wewnętrzny pullup to rezystor znacznie większy, jakieś 20-100k, jak im wyjdzie, ale zazwyczaj w zupełności wystarcza, tyle że w UNO jest tylko w kierunku UP.
Zmień pin 2 na inny, może wszystko masz dobrze, tylko faktycznie już coś tam upaliłeś.

Dziękuję bardzo za wyczerpującą odpowiedź, udało się naprawić właśnie ze zmianą kodu chociaż pierwszy raz widzę coś takiego jak INPUT_PULLUP. Kiedyś robiłem tak jak wcześniej z kilkoma diodami i wszystko działało. Nawet teraz działa z tym kodem bez rezystora czy z rezystorem cokolwiek robię wszystko jest okej. Na pewno wyciągnę wnioski i będę się starał zrozumieć właśnie co zaszło, bo przez to jestem jakoś miesiąc w plecy  z nauką a tak naprawdę to dłużej jeszcze, bo straciłem motywację, więc jeszcze raz dziękuje Panom za pomoc. 
 
Odpowiedź
#6
To wcześniejsze jest bardziej rozbudowane i bardziej narażone na złe styki. Jakbyś pewnie polutował na pająka to pewnie by działało. To co podałem jest mniej rozbudowane i mniej narażone na jakieś złe stykanie bo po prostu trzeba tylko pin cyfrowy zewrzeć do masy.

No ale po co sobie utrudniać życie skoro można coś zrobić prościej i działa tak samo.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#7
(23-09-2023, 10:02)Jarewa0606 napisał(a): To wcześniejsze jest bardziej rozbudowane i bardziej narażone na złe styki.  Jakbyś pewnie polutował na pająka to pewnie by działało.  To co podałem jest mniej rozbudowane i mniej narażone na jakieś złe stykanie bo po prostu trzeba tylko pin cyfrowy zewrzeć do masy.

No ale po co sobie utrudniać życie skoro można coś zrobić prościej i działa tak samo.
Okej, lubię sobie rozmontowywać układ i montować jeszcze raz na następny dzień z pamięci, bo w taki sposób mi się najlepiej uczy i już dostrzegłem coś czego nie rozumiem. Byłem pewny, że w kodzie zmieniliśmy tylko jedną linijkę z (przycisk, INPUT); na (przycisk, INPUT_PULLUP); a to się okazało, że jeszcze zamieniliśmy kod z if(digitalRead(przycisk) == HIGH)
na if(digitalRead(przycisk) == LOW). I Dotychczas rozumiałem to tak, że na pinie drugim czyli wejście jest stan HIGH i gdy naciskamy przycisk, to układ się zamyka i Arduino wtedy czyta, że jest stan WYSOKI i dlatego się świeci dioda, a tutaj się okazało, że czytając ten kod mówi nam, że na PINIE drugim stan jest HIGH i jak naciskamy przycisk to robi się stan LOW dlatego dioda zaczyna się zapalać a domyślnie bez naciskania przycisku stan jest HIGH? Troszkę się pogubiłem albo mam w ogóle błędne wyobrażenie na jakieś zasadzie to działa wszystko 
 
Odpowiedź
#8
(23-09-2023, 16:56)Alcyb napisał(a): Byłem pewny, że w kodzie zmieniliśmy tylko jedną linijkę z (przycisk, INPUT); na (przycisk, INPUT_PULLUP); a to się okazało, że jeszcze zamieniliśmy kod z if(digitalRead(przycisk) == HIGH)
na if(digitalRead(przycisk) == LOW). I Dotychczas rozumiałem to tak, że na pinie drugim czyli wejście jest stan HIGH i gdy naciskamy przycisk, to układ się zamyka i Arduino wtedy czyta, że jest stan WYSOKI i dlatego się świeci dioda, a tutaj się okazało, że czytając ten kod mówi nam, że na PINIE drugim stan jest HIGH i jak naciskamy przycisk to robi się stan LOW dlatego dioda zaczyna się zapalać a domyślnie bez naciskania przycisku stan jest HIGH? Troszkę się pogubiłem albo mam w ogóle błędne wyobrażenie na jakieś zasadzie to działa wszystko 

Trochę inaczej - wejście układów takich jak ardiuno jest na tyle czułe, że nigdzie nie podpięte ma dość losowy stan. Dodanie opcji PULLUP oznacza, że nigdzie nie podpięte wejście będzie miało zdecydowanie stan HIGH. (Zwolniony przycisk jest przerwą (uwaga: są też inne przyciski), więc wejście jest nigdzie nie podłączone. ) Można je wtedy zwierać do masy zmieniając stan na LOW. Zwieranie do VCC dalej będzie dawać HIGH, więc soft takiego czegoś
nie wykryje.
To czy w if-ie jest ==LOW czy ==HIGH nie ma większego znaczenia - są tylko dwa możliwe przypadki a instrukcja if i tak ma klauzule else więc oba przypadki (LOW i HIGH) są obsłużone, najwyżej będzie odwrotne działanie - po przyciśnieciu LED zgaśnie i po puszczeniu się zapali.

Może zbuduj taki układ bez procka: podłacz kolejno VCC, LED, rezystor 1k, przycisk i masę.
 
Odpowiedź
#9
No i coś z pamięci źle zmontowałeś. W swoim przykładzie zwierałeś do Vcc, a w przykładzie Jarewa0606 należy zwierać do GND. Jak Ci to zadziałało, to miałeś źle zmontowany układ do swojego pierwotnego kodu.

Nie jest ważne czy masz rezystor do GND, czy do VCC, wewnętrzny czy zewnętrzny, ważne by zwierać do stanu przeciwnego, ważne by był rezystor by nie robić zwarcia Vcc do GND, ważne by to co robisz na schemacie i w połączeniach w układzie było zgodne z programem.

Oczywiście ewentualnie odwrócenie logiki odwróci działanie programu, ale program nie zauważy zmiany, jeśli miałeś rezystorem wymuszony stan 0V na pinie pomiarowym a potem go podłączysz do 0V "mocniej" bezpośrednio przyciskiem. Tak samo jak masz włączony pullup, a przyciskiem zwierałbyś do 5V, to dla programu stan się nie zmienia, rezystor tylko ogranicza przepływ prądu, by nie robić zwarcia, ale napięcie po chwili jest z jego obu stron takie samo, gdy już stan się ustabilizuje i prąd przestaje płynąć.

A jak masz włączony pullup i rezystor zewnętrzny do GND, to stan się ustali gdzieś pośrodku zgodnie z proporcjami dzielnika rezystorowego.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości