Skocz do zawartości

Arduino przycisk on/off


Pomocna odpowiedź

Może i banalnie sprawa wygląda. Kurs przeczytałem, jednak dla zabawy i nauki chciałem napisać taki program... i szczeka mi opadła bo nie wychodziło mi to.

Podpowiecie jak to powinno wyglądac?

Link to post
Share on other sites
Może i banalnie sprawa wygląda. Kurs przeczytałem, jednak dla zabawy i nauki chciałem napisać taki program... i szczeka mi opadła bo nie wychodziło mi to.

Podpowiecie jak to powinno wyglądac?

Strzelam że nie uwzględniłeś drgań styków:

http://mikrokontrolery.blogspot.com/2011/04/przycisk-drgania-stykow-debouncing.html

Ta pętla wykonuje się pewnie tysiące razy na sekundę, jeśli więc przytrzymasz przycisk nawet przez 1 ms, to stan diody być może zmieni się wielokrotnie. Musisz napisać program tak, aby reagował na zmianę stanu przycisku, a nie na jego położenie. Drugi problem z jakim się zetkniesz to drgania, trzeba więc zrobić tzw. debouncing.

Link to post
Share on other sites

Poradziłem sobie z tym.

Podzielilem to na etapy. Pierwszy to taki który tylko włącza i wyłącza diodę. Drugi to ten który powoduje miganie Led.

Działa ale tylko w pewnym przedziale opóźnienia.

Doszkole się jeszcze i myślę że poradzę sobie z tym.

Musiałbym zastosować przerwanie wywołane z przycisku.

A co najgorsze, bardzo denerwuje mnie używanie funkcji delay, z wiadomych względów.

Nie ukrywam że w programowaniu jestem zielony, zależy mi aby się nauczyć programować, nie dla zysków, nie dla pracy, ale dla samego siebie, dla hobby.

Link to post
Share on other sites

void setup() {

pinMode(8, OUTPUT); //Dioda jako wyjście

pinMode(7, INPUT_PULLUP); //Przycisk jako wejście

digitalWrite(8, LOW); //Wyłączenie diody

}

void loop()

{

while (digitalRead(7) == HIGH){} { //Jeśli przycisk jest wciśnięty

digitalWrite(8, LOW); //Czerwona wyłącz

delay(1000);

while (digitalRead(7) == HIGH){}

digitalWrite(8, HIGH); //Czerwona włącz

delay(1000);

}}

__________

Komentarz dodany przez: Treker

Kod programu, dla lepszej czytelności, należy umieszczać w tagach .

Proszę to poprawić.

Link to post
Share on other sites

Właśnie tego tematu szukałem, problem w tym że:

while (digitalRead(7) == HIGH){} { //Jeśli przycisk jest wciśnięty

digitalWrite(8, LOW); //Czerwona wyłącz

delay(1000); zamiast delay 1s mam delay opisany przez potencjometr, który steruje częstotliwością migania diód

while (digitalRead(7) == HIGH){}

digitalWrite(8, HIGH); //Czerwona włącz

delay(1000); zamiast delay 1s mam delay opisany przez potencjometr, który steruje częstotliwością migania diód

Co w takim przypadku?

__________

Komentarz dodany przez: Treker

Kod programu, dla lepszej czytelności, należy umieszczać w tagach .

Proszę to poprawić.

Link to post
Share on other sites

Kolego, może Ty wiesz dokładnie o co Ci chodzi, ale przyznaj, że pytanie "Co w takim przypadku?" nie mówi zbyt wiele o tym co chcesz zrobić, prawda?

Czy problemem jest to, że:

- nie wiesz jak prosty delay() zamienić na opóźnienie zależne od potencjometru? - na to wskazują wytłuszczenia?

- algorytm nie działa jak chcesz a wytłuszczeniami tylko wskazujesz różnice między tym co pokazujesz a Twoim rzeczywistym kodem w którym obsługujesz potencjometr?

- program jest nieresponsywny, bo delay(1000) zamulają go dokumentnie?

- a może jeszcze coś innego na co nie wpadłem?

Link to post
Share on other sites

Więc kod wygląda tak:

int diodaPin = 7;
int diodaPin1 = 6;
int potPin = 0;     
int pot;            
int przerwa;        
int swit = 5;

void setup() {
 pinMode(diodaPin, OUTPUT);
 pinMode(diodaPin1, OUTPUT);
 pinMode(swit, INPUT_PULLUP);
 digitalWrite(diodaPin, LOW);
 digitalWrite(diodaPin1, LOW);
}

void loop() {


 pot = analogRead(potPin);     // odczytujemy A0 i zapisujemy w zmiennej pot



 przerwa = map(pot, 0, 1023, 50, 1000);

 while (digitalRead(swit) == HIGH){} { //Jeśli przycisk jest wciśnięty 
 delay(500);
   digitalWrite(diodaPin, HIGH);
   delay(przerwa);               // przerwa zależna od położenia potencjometru
   digitalWrite(diodaPin1, HIGH);
   delay(przerwa);               // przerwa zależna od położenia potencjometru
 }
 //while (digitalRead(swit) == LOW){} { //Jeśli przycisk jest wciśnięty 
// delay(500);
   digitalWrite(diodaPin, LOW);
   delay(przerwa);               // przerwa zależna od położenia potencjometru
   digitalWrite(diodaPin1, LOW);
   delay(przerwa);               // przerwa zależna od położenia potencjometru

 //}


}

Aktualnie jak wcisne przycisk to wszystko działa w pętli, jak puszcze to przestaje. Ale nie wiem czego brakuje żeby wciśnięcie i puszczenie przycisku było inicjatorem do rozpoczęcia pętli a kolejne wciśnięcie i puszczenie przycisku do wyłączenia układu.

20160225_165129.jpg

__________

Komentarz dodany przez: Treker

Link to post
Share on other sites

🙂 Teraz wszystko jasne.

Jak pewnie już sam zrozumiałeś, Twój główny program musi pracować w dwóch stanach: mrugania i niemrugania. Przejście z jednego stanu do drugiego ma następować na skutek zdarzenia jakim jest naciśnięcie przycisku. Masz więc do zrobienia dwie (a może więcej, i to równolegle wykonywane) rzeczy:-

- nadzorowanie przycisku czyli wczytywanie jego stanu, detekcja przyciśnięć i wygenerowanie zdarzenia "wciśnięto",
- w reakcji na zdarzenie "wciśnięto" zmiana stanu programu/procesu mrugania,
- proces mrugania który w zależności od aktulanego stanu ma mrugać lub nie.

Jest to książkowy przykład bardzo prostego problemu nierozwiązywalnego jednak dobrze bez zmieny sposobu myślenia o tym co robi procesor. W sumie dobrze, że wymyśliłeś sobie takie zadanie teraz, bo być może nie będziesz kolejnym, który obchodzi takie rzeczy bokiem wstawiając nawet w duże, rozgałęzione programy z uporem maniaka delay() gdzie się da i próbując w międzyczasie sprawdzać przyciski.

Masz dwa wyjścia: albo skorzystać z gotowego rozwiązania (nie najbardziej eleganckiego, ale działającego), albo wymyślić to (inaczej) samemu - być może z naszą pomocą. Gotowiec leży tutaj:

https://learn.adafruit.com/multi-tasking-the-arduino-part-1/overview

Jeśli chcesz samodzielnie nad tym popracować, daj znać a jeśli nie, napisz co zrozumiałeś ze wskazanego opisu i czy jesteś w stanie na tej podstawie rozwiązać swój problem mrugających diodek.

Link to post
Share on other sites

Dzięki za wyczerpującą informacje. Tak jak pisałem wcześniej jestem początkujący i w sumie rozumiem w czym tkwi problem, próbowałem obejść to na kilka sposobów lecz bezskutecznie, przycisk to jednak nie włącznik światła ON/OFF, na początku jak go podłączyłem to sam się zdziwiłem że działa to dwu stopniowo a nie jak przysłowiowy pstryczek. Raczej byłem pewien że wynika to z mojej nie wiedzy co oczywiście jest faktem, no ale Ty rozwiałeś wątpliwości w pewien sposób, jak najbardziej postaram się do czegoś dojść, bo nie mam zamiaru w sumie iść dalej skoro tu się zatrzymałem.

Do lektury oczywiście się zabiorę i dam znać co zrozumiałem.

Mam jeszcze jedno być może głupie pytanie, chodzi mi o schemat wyjście>rezystor>dioda>masa, widziałem inny schemat tego samego zagadnienia który zamieniał miejscami rezystor z diodą i odpowiedź padła że nie ma to znaczenia. Czyli wystarczy że w obiegu będzie rezystor bez znaczenia czy przed czy za diodą to i tak spełni swoje zadanie?

Link to post
Share on other sites

Tak, kolejność jest bez znaczenia.

Programowanie tzw. systemów wbudowanych (embedded systems) leży tak blisko drutów, diodek i tranzystorów, że niewiele zdziałasz bez choćby podstawowej znajomości elektroniki. W wolnym (np. od programowania Arduino 🙂 ) czasie zajrzyj może do naszych kursów. Są tam podstawy podstaw - na pewno się przydadzą. Dorosły PC od razu jest uzbrojony w monitory, klawiatury, myszy, głośniki i całą resztę tego dobytku. Właściwie można usiąść i od razu pisać kod który robi coś sensownego. Tutaj, by płyteczka z procesorem stała się użytecznym urządzeniem trzeba do niej coś podłączyć, bo sama stanowi jedynie martwy gadżet. No i to nie jest już takie proste jak wetknięcie wtyczki do gniazda USB w PC. Wtedy przydaje się wiedza z fizyki, mechaniki, elektroniki itd. Być może właśnie dlatego jest to takie ciekawe 🙂

Link to post
Share on other sites

Jak najbardziej:)

Zanim doszedłem do Arduino(co w sumie długo nie trwało) to wziąłem w ręke lutownice i jakiś zestaw DIY - więc staram się rozwijać w każdym z potrzebnych kierunków. Akurat mam tak że jak się czymś zainteresuje to staram się zgłębiać wiedze dość sumiennie. Dodatkowo jestem użytkownikiem znanego forum e papierosowego i tam jak najbardziej tematy związane z elektroniką nie są obojętne, zresztą jak się podszkole troche w tych sprawach to pewnie nie omieszkam spróbować może nawet sklecić układ operujący w stopniu zadowalającym napięciem/mocą, może temperaturą i ogolnie prawem ohma bo to podstawa w tym temacie.

Link to post
Share on other sites
(edytowany)

Witam. Ułożyłem tak kabelki i inne takie.

904546252_Arduinoprzyciskzdiod.thumb.jpg.4b81c25f7b25a0863c30d8f4aafba516.jpg 

Napisałem taki program jak poniżej. I po naciśnięciu przycisku nie zapala się dioda. Czy mógłby mi ktoś pomóc?

const int przycisk1 = 1;  // Definicja pinu do którego podłączony jest przycisk
const int dioda =  2;   // Definicja pinu do którego podłączona jest dioda

int buttonState = 0;         /* Stan niski (dioda zgaszona) w momencie gdy przycisk 
                                nie jest wcisniety*/
void setup() {
  pinMode(dioda, OUTPUT);        // Ustawienie pinu 10 jako wyjście
  pinMode(przycisk, INPUT);      // Ustawienie pinu 3 jako wejście
}

void loop() {
  
  if (digitalRead(przycisk) == HIGH) {    // Sprawdzamy czy przycisk jest wciśnięty
    digitalWrite(dioda, HIGH);            // Jeśli tak, zapala diodę
  }
  else {                                  // W innym przypadku
                                         // Dioda zgaszona
    digitalWrite(dioda, LOW);
  }
}

 

 

Edytowano przez Gieneq
Link to post
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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.