Skocz do zawartości

Arduino przycisk on/off


matixseo

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 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

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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
Share on other sites

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 do komentarza
Share on other sites

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.