Skocz do zawartości
Komentator

Kurs Arduino - #2 - podstawy programowania, porty I/O

Pomocna odpowiedź

Kamil3D, witam na forum 🙂 Do rozwiązanie tego problemu najlepiej wykorzystać zmienne, które pozwolą zapamiętać stan diody. Informacje na ich temat znajdziesz w kolejnych częściach kursu 🙂

Udostępnij ten post


Link to post
Share on other sites

Witam,
Posiadam 1 przycisk i 1 diode.

Naciskam przycisk = analogWrite(dioda, 40);

Naciskam drugi raz przycisk = analogWrite(dioda, 80);

Naciskam trzeci raz przycisk = digitalWrite(dioda, HIGH);

naciskam czwarty raz = dioda nie swieci.

Proszę o pomoc. Jak najprościej. Potem sobie użyje switch case.

Wiem że musi być zmienna która będzie zliczać, ale nie moge sobie z tym poradzić.

pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

neuneu, czy wykonałeś ćwiczenia związane ze zmiennymi (temat ten jest opisany w kursie dalej)? Wystarczy, że po każdym wciśnięciu przycisku będziesz zwiększa wartość zmiennej. Pokaż co już zrobiłeś i gdzie masz problem - łatwiej będzie znaleźć rozwiązanie 🙂

Udostępnij ten post


Link to post
Share on other sites
const int przycisk = 4 ;
const int led = 10;
int state;
int lastState;
int buttonCounter = 0;

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

void loop() {
 state = digitalRead(przycisk);
 if (state != lastState)
 {
   if (state == LOW) 
   {
     buttonCounter++;
   }
   lastState = state;
 }

 if (buttonCounter  == 1) 
 {
   analogWrite(led, 40);
 }
 else if (buttonCounter == 2)
 {
   analogWrite(led, 80);
 }
 else if (buttonCounter == 3)
 {
   analogWrite(led, 130);
 }
 else if (buttonCounter >= 4)
 {
   digitalWrite(led, LOW);
 }
}
/

Proszę bardzo.

Jak teraz dodać aby nie było styków? Da sie to jakoś jeszcze uproscic?

Udostępnij ten post


Link to post
Share on other sites

neuneu, jeśli chodzi Ci o eliminację drgań styków, to najłatwiej będzie tutaj dodać jakieś opóźnienie np. "delay(80)" na końcu bloku funkcji, które są wykonywane po wciśnięciu przycisku, czyli po "buttonCounter++;".

Udostępnij ten post


Link to post
Share on other sites

Dzięki. A co do wyżej wymienionego kodu to da sie go jakos uproscic?

Udostępnij ten post


Link to post
Share on other sites

neuneu, proponowałbym (tak jak sam wcześniej pisałeś) zamiast z warunków skorzystać z konstrukcji switch-case, która powinna trochę rozjaśnić program 🙂

Udostępnij ten post


Link to post
Share on other sites

void setup() {

pinMode(10, OUTPUT);

pinMode(9, OUTPUT);

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

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

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

digitalWrite(9,LOW);

digitalWrite(10, LOW);

}

void loop()

{

if (digitalRead(7) == LOW) { //Jeśli przycisk wciśnięty

digitalWrite(8, HIGH);//Włącz diodę

digitalWrite(9, HIGH);

delay(1000);

digitalWrite(9, LOW);

delay(1000);

digitalWrite(10, HIGH);

delay(100);

digitalWrite(10, LOW);

delay(100);

} else { //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty)

digitalWrite(8, LOW); //Wyłącz diodę

}

}

// put your main code here, to run repeatedly

Kod chyba jasny, ale jak zrobić żeby dioda nr.10 migała cały czas z interwałem 100ms(przy wciśniętym przycisku), a dioda 9 z interwałem 1s. Teraz dioda 10 czeka aż 9 mignie i potem ona miga, co wynika wprost z programu, ale nie mogę dojść do tego jak to napisać by migały "niezależnie" od siebie oczywiście tylko jeśli jest wciśnięty przycisk.

Dioda 8 tylko ma świecić po naciśnięciu, ona mnie nie interesuje.

__________

Komentarz dodany przez: Treker

Kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.

Udostępnij ten post


Link to post
Share on other sites

SOYER, takie programy wykonywane są linia, po linii. Działanie jest więc poprawne. Jeśli dopiero zaczynasz naukę programowania, to raczej nie polecam eksperymentów z pisaniem programów działających równolegle, bo nie jest to łatwa sprawa. Z założenia mikrokontrolery nie są przystosowane do takiej pracy - nie można uruchomić "dwóch wątków" jednocześnie w prosty sposób.

Udostępnij ten post


Link to post
Share on other sites

Też do tego doszedłem:-). Niby było to oczywiste, że program jest wykonywany linijka po linijce, ale teraz dopiero dotarły do mnie ograniczenia z tego wynikające. W automatyce "analogowej" którą montuję każdy osobny "układ" jest niezależny można powiedzieć. Owszem mogą zależeć od siebie wzajemnie, ale każdy wykonuje to co do niego należy i co oczywiste mogą działać równolegle.

Spore ograniczenie, lub utrudnienie skoro twierdzisz, że da się to zrobić na Arduino.

Udostępnij ten post


Link to post
Share on other sites

SOYER, takie rzeczy da się realizować przykładowo z użyciem funkcji milis, ale nie jest to zbyt proste (jak na pierwsze próby z Arduino). Temat ten wykracza poza ramy kursu podstaw Arduino, jeśli jesteś tym mocniej zainteresowany, to polecam lekturę dokumentacji Arduino: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Udostępnij ten post


Link to post
Share on other sites
const int ledPin =  LED_BUILTIN;// the number of the LED pin


int ledState = LOW;             // zmienna standiody którą zmieniamy w programie


unsigned long previousMillis = 0;        // zmienna unsigned long to taka która może zapamiętać dużą liczbę, ta akurat (previousMillis) zapamiętuje kiedy ostatnio zmieniał się stan diody, w pierwszej pętli jej wartość to "0"


const long interval = 1000;           //zmienna stała(wiem jak to brzmi), "tylko do odczytu", interwał między mignięciami 1s

void setup() {

 pinMode(ledPin, OUTPUT); // 
}

void loop() {

 unsigned long currentMillis = millis();//millis to czas w ms od uruchomienia programu(czyli to nasza zmienna currentMillis)

 if (currentMillis - previousMillis >= interval) { jesli od aktualnego czasu(currentMillis) odjąć 
poprzedni czas zapisany w zmiennej previousMillis(w pierwszej pętli to 0) i różnica jest większa
lub równa wpisanej "zmiennej stałej" interval

   previousMillis = currentMillis;// to aktualny czas millis zapisujemy do zmiennej previousMillis


   if (ledState == LOW) {
     ledState = HIGH;//  warunkowo zmieniamy stan zmiennej ledState
   } else {
     ledState = LOW;
   }


   digitalWrite(ledPin, ledState);//i wł lub wył diodę zmienną ledState
 }
}

Napiszcie mi czy dobrze rozumiem działanie tego programu

Jutro sprawdzę go praktycznie.

W pierwszej linijce kodu przypisujemy stałe wyjście, diodę wbudowaną, ale zdaje się, że jest ona zblokowana z wyjściem 13 i jeśli tam podepnę diodę to też będzie, no właśnie co robić? Migać z interwałem 1s??

Jak można użyć taki program?

Mam rozumieć, że on się wykonuje niejako obok innej pętli?

Jak to wygląda w praktyce?

Może jakiś mini programik pokazujący multitasking arduino 😉

Pozdrawiam.

Udostępnij ten post


Link to post
Share on other sites

SOYER, zagadnienie to wykracza poza tematy poruszane w tym kursie - załóż proszę osobny temat, aby nie mieszać w głowie osobom, które będą wykonywały ćwiczenia z kursu i czytały później komentarze. Z góry dziękuję za pomoc w utrzymaniu porządku na forum 😉

Udostępnij ten post


Link to post
Share on other sites

Witam mam male pytanie? co musiałbym zrobić żeby dwie lub więcej diody mogły jednocześnie migać?

Tu jest mój szkic

void setup() {

pinMode(8, OUTPUT); //Konfiguracja pinu 8 jako wyjscie

pinMode(7, OUTPUT);

}

void loop () {

digitalWrite(8, HIGH); //włączenie diody

delay(1000); // odczekanie 1 sekundy

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

delay(1000); //odczekanie jednej sekundy

digitalWrite(7, HIGH);

delay(1000);

digitalWrite(7, LOW);

delay(1000);

}

__________

Komentarz dodany przez: Treker

Kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.

Udostępnij ten post


Link to post
Share on other sites

Przerobiłem twój program:

void setup() {
pinMode(8, OUTPUT); //Konfiguracja pinu 8 jako wyjscie
pinMode(7, OUTPUT);
}


void loop () {
digitalWrite(8, HIGH); //włączenie diody
digitalWrite(7, HIGH);
delay(1000); // odczekanie 1 sekundy
digitalWrite(8, LOW); //Wyłączenie diody
digitalWrite(7, LOW);
delay(1000); //odczekanie jednej sekundy
} 

Udostępnij ten post


Link to post
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...