Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję

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

Autor Wiadomość
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 18-08-2017, 23:23   

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


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
neuneu 



Posty: 16
Wysłany: 24-09-2017, 16:25   1 przycisk 1 dioda wiele funkcji

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

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 26-09-2017, 20:55   

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


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
neuneu 



Posty: 16
Wysłany: 27-09-2017, 17:10   

Kod programu: Zaznacz cały

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?

Ostatnio zmieniony przez neuneu 27-09-2017, 17:58, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 27-09-2017, 21:52   

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++;".


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
neuneu 



Posty: 16
Wysłany: 28-09-2017, 21:53   

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

Ostatnio zmieniony przez neuneu 28-09-2017, 21:53, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 01-10-2017, 13:49   

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


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
SOYER 



Posty: 93
Otrzymał 3 piw(a)
Skąd: Kryry
Wysłany: 05-11-2017, 15:53   

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
Kod programu, dla lepszej czytelności, należy umieszczać w tagach [code]. Proszę to poprawić.

  
Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 05-11-2017, 22:24   

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.


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
SOYER 



Posty: 93
Otrzymał 3 piw(a)
Skąd: Kryry
Wysłany: 06-11-2017, 09:32   

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.

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 06-11-2017, 11:15   

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


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
SOYER 



Posty: 93
Otrzymał 3 piw(a)
Skąd: Kryry
Wysłany: 13-11-2017, 22:23   

Kod programu: Zaznacz cały
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.

Ostatnio zmieniony przez SOYER 13-11-2017, 22:27, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 13-11-2017, 22:27   

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


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Kurs STM32 - #4 - St... Kurs STM32 - #2 - Po... Kurs Arduino - #9 - ... Kurs STM32 - #5 - Ko...
lub przeszukaj forum po wybranych tagach: artykulow, do, komentarze


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki