Skocz do zawartości

Dwa przyciski


Pomocna odpowiedź

Witam,

piszę, ponieważ nie potrafię sobie poradzić z pozornie prostą sprawą.

Arduino UNO, płytka stykowa na której są dwie diody yel1 i yel2 oraz dwa przyciski but1 i but2.

Zamysł jest taki, żeby but1 sterował diodą yel1 oraz bu2 sterował yel2 (włączał i wyłączał za pomocą jednego przyciśnięcia, niezależnie od czasu jego trwania oraz niezależnie od drugiego układu).

Kod który mam:

Kod programu:

   #define yel1 9
   #define yel2 10

   #define but1 6
   #define but2 7

   boolean stan1 = false;
   boolean stan2 = false;

   void setup() {
     pinMode(yel1, OUTPUT);
     pinMode(yel2, OUTPUT);
     pinMode(but1, INPUT_PULLUP);
     pinMode(but2, INPUT_PULLUP);

   }

   void loop() {


     while (digitalRead(but1) == HIGH) delay(20);
     while (digitalRead(but1) == LOW) delay(20);
     { stan1 = !stan1;
     digitalWrite(yel1, stan1);
     }


     while (digitalRead(but2) == HIGH) delay(20);
     while (digitalRead(but2) == LOW) delay(20);
     {stan2 = !stan2; 
     digitalWrite(yel2, stan2);
     }


   }

Na tym kodzie układ działa po kolei jakby wymagał wszystkich sekwencji po kolei. Czyli but1 - włącza y1, but2 - włącza y2, but 1 - wyłącza y1, but2 - wyłącza y2. W innej kolejności układ w ogóle nie reaguje.

Czy może ktoś podpowiedzieć jak to napisać? Proszę tylko o nie trollowanie "mądrymi radami cioci Gieni" oraz proszę nie odsyłać mnie do książek bo już pier*olca dostaję od szukania rozwiązania 🙂

Link to post
Share on other sites
Czy może ktoś podpowiedzieć jak to napisać? Proszę tylko o nie trollowanie "mądrymi radami cioci Gieni" oraz proszę nie odsyłać mnie do książek bo już pier*olca dostaję od szukania rozwiązania

Ale bez odesłania Cię do książek ani rusz bo widać, że nie masz pojęcia jak programuje się w C. Jak według Ciebie mają działać te pętle while?

Według mnie musisz zacząć od postaw nauki C, jeśli tak obrzydły Ci książki to chociaż jakiś kurs na yt, szkoda Twoich nerwów. Bez tego tylko się zniechęcisz do programowania.

Link to post
Share on other sites

W przypadku jednego przycisku i jednej diody to działa. Problem pojawia się, gdy dokładam drugi przycisk i drugą diodę.

Uczę się poprzez analizowanie postawionego przeze mnie problemu.

Nigdzie nie napisałem, że obrzydły mi książki. Dużo czytam i dużo szukam. Jak nie ma efektu, to się wtedy zniechęcam.

Poza tym prosiłem, żeby nie było mądralińskich wstawek, a mimo to napisałeś.

Lepiej pomóż mi rozwiązać zadanie, jak wiesz jak to zrobić.

Link to post
Share on other sites

Zadałem Ci proste pytanie "jak Twoim zdaniem działają te pętla while", bo już tu jest pies pogrzebany, a wynika to właśnie z braków znajomości języka C.

Sugeruje je przeanalizować co każda z nich robi i kiedy w nich zatrzymuje się program.

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

Jedno wciśnięcie przycisku (niezależnie od czasu trwania), ma zmienić stan diody.

I w tym wypadku zdublowana pętla while (digitalRead(przycisk==LOW)) while (digitalRead(przycisk==HIGH)) ma działać jako aktywator zmiany stanu {stan=!stan} diody.

I kiedy kod dotyczy jednej diody to tak działa. Ale kiedy dopisuję podobne linijki dla drugiej pary przycisk+dioda to nie chcą działać niezależnie.

I tylko o to mi chodzi.


#define yel1 9
#define but1 6

boolean stan1 = false;

void setup() {
 pinMode(yel1, OUTPUT);
 pinMode(but1, INPUT_PULLUP);


}

void loop() {


 while (digitalRead(but1) == LOW) delay(20);
 while (digitalRead(but1) == HIGH) delay(20);
 { stan1 = !stan1;
 digitalWrite(yel1, stan1);
   }


}

Takie rozwiązanie jak wyżej działa. Znalazłem to analizując inny kod do innego ćwiczenia jako jego fragment i postanowiłem sprawdzić jak te sekwencje działają rozbudowane.

Kiedy dopisuję komplet dla drugiej pary przycisk+dioda, funkcjonowanie zaczyna się pieprzyć. Powiedz mi jak to ominąć, bo jak ktoś mi tego nie podpowie, to będę dalej czytał czytał czytał i może przypadkiem trafię, jak mi ktoś inny nie podpowie.

Nie rób z C jakiejś magii, bo jak siedzisz w tym, to struktury czujesz intuicyjnie. Po prostu napisz mi po koleżeńsku, czego mam użyć do rozdzielenia tego w prosty sposób a jak będzie mi to działało to sobie sam dojdę. Wytłumacz mi łopatologicznie, jakbyś dzieciakowi tłumaczył.

Ranyyy, naprawdę wdzięczny Ci jestem, że jako jedyny zainteresowałeś się tematem. Ale weź podejdź do tego po ludzku 🙂 Bo gdybym nie miał braków znajomości C, znawco 🙂 , to bym nie zadawał pytań na forum tylko na nie odpowiadał.

Link to post
Share on other sites

jankowalski, niestety żeby programować w C musisz się najpierw tego języka nauczyć - to samo dotyczy każdego innego. To nie magia, ale po prostu zrozumienie.

A cytując klasyka: Kup książkę, przeczytaj: https://helion.pl/ksiazki/jezyk-ansi-c-programowanie-wydanie-ii-brian-w-kernighan-dennis-m-ritchie,jansic.htm#format/d

Tylko nie myśl że to drętwa cegła - może i książka nie nowa, ale warta przeczytania.

Link to post
Share on other sites

Programów nie pisze się w ten sposób, że siadasz i uciskasz z różnych stron, męczysz język aż zacznie działać. Zastanów się chwilę, to przynosi dużo lepsze efekty: skoro zrobiłeś miejsce w kodzie, gdzie wykonanie programu zatrzymuje się aż do aktywacji przycisku, to nie możesz tego w prosty sposób powielić. Takie coś działa tylko z jednym przyciskiem, bo masz jeden program i jeden procesor go wykonujący. Tylko w jednym miejscu może stać i czekać a jeśli sprawdza tam tylko jeden przycisk, to tylko jeden naraz działa. Musisz w tym samym miejscu, w jednej pętli oczekiwania obsługiwać wszystkie swoje przyciski i wychodzić z niej gdy którykolwiek zostanie naciśnięty.

Od razu zacznij pisać funkcje, to pozwala na fajny podział kodu na zamknięte obszary, które robią coś sensownego. Zacznij od napisania funkcji np. kbd_scan() typu int, która po wywołaniu czeka do naciśnięcia któregokolwiek z iluśtam (niechby i dwóch) przycisków i oddaje numer tego wciśniętego. Umiesz to zrobić? Tylko to, wrzuć kod albo rozłóż ręce - nie życzę sobie żadnych głupich uwag.

Link to post
Share on other sites

Mam prośbę. Podpowiedz mi czego mam szukać konkretnie, żeby rozwiązać problem. Bo książkę już mam (pdf nie pytaj skąd 🙂 ), tylko nie za dużo na czytanie jej. Dodatkowo obczytałem:

https://techniczny.wordpress.com/2012/04/07/wielozadaniowosc-w-arduino/

http://www.plociennik.info/index.php/sterowanie-wykonywaniem-kodu

http://akademia.nettigo.pl/petle_podstawy_jezyka_arduino/ - ale tu za dużo nie znalazłem

https://www.forbot.pl/forum/topics50/c-zmiana-dzialania-programu-jednym-przyciskiem-vt6955.htm

oraz jeszcze parę innych, szukałem nawet rozwiązań w gotowych programach IDE

dodatkowo wykonuję ćwiczenia z kursu arduino i analizuję wpisy oraz wykonywanie ćwiczeń przez innych.

Przez dwa ostatnie dni, a właściwie popołudnia przepisałem ten kod ze 50 razy w różnych konfiguracjach stosując różne rozwiązania i patrzyłem co z tego wyjdzie

Murwa kadź - nawet nie chce mi się tłumaczyć - jest określony problem więc proszę o jego rozwiązanie. Jak nie wiesz jak to rozwiązać albo nie chce Ci się pomyśleć, to naprawdę nie potrzebuję komentarzy w tym stylu, bo kuźwa, nie wiesz jak się uczę i jaki mam system nauki. I, naprawdę, możesz być bardzo mądrym i fajnym człowiekiem - ale ten swój komentarz odłóż dokładnie na tę samą półkę co tę książkę :*

Proszę o pomoc w tym konkretnym przypadku, żebym mógł lepiej zrozumieć postawiony problem 🙂

[ Dodano: 26-10-2017, 23:59 ]

Umiesz to zrobić? Tylko to, wrzuć kod albo rozłóż ręce - nie życzę sobie żadnych głupich uwag.

Jeszcze nie umiem tego zrobić ale zobaczymy czy się uda.

Moje "uwagi" są takie jak posty moich interlokutorów 🙂

W każdym razie, dzięki za odpowiedź, pierwszy post (w ogóle) który wniósł do mojego problemu coś sensownego. Przynajmniej wiem z czego wystartować.

Link to post
Share on other sites

Zamiast się denerwować i przeklinać w wymyślny sposób spróbuj może od napisania prostych programów. Niestety ale pewnych etapów nauki nie da się przeskoczyć - no chyba że baardzo chcesz.

A skoro wydajesz się bardzo ambitny i czytasz o wielozadaniowości, mogę podać Ci proste rozwiązanie.

Po pierwsze zainstaluj sobie bibliotekę z FreeRTOS-em: https://create.arduino.cc/projecthub/feilipu/using-freertos-multi-tasking-in-arduino-ebc3cc

Teraz możesz napisać program, który będzie miał 2 równoległe zadania, coś typu:

#include <Arduino_FreeRTOS.h>

#define yel1 9
#define yel2 10

#define but1 6
#define but2 7

boolean stan1 = false;
boolean stan2 = false;

void Task1( void *pvParameters );
void Task2( void *pvParameters );

void setup() {
 pinMode(yel1, OUTPUT);
 pinMode(yel2, OUTPUT);
 pinMode(but1, INPUT_PULLUP);
 pinMode(but2, INPUT_PULLUP);

 xTaskCreate(Task1, (const portCHAR *)"Task1", 128, NULL, 1, NULL );
 xTaskCreate(Task2, (const portCHAR *)"Task2", 128, NULL, 1, NULL );
}

void loop()
{
}

void Task1(void *pvParameters)  
{
 (void) pvParameters;

 while (1) {
   while (digitalRead(but1) == HIGH) delay(20);
   while (digitalRead(but1) == LOW) delay(20);
   { stan1 = !stan1;
   digitalWrite(yel1, stan1);
   }
 }
}

void Task2(void *pvParameters)  
{
 (void) pvParameters;

 while (1) {
     while (digitalRead(but2) == HIGH) delay(20);
     while (digitalRead(but2) == LOW) delay(20);
     {stan2 = !stan2;
     digitalWrite(yel2, stan2);
     }
 }
}

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

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.