Skocz do zawartości

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


Komentator

Pomocna odpowiedź

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.

Link do komentarza
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.

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

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.

Link do komentarza
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

Link do komentarza
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.

Link do komentarza
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 😉

Link do komentarza
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.

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

Napisałem program demonstrujący działanie świateł, chodzi o to aby światła można było wyłączyć i włączyć w trakcie pracy przyciskiem. Zastanawiam się czy można by go jeszcze ulepszyć główny mankament według mnie to aby wyłączyć światła trzeba czekać na zakończenie działania pętli czy da się to zrobić tak aby móc wyłączyć światła w dowolnym momencie? Ciekawi mnie również czy da się napisać taki program z wykorzystaniem dwóch pętli zamiast trzech 🙂 Poniżej zamieszczam kopie kodu.

void setup() {

pinMode(10, OUTPUT); //Dioda czerwona

pinMode(9, OUTPUT); //Dioda żółta

pinMode(8, OUTPUT); //Dioda zielona

pinMode(2, INPUT_PULLUP); //Przycisk

digitalWrite(10, LOW); //Wyłączenie diod

digitalWrite(9, LOW);

digitalWrite(8, LOW);

}

void loop()

{

while(digitalRead(2)==HIGH){

digitalWrite(10, LOW); //Czerwona

digitalWrite(9, LOW); //Pomarańczowa

digitalWrite(8, LOW); //Zielona}

}delay(1000);

while(digitalRead(2)==HIGH){

digitalWrite(10, LOW); //Czerwona

digitalWrite(9, LOW); //Pomarańczowa

digitalWrite(8, HIGH); //Zielona

delay(1000); //Czekamy 3 sekundę

digitalWrite(10, LOW); //Czerwona

digitalWrite(9, HIGH); //Pomarańczowa

digitalWrite(8, LOW); //Zielona

delay(1000); //Czekamy 1 sekundę

digitalWrite(10, HIGH); //Czerwona

digitalWrite(9, LOW); //Pomarańczowa

digitalWrite(8, LOW); //Zielona

delay(1000); //Czekamy 3 sekundę

digitalWrite(10, HIGH); //Czerwona

digitalWrite(9, HIGH); //Pomarańczowa

digitalWrite(8, LOW); //Zielona

delay(1000); //Czekamy 1 sekundę

}delay(1000);

while(digitalRead(2)==LOW){

digitalWrite(10, LOW); //Czerwona

digitalWrite(9, LOW); //Pomarańczowa

digitalWrite(8, LOW); //Zielona}

}

}

__________

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.

Link do komentarza
Share on other sites

dexu, witam na forum 🙂 Pamiętaj, aby kody programów obejmować tagami -

ułatwi to wszystkim czytanie programów. Jeśli chciałbyś, aby program reagował natychmiast to należałoby zainteresować się tematami, które są opisane w drugim poziomie kursu Arduino. Problem ten można rozwiązać za pomocą przerwań (Kurs Arduino II – #4 – przerwania, kontaktron, czujnik PIR) lub funkcją millis (Kurs Arduino II – #9 – wielozadaniowość, opóźnienia z millis()).

Link do komentarza
Share on other sites

Funkcje można pisać samodzielnie, może również korzystać z gotowych, dostarczanych przez producentów lub przez maniaków programowania, którzy zechcieli podzielić się własnym kodem. (można)?

Każda funkcja ma swój typ - (czyli rodzaj wynik) może być liczbą, znakiem lub czymś jeszcze innym. (czyli rodzaj zwracanego wyniku)?

Znajdują się w niej instrukcje, które powinny wykonywać się bez przerwy. (wstawimy delay(x) i instrukcje będą się wykonywać z przerwami; zależy jak to zinterpretujemy)?

Za nim jednak do tego dojdziemy musimy poznać wyprowadzenie złącz oraz odpowiednie funkcje, które służą do operowania na portach I/O (Input/Output), czyli na portach wejścia/wyjścia. (zanim)?

Oznacza, to że właśnie za ich pomocą możemy przykładowo sterować diodami lub odczytywać informacje z prostych czujników/przycisków. (przecinek dopiero przed "że")?

SDA, SCL - wyprowadzenia magistrali I2C, wykorzystywana np.: do komunikacji z bardziej zaawansowanymi czujnikami, (wykorzystywanej lub która jest wykorzystywana)?

Na początek wybierzmy wyjście cyfrowe o nr 8. (bez "o" skoro wykorzystany jest skrót)?

Naszym głównym celem będzie napisanie programu, który po wciśnięciu przycisku wyświetli kolejną, poprawną sekwencje świateł. (sekwencję)?

2. Wchodzimy w pętlę while(), które jest tuż poniżej. (która)?

Mam nadzieje, że zauważyłeś równie, że często warto rozbić program na kilka etapów zamiast od razu pisać "pełną funkcjonalność". (nadzieję, również)?

__________

Komentarz dodany przez: Treker

Zmiany wprowadzone - dziękuję za zgłoszenie 🙂

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

vst, dziękuję za zgłoszenie błędów (oraz te z drugiego tematu również). Kurs ma już kilka lat, zabieramy się za jego odświeżanie. Wtedy wszystkie błędy zostaną usunięte na 100%. Oczywiście Twoje poprawki naniosę szybciej 😉

Link do komentarza
Share on other sites

Cytat z 2 części kursu przy opisywaniu pętli while:

"Prawdopodobnie pomyślałeś tutaj o instrukcji warunkowej if. Jednak jak chciałbyś zrealizować miganie diodą?"

W związku z tym mam pytanie, jaka jest różnica w stosowaniu pętli while i instrukcji if, skoro można to samo zrealizować za pomocą if i while, przynajmniej w przypadku migania diod?

/* Osiem diod miga na zmianę co sekundę: 
*  najpierw: z pinów 2,4,6,8, a następnie 3,5,7,9.
*  po wcisnięciu przycisku zwiększa się prędkość migania do 100 ms
*/
void setup()  {
 pinMode (2, OUTPUT); // ustawienie pinów jako wyjscie
 pinMode (3, OUTPUT);
 pinMode (4, OUTPUT);
 pinMode (5, OUTPUT);
 pinMode (6, OUTPUT);
 pinMode (7, OUTPUT);
 pinMode (8, OUTPUT);
 pinMode (9, OUTPUT);
 pinMode (11, INPUT_PULLUP); // wejscie z podciagnieciem do Vcc
}
void loop() {

 if (digitalRead(11) == LOW)/* jesli przycisk jest wcisniety, diody migają 
 z szybkoscia 100 ms. */
 {
 digitalWrite (2, HIGH);
 digitalWrite (4, HIGH);
 digitalWrite (6, HIGH);
 digitalWrite (8, HIGH);
 digitalWrite (3, LOW);
 digitalWrite (5, LOW);
 digitalWrite (7, LOW);
 digitalWrite (9, LOW);
 delay (100);
 digitalWrite (3, HIGH);
 digitalWrite (5, HIGH);
 digitalWrite (7, HIGH);
 digitalWrite (9, HIGH); 
 digitalWrite (2, LOW);
 digitalWrite (4, LOW);
 digitalWrite (6, LOW);
 digitalWrite (8, LOW);
 delay (100);
  } else /*jesli przycisk nie jest wcisniety, diody mrugają na zmiane 
 co sekundę */
 {
   digitalWrite (2, HIGH);
 digitalWrite (4, HIGH);
 digitalWrite (6, HIGH);
 digitalWrite (8, HIGH);
 digitalWrite (3, LOW);
 digitalWrite (5, LOW);
 digitalWrite (7, LOW);
 digitalWrite (9, LOW);
 delay (1000);
 digitalWrite (3, HIGH);
 digitalWrite (5, HIGH);
 digitalWrite (7, HIGH);
 digitalWrite (9, HIGH); 
 digitalWrite (2, LOW);
 digitalWrite (4, LOW);
 digitalWrite (6, LOW);
 digitalWrite (8, LOW);
 delay (1000);
 }
}

i z wykorzystaniem pętli while:

/* Osiem diod miga na zmianę co sekundę: 
*  najpierw: z pinów 2,4,6,8, a następnie 3,5,7,9.
*  po wcisnięciu przycisku zwiększa się prędkość migania do 100 ms
*/
void setup()  {
 pinMode (2, OUTPUT); // ustawienie pinów jako wyjscie
 pinMode (3, OUTPUT);
 pinMode (4, OUTPUT);
 pinMode (5, OUTPUT);
 pinMode (6, OUTPUT);
 pinMode (7, OUTPUT);
 pinMode (8, OUTPUT);
 pinMode (9, OUTPUT);
 pinMode (11, INPUT_PULLUP); // wejscie z podciagnieciem do Vcc
}
void loop() {

 while (digitalRead(11) == LOW)/* jesli przycisk jest wcisniety, diody migają 
 z szybkoscia 100 ms. */
 {
 digitalWrite (2, HIGH);
 digitalWrite (4, HIGH);
 digitalWrite (6, HIGH);
 digitalWrite (8, HIGH);
 digitalWrite (3, LOW);
 digitalWrite (5, LOW);
 digitalWrite (7, LOW);
 digitalWrite (9, LOW);
 delay (100);
 digitalWrite (3, HIGH);
 digitalWrite (5, HIGH);
 digitalWrite (7, HIGH);
 digitalWrite (9, HIGH); 
 digitalWrite (2, LOW);
 digitalWrite (4, LOW);
 digitalWrite (6, LOW);
 digitalWrite (8, LOW);
 delay (100);
  } 

   digitalWrite (2, HIGH);
 digitalWrite (4, HIGH);
 digitalWrite (6, HIGH);
 digitalWrite (8, HIGH);
 digitalWrite (3, LOW);
 digitalWrite (5, LOW);
 digitalWrite (7, LOW);
 digitalWrite (9, LOW);
 delay (1000);
 digitalWrite (3, HIGH);
 digitalWrite (5, HIGH);
 digitalWrite (7, HIGH);
 digitalWrite (9, HIGH); 
 digitalWrite (2, LOW);
 digitalWrite (4, LOW);
 digitalWrite (6, LOW);
 digitalWrite (8, LOW);
 delay (1000);

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