Skocz do zawartości

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


Pomocna odpowiedź

@ethanak A... to dziękuję, że mi powiedziałeś jak ten program teraz działa, analizując go i pisząc byłem pewien, że będzie działać inaczej...

Ja chcę, aby mój program działał w ten sposób:

  • Program wykonuje w kółko pewną sekwencję ( u mnie zawartą w ELSE)
  • Po naciśnięciu (chciałbym, żeby nie trzeba było go trzymać, tylko kliknąć) wykonuje pewną sekwencje i po jej wykonaniu wraca do mojej sekwencji zawartej w ELSE.

I to tyle... czuję, że to jest tak banalnie proste, a ja nie mogę do tego dojść..

Myślałem, że ten fragment - 

else (digitalRead(7) == HIGH); { //jesli przycisk NIE wcisniety

Będzie powodować wykonywanie sekwencji pod ELSE, kiedy przycisk nie bedzie wciśniety, a IF kiedy go nacisnę.

2 minuty temu, matiowoz98 napisał:

Myślałem, że ten fragment

Przede wszystkim:
 

else // prawidłowo

(digitalRead(7) == HIGH) // czyli porównujesz coś z czymś, ale nie używasz nigdzie wyniku

; // średnik czyli koniec instrukcji

{ cośtam dalej } // czyli blok instrukcji zupełnie niezależny od ifa, elsa czy innego whila przedtem

Teoretycznie powinno to wyglądać mniej więcej tak:

else if (digitalRead(7) == HIGH) { cała druga sekwencja}

Porównaj sobie rozpiskę:

Jeśli (cośtam) wykonaj A, w przeciwnym razie wykonaj B.

i

Jeśli (cośtam) wykonaj A, w przeciwnym razie porównaj X i Y. Wykonaj B.

Które jest tym co chciałeś?

I jeszcze drobiazg:
 

if (przycisk_jest_naciśnięty) {cośtam};
else if (przycisk_nie_jest_naciśnięty) {cośinnego};

Czy Twoim zdaniem może zajść taka sytuacja, że w czasie wykonywania else przycisk będzie naciśnięty? Przecież to już sprawdzałeś. digitalRead zwraca LOW albo HIGH, nie ma trzeciej możliwości!

Czyli po prostu:

if (przycisk_jest_naciśnięty) {cośtam};
else {cośinnego};

Chociaż zaraz zaraz... ależ taka sytuacja może zajść! Wyobraź sobie, że:

  • przycisk nie jest naciśnięty
  • program wykonuje sprawdzenie w instrukcji if i stwierdza, że przycisk nie jest naciśnięty
  • w tym momencie ktoś naciska przycisk
  • program sprawdza w drugim ifie czy przycisk nie jest naciśnięty, stwierdza że jest

w efekcie nie wykona się ani jeden ani drugi kod. Dlatego taka nadmiarowość może prowadzić do trudnych w znalezieniu błędów w czasie wykonania programu (szczególnie że taka sytuacja będzie zachodzić bardzo rzadko).

 

 

 

 

  • Lubię! 1
(edytowany)

@ethanak Czyli dobrze rozumiem, że jeżeli program wykonuje pentlę ELSE i w tym czasie nacisnę przycisk, to nie przejdzie do IF tak?

Jeśli (cośtam) wykonaj A, w przeciwnym razie wykonaj B. - Tą opcję chciałem

Edytowano przez matiowoz98
6 godzin temu, matiowoz98 napisał:

Czyli dobrze rozumiem, że jeżeli program wykonuje pentlę ELSE

Nie, nie rozumiesz. Nie ma żadnej "pentli else" - co to w ogóle ma znaczyć?

I tak, owszem, jeśli program coś robi a Ty w tym czasie naciśniesz przycisk, to nie przejdzie magicznie do wykonywania czegoś innego. Jeśli np. oglądasz serial na Polsacie to jeśli w tym samym czasie TVP poda jakieś wielce ważne informacje - raczej sam się odcinek MacGyvera nie przerwie żeby przełączyć na Teleekspres.

7 godzin temu, matiowoz98 napisał:

Jeśli (cośtam) wykonaj A, w przeciwnym razie wykonaj B. - Tą opcję chciałem

No to teraz zapisz to ładnie w kodzie. Możesz dla uproszczenia na razie założyć, że A to Serial.println("A") a B to Serial.println("B"). (ot tak, żeby za dużo nie pisać).

  • 1 miesiąc później...
(edytowany)

Dzień dobry, jest ktoś w stanie wyjaśnić dlaczego dioda nie mruga co 1 sekundę mimo iż wszystko (kod oraz podłączenie) zrobiłem zgodnie z instrukcją na kursie? Chodzi o pierwszy przykład.

Edytowano przez Bartroz

Po dogłębnej analizie znalazłem problem w swoim układzie, a mianowicie podłączyłem diodę na odwrót. Tak więc dziękuję za odpowiedź, a następnym początkującym radzę się nie śpieszyć przy nauce!

  • Lubię! 1
  • 2 tygodnie później...

Mam problem jak chodzi o petle for.

Teoretycznie powinno świecić 4 razy świeci dużo razy więcej.

Czy to winna że wartość i jest nadpisywana przez 0 w warunku?

A jak tak to jak można eliminować zjawisko?

Pozdrawiam

for (int i =0; i<5; i++){
  digitalWrite(led , HIGH);
delay(500);
digitalWrite(led , LOW);
delay(500);
}

 

 

(edytowany)
19 minut temu, Antagonista99 napisał:

Teoretycznie powinno świecić 4 razy świeci dużo razy więcej.

Teoretycznie powinno swiecic 5 razy...zmienna w petli bedzie miala wartosci 0/1/2/3/4...czyli 5 obiegow...najpierw sprawdza warunek, potem petla sie wypelnia, potem nastepuje inkrementacja, potem sprawdza znow warunek itp...

 

19 minut temu, Antagonista99 napisał:

Czy to winna że wartość i jest nadpisywana przez 0 w warunku

Tak...po kazdym obiegu loop() zmienna w for jest tworzona od nowa i inicjowana zerem wiec for sie powtorzy...

 

19 minut temu, Antagonista99 napisał:

A jak tak to jak można eliminować zjawisko

Mozesz stworzyc zmienna globalna i to wystarczy, ale(!) trzeba pamietac zeby ta zmienna wyzerowac przed kazdym wejsciem do for...

int i = 0; //zmienna globalna

for ( i; i<5; i++)

Jednak wtedy nie mozesz tej zmiennej zerowac przed petla for bo bedzie taka sama sytuacja jaka teraz masz...musisz utworzyc jakis warunek ktory w okreslonym momencie bedzie zerowac ta zmienna zeby mozna bylo wykonac for...

Edytowano przez farmaceuta
  • 2 miesiące później...
(edytowany)
void setup() {
  // put your setup code here, to run once:
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, INPUT_PULLUP);

digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);

digitalWrite(6, LOW);

}

void loop() {
  // put your main code here, to run repeatedly:

digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
delay(1000);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
delay(5000);
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
delay(1000);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
delay(1000);


if (digitalRead(7) == LOW) {
 digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
delay(1000);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
delay(1000);
digitalWrite (6, HIGH);
 digitalWrite (5, LOW);
  delay(3000);
  digitalWrite (6, LOW);
  digitalWrite (5, HIGH);
  delay(1000);
  digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
else {digitalWrite(5, HIGH);
}

}

Cześć

Próbuję zrobić światła drogowe działające tak:

-cały czas sekwencja ziel4, żółte3, czer2, czer2 i zół3, ziel4.... a na przejsciu cały czas czerw5

-chyba, że wcisnę przycisk7 to żół3, czerw2 > na przejściu ziel6, czerw5 i wracam do początku

Mają powyższy program w miarę to działa ale są dwa problemy:
-muszę długo przytrzymać przycisk7 żeby uruchomić if - Dlaczego tak się dzieje?
- i mniejszy problem - idzie czerw2, zół3, czerw2 i dopiero wtedy if - macie na to jakiś pomysł?

Edytowano przez RysiekUP
7 minut temu, RysiekUP napisał:

-muszę długo przytrzymać przycisk7 żeby uruchomić if - Dlaczego tak się dzieje?
 

Delay() to taka funkcja ktora "zamraza" kod na czas jaki zostal ustalony...nie zrobisz z tym nic, jedyny ratunek to funkcja millis() ktora nie blokuje i program reaguje bardzo szybko na jakies zdarzenia...poprostu kod wykonuje sie w kolko bardzo szybko..

12 minut temu, RysiekUP napisał:

Dopiero zaczynam więc na razie odpuszczę ten temat bo to nie takie proste 😛

 

przyjdzie z czasem...😉

 

13 minut temu, RysiekUP napisał:

 Ogólnie to wydawało mi się, że mikrokontrolery będą łatwiejsze w obsłudze...

 

Panie to i tak chyba najprostsza wersja programowania...w sensie adruino ide..😉

 

14 minut temu, RysiekUP napisał:

 Ale ciekawi mnie jak sobie z tym poradzą uczniowie podstawówek i ich nauczyciele....

 

nie od razu rzym zbudowano..😉

void setup() {
  // put your setup code here, to run once:
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, INPUT_PULLUP);

digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);

digitalWrite(6, LOW);

}

void loop() {
  static int tab[] = {1000,5000,1000,1000};
  static int tab1[] = {1000,1000,3000,1000,1000};
  static int i = 0;
  static byte stan = 0;
  static long last = 0;
  
  if (millis() - last > tab[i]) {
    i++;
    last = millis();
    if (i == 4) {
      i = 0;
    }
  }
  if (stan == 0) {
if (i == 0) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
if (i == 1) {
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
}
if (i == 2) {
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
if (i == 3) {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
  }

if (digitalRead(7) == LOW) {
stan = 1;
i = 0;
delay(1000);
}

if (millis() - last > tab1[i]) {
    i++;
    last = millis();
  }
    if (i == 5) {
      i = 0;
      stan = 0;
    }
  if (stan == 1) {
    if (i == 0) {
 digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
    }
if (i == 1) {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
if (i == 2) {
digitalWrite (6, HIGH);
 digitalWrite (5, LOW);
}
if (i == 3) {
  digitalWrite (6, LOW);
  digitalWrite (5, HIGH);
}
if (i == 4) {
  digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
}


}

sprawdz...moze zadziala

  • Lubię! 1
10 minut temu, farmaceuta napisał:
28 minut temu, RysiekUP napisał:

 Ogólnie to wydawało mi się, że mikrokontrolery będą łatwiejsze w obsłudze...

 

Panie to i tak chyba najprostsza wersja programowania...w sensie adruino ide..

Nawet mnie nie załamuj 😞 A ja myślałem, że zmienię branżę hehe

Kod, który wysłałeś lepiej działa ale rozgryzienie go pewnie zajęłoby mi całą noc 😝
 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...