matrix0606 Październik 31, 2020 Udostępnij Październik 31, 2020 2 godziny temu, Wprost123 napisał: Gdyby Kolega wgrał na początek mój dotychczasowy program na Arduino i potestował jak to działa, to byłbym wdzięczny.😀 Jak kolega poprawi kod tak żeby się kompilował to wgram i przetestuję. Mój najnowszy kod działa jak na filmiku poniżej: -> FILMIK <- Cytuj Link do komentarza Share on other sites More sharing options...
Wprost123 Listopad 1, 2020 Autor tematu Udostępnij Listopad 1, 2020 To ciekawe. U mnie nie wyrzuca błędu, ale to na symulatorze. W kursie z forbot.pl funkcja która ma być wywołana przez przerwanie, też nie była dodatkowo wcześniej deklarowana, tylko w "attachInterrupt....." Dodałem więc void resetZmienna2(); w definicjach. Może teraz zadziała na realnym Arduino. #define led1 4 #define led2 5 #define led3 6 #define led4 7 #define led5 8 #define led6 9 #define led7 10 #define przycisk1 2 #define przycisk2 3 unsigned long oldTime= 0; //zmienna starego czasu między rozświetlaniem diod unsigned long newTime = 0; unsigned long oldTimePodtrzymania = 0; //zmienna starego czasu podtrzymania świecenia unsigned long newTimePodtrzymania = 0; byte zmiennaP1 = 0; //zmienna dla przycisku 1 - ilość case-ów byte zmiennaP2 = 0; //zmienna dla przycisku 2- ilość case-ów byte stanPrzycisku1 = 0; //0-puszczony, 1-wciśnięty byte stanPrzycisku2 = 0; int odczytanaWartosc = 0; byte zmienna2 = 0; //zmienna ilosci seknud które mineły w podtrzymaniu int czasPodtrzymania = 1; // NIE zero żeby warunek w loop if(stanPrzycisku1==0 and zmienna2 >= czasPodtrzymania Nie był od razu spełniony na starcie int dodatkowePodtrzymanie=0; //zmienna zwiększająca odczytaną wart. czasPodtrzymania. Jeśli jesteśmy w ledsOn i naciśnięto przycisk to przedłuża czas podtrzym. volatile int ileRazy = 0; //ilość naciśnięć przycisku void ledsOnDoGory(); void ledsOffNaDol(); void czasCzekania(); void resetZmienna2(); //Ta deklaracja może być zbędna, może wystarczy ta z attachInterrupt void setup() { pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); pinMode(led6, OUTPUT); pinMode(led7, OUTPUT); pinMode(przycisk1, INPUT_PULLUP); //przycisk 1 pinMode(przycisk2, INPUT_PULLUP); // przycisk 2 attachInterrupt(digitalPinToInterrupt(przycisk1), resetZmienna2, FALLING); // Przerwanie reagujące na zbocze malejące Serial.begin(9600); } void loop() { if (digitalRead(przycisk1) == 0) { stanPrzycisku1 = 1; } if (digitalRead(przycisk2) == 0) { stanPrzycisku2 = 1; } if (stanPrzycisku1 == 1) { ledsOn(); } if (stanPrzycisku2 == 1) { ledsOn(); } if(stanPrzycisku1==0 and zmienna2 >= czasPodtrzymania){ // wejście do f gaszenia ledsOff(); } if((stanPrzycisku1==1)&& (zmiennaP1>8)){ // Jeśli kolejne naciśnięcie przycisku, a jesteśmy w gaszeniu to rozświetl od początku zmiennaP1=0; zmienna2=0; ledsOn(); } } void ledsOn(){ if((stanPrzycisku1==1)&&(digitalRead(przycisk1)==0)&&(zmiennaP1>2)&&(zmiennaP1<=7)){ // Jeśli jesteśmy w rozświetlaniu i zapaliły się więcej niż 2 diody to kolejne naciśnięcie przycisku zwiększa podtrzymanie o 5 jedn dodatkowePodtrzymanie=3; } newTime = millis(); if (newTime - oldTime >= 1000) { oldTime = newTime; zmiennaP1++; Serial.print("zmiennaP1 z ledsOn "); Serial.println(zmiennaP1); } switch (zmiennaP1) //dzięki temu że minęla 1sek możemy wybrać co się stanie { case 1: //jeśli minęły 1sek włączasz led1 digitalWrite(led1, HIGH); break; case 2: //odliczasz kolejną 1sek i włączasz led2 digitalWrite(led2, HIGH); break; case 3: digitalWrite(led3, HIGH); //itd break; case 4: digitalWrite(led4, HIGH); break; case 5: digitalWrite(led5, HIGH); break; case 6: digitalWrite(led6, HIGH); break; case 7: digitalWrite(led7, HIGH); break; case 8: czasCzekania(); //zamiast tego mozna zastosować delay jak pisałem wyżej. stanPrzycisku1 = 0; break; } } void ledsOff(){ newTime = millis(); Serial.print("newTime z ledsOff "); Serial.println(newTime); if (newTime - oldTime >= 1000) { oldTime = newTime; zmiennaP1++; Serial.print("wart zmiennaP1 z ledsOff "); Serial.println(zmiennaP1); } switch (zmiennaP1) //kontynuacja switchów z wcześniejszej części { case 9: digitalWrite(led1, LOW); //wyłączasz led1 break; case 10: //wyłączasz led2 digitalWrite(led2, LOW); break; case 11: //wyłaczasz led3 digitalWrite(led3, LOW); break; case 12: digitalWrite(led4, LOW); break; case 13: digitalWrite(led5, LOW); break; case 14: digitalWrite(led6, LOW); break; case 15: digitalWrite(led7, LOW); stanPrzycisku2 = 0; zmiennaP1 = 0; zmienna2=0; break; } } void czasCzekania() { //jako że program nie jest wymagający to tutaj również można użyć delay'a bo i tak program jest wstrzymany do //cała ta pętla wstrzyma Ci cały program póki nie zostanie spełniony warunek za wyrażeniem while { odczytanaWartosc = analogRead(A0); //odczytujesz wartość z portu A0 czasPodtrzymania = map(odczytanaWartosc, 0, 1023, 0, 10); //zamienia zmienną z przedziału od 0 do 1023 na zmienną od 0 do 10 (sekund) Serial.print("t podtrzym z potenc. "); Serial.println(czasPodtrzymania); czasPodtrzymania=czasPodtrzymania+dodatkowePodtrzymanie; Serial.print("t podtrzym+ dodatk "); Serial.println(czasPodtrzymania); newTimePodtrzymania = millis(); if (newTimePodtrzymania - oldTimePodtrzymania >= 1000) // odliczaj po 1s { oldTimePodtrzymania = newTimePodtrzymania; zmienna2++; //co 1sek zwiększasz wartość zmiennej2 if(ileRazy>=1){ //Jeśli naciśnięto kolejny raz przycisk to reset zmienna2 zmienna2=0; ileRazy=0; } Serial.print("ZMIENNA 2 akt. wart. "); Serial.println(zmienna2); } } while (zmienna2 <= czasPodtrzymania); //a pętla trwa póki zmienna2 nie osiągnie wartości zmapowanej zmiennej czasPodtrzymania } void resetZmienna2() { ileRazy++; Serial.print("ile razy "); Serial.println(ileRazy); } Cytuj Link do komentarza Share on other sites More sharing options...
Wprost123 Listopad 1, 2020 Autor tematu Udostępnij Listopad 1, 2020 Chciałbym jeszcze dodać opcję włączania na stałe tym samym przyciskiem. Miałoby to wyglądać tak, że jeśli jesteśmy w ledsOn, i szybko naciśniemy 2x przycisk (np pomiędzy 1 a 2 naciśnięciem jest mniej niż 0,5s) , to wszystkie diody się zaświecą na stałe, a przy kolejnym naciśnięciu zgasną. Natomiast jeśli kolejne naciśnięcia są w odstępach większych niż 0,5s to zmienna2 jest zwiększana o te ustawione np. 3 wartości i tym samym przedłuża się podtrzymanie w funkcji czasCzekania. Próbowałem w ten sposób zmienić funkcję resetZmienna2, ale nie działa. Od razu włączyły mi się wszystkie diody, mimo że przycisk nacisnąłem pierwszy raz. (Dodałem funkcję wlaczNaStale i zmienną czasWcisniecia). void resetZmienna2() //f do resetowania zmiennej2 (gdy jesteśmy w f czasCzekania) { czasWcisniecia=millis(); if((digitalRead(przycisk1)==0) && (millis()-czasWcisniecia<200)){ wlaczNaStale(); } else{ ileRazy++; Serial.print("ile razy "); Serial.println(ileRazy); } Cytuj Link do komentarza Share on other sites More sharing options...
matrix0606 Listopad 1, 2020 Udostępnij Listopad 1, 2020 (edytowany) 41 minut temu, Wprost123 napisał: To ciekawe. U mnie nie wyrzuca błędu, ale to na symulatorze. W kursie z forbot.pl funkcja która ma być wywołana przez przerwanie, też nie była dodatkowo wcześniej deklarowana, tylko w "attachInterrupt....." Dodałem więc void resetZmienna2(); w definicjach. Może teraz zadziała na realnym Arduino -> OTO EFEKT <- Lewa "czujka" nie działała z racji że wyskoczył mi przewód z arduino ale nie zmienia to działania prawej "czujki". Edytowano Listopad 1, 2020 przez matrix0606 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Wprost123 Listopad 1, 2020 Autor tematu Udostępnij Listopad 1, 2020 (edytowany) Jak narazie nie pisałem nic na drugą czujkę. Gdy uda się z pierwszą wszystkie funkcje, to drugą powinno się udać zrobić przez analogie. Przestaję już ufać symulatorowi. W nim sekwencja zapalania diod uruchamia się poprawnie- tylko raz. Zostawiam więc kwestię uruchamiania na stałe jednym przyciskiem. Pytanie, czy poniższy warunek jest poprawny tzn. czy jeśli naciśnę przycisk tylko raz, to diody rozświetlą się na czas ustalony z potentcjometru, a jeśli będąc w ledsOn nacisnę kolejny raz, to czasCzekania będzie równy potencjometr+dodatkowe np. 3 okresy? Czy może będzie tak że za każdym razem czasCzekania będzie równy potencjometr+np3 okresy, nawet gdy nacisnę przycisk tylko raz? Czy ma tutaj jakieś znaczenie to, że zmienna ileRazy po naciśnięciu przycisku zostanie zliczona zapewne nie raz, ale kilka lub kilkanascie bo Arduiono szybko naliczy (chyba drgania styków też w to wejdą)? void ledsOn(){ if((stanPrzycisku1==1)&&(digitalRead(przycisk1)==0)&&(zmiennaP1>2)&&(zmiennaP1<=7)){ // Jeśli jesteśmy w rozświetlaniu i zapaliły się więcej niż 2 diody to kolejne naciśnięcie przycisku zwiększa podtrzymanie o 3 // CZY POWYŻEJ JEST POPRAWNIE ?? dodatkowePodtrzymanie=3; } newTime = millis(); if (newTime - oldTime >= 200) { oldTime = newTime; zmiennaP1++; Serial.print("zmiennaP1 z ledsOn "); Serial.println(zmiennaP1); } switch (zmiennaP1) //dzięki temu że minęla 1sek możemy wybrać co się stanie { case 1: //jeśli minęły 1sek włączasz led1 digitalWrite(led1, HIGH); break; case 2: //odliczasz kolejną 1sek i włączasz led2 digitalWrite(led2, HIGH); break; // itd. W symulatorze działa poprawnie, tzn. czasCzekania jest zależny od ilości naciśnięć, ale w rzeczywistości pewnie nie będzie tak ładnie. W poniedziałek lub wtorek będę miał Arduino, więc zobaczę jak działa na żywo. Edytowano Listopad 1, 2020 przez Wprost123 Cytuj Link do komentarza Share on other sites More sharing options...
Wprost123 Listopad 2, 2020 Autor tematu Udostępnij Listopad 2, 2020 (edytowany) Mam już Arduino. Program jako tako działa, ale niestety dodawanie dodatkowego czasu do czasCzekania, gdy jesteśmy w ledsOn źle funkcjonuje. Nawet mimo jednego naciśnięcia, do zmiennej2 itak jest dodawana dodatkowa wartość. Myślę, że coś źle zrobiłem w warunku poniżej z funkcji ledsOn. Chciałem, żeby było tak "gdy zmiennaP1>3 i mniejsza od 8 oraz przycisk wciśnięty" to wtedy dodatkowe podtrzymanie=6. Jeśli nie, to dodatkowePodtrzymanie=0. Proszę o podpowiedź co zrobiłem źle i czy to własnie z budowy tego warunku może wynikać problem? void ledsOn(){ if((zmiennaP1>3 && zmiennaP1<8)&& (digitalRead(przycisk1==LOW))) { // Jeśli jesteśmy w rozświetlaniu i zapaliły się więcej niż 3 diody to kolejne naciśnięcie przycisku zwiększa podtrzymanie o 5 jedn dodatkowePodtrzymanie=6; } else{ dodatkowePodtrzymanie=0; } newTime = millis(); if (newTime - oldTime >= 800) { oldTime = newTime; zmiennaP1++; Serial.print("zmiennaP1 z ledsOn "); Serial.println(zmiennaP1); } switch (zmiennaP1) //dzięki temu że minęla 1sek możemy wybrać co się stanie { case 1: //jeśli minęły 1sek włączasz led1 digitalWrite(led1, HIGH); break; ciąg dalszy Edytowano Listopad 2, 2020 przez Wprost123 Cytuj Link do komentarza Share on other sites More sharing options...
Wprost123 Listopad 2, 2020 Autor tematu Udostępnij Listopad 2, 2020 (edytowany) @matrix0606 Mam już Arduino. Program jako tako działa, ale niestety dodawanie dodatkowego czasu do czasCzekania, gdy jesteśmy w ledsOn źle funkcjonuje. Nawet mimo jednego naciśnięcia, do zmiennej2 itak jest dodawana dodatkowa wartość. Myślę, że coś źle zrobiłem w warunku poniżej z funkcji ledsOn. Chciałem, żeby było tak "gdy zmiennaP1>3 i mniejsza od 8 oraz przycisk wciśnięty" to wtedy dodatkowe podtrzymanie=6. Jeśli nie, to dodatkowePodtrzymanie=0. Proszę o podpowiedź co zrobiłem źle i czy to własnie z budowy tego warunku może wynikać problem? A może umieściłem warunek w złym miejscu?? Przypadkiem dwa razy wysłałem ten sam post. Edytowano Listopad 2, 2020 przez Wprost123 Cytuj Link do komentarza Share on other sites More sharing options...
matrix0606 Listopad 3, 2020 Udostępnij Listopad 3, 2020 (edytowany) Nie do końca potrafię odpowiedzieć Ci na pytanie ale wiem że w pierwszej linii w tym kodzie masz nawias w niewłaściwym miejscu. Poniżej już poprawiony fragment. void ledsOn(){ if(zmiennaP1>3 && zmiennaP1<8 && (digitalRead(przycisk1)==LOW)) { // Jeśli jesteśmy w rozświetlaniu i zapaliły się więcej niż 3 diody to kolejne naciśnięcie przycisku zwiększa podtrzymanie o 5 jedn Natomiast poniżej masz kod który u mnie działa jak na filmiku który nagrywałem Ci gdzieś tam wyżej, pozmieniaj sobie tylko pinologię na początku w sekcji #drfine. #include <Arduino.h> #define led1 2 #define led2 3 #define led3 4 #define led4 5 #define led5 6 #define led6 7 #define led7 8 #define przycisk1 0 #define przycisk2 1 unsigned long oldTime = 0; //zmienna starego czasu między rozświetlaniem diod unsigned long newTime = 0; unsigned long oldTimePodtrzymania = 0; //zmienna starego czasu podtrzymania świecenia unsigned long newTimePodtrzymania = 0; //byte iloscKrokow = 17; // il. diod x 4 bo co 2 case-y się zapalają + podtrzymanie np 4 okresy i gaszenie byte zmiennaP1 = 0; //zmienna dla przycisku 1 byte zmiennaP2 = 0; //zmienna dla przycisku 2 byte stanPrzycisku1 = 0; //0-puszczony, 1-wciśnięty byte stanPrzycisku2 = 0; int odczytanaWartosc = 0; byte zmienna2 = 0; //zmienna ilosci seknud które mineły w podtrzymaniu int czasPodtrzymania = 0; bool wpusc1 = 0; bool wpusc2 = 0; void ledsOnUp(); void ledsOnDown(); void czasCzekania(); //void odczytCzujek(); void zeruj(); void debugging(); void setup() { pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); pinMode(led6, OUTPUT); pinMode(led7, OUTPUT); pinMode(przycisk1, INPUT_PULLUP); //przycisk 1 pinMode(przycisk2, INPUT_PULLUP); // przycisk 2 Serial.begin(9600); } void loop() { //odczytCzujek(); if ((digitalRead(przycisk1) == 0) && stanPrzycisku2 == 0) // && wpusc1 == 0) { stanPrzycisku1 = 1; zmiennaP1 = 0; wpusc1 = 1; } if ((digitalRead(przycisk2) == 0) && stanPrzycisku1 == 0) // && wpusc2 == 0) { stanPrzycisku2 = 1; zmiennaP2 = 0; wpusc2 = 1; } newTime = millis(); if (newTime - oldTime >= 1000) { oldTime = newTime; if (stanPrzycisku1 == 1) { zmiennaP1++; ledsOnUp(); } if (stanPrzycisku2 == 1) { zmiennaP2++; ledsOnDown(); } } //delay(500); //debugging(); } void ledsOnUp() { switch (zmiennaP1) { case 1: digitalWrite(led1, HIGH); break; case 2: digitalWrite(led2, HIGH); break; case 3: digitalWrite(led3, HIGH); break; case 4: digitalWrite(led4, HIGH); break; case 5: digitalWrite(led5, HIGH); break; case 6: digitalWrite(led6, HIGH); break; case 7: digitalWrite(led7, HIGH); break; case 8: czasCzekania(); break; case 9: digitalWrite(led1, LOW); break; case 10: digitalWrite(led2, LOW); break; case 11: digitalWrite(led3, LOW); break; case 12: digitalWrite(led4, LOW); break; case 13: digitalWrite(led5, LOW); break; case 14: digitalWrite(led6, LOW); break; case 15: digitalWrite(led7, LOW); stanPrzycisku1 = 0; wpusc1 = 0; break; } } void ledsOnDown() { switch (zmiennaP2) { case 1: digitalWrite(led7, HIGH); break; case 2: digitalWrite(led6, HIGH); break; case 3: digitalWrite(led5, HIGH); break; case 4: digitalWrite(led4, HIGH); break; case 5: digitalWrite(led3, HIGH); break; case 6: digitalWrite(led2, HIGH); break; case 7: digitalWrite(led1, HIGH); break; case 8: czasCzekania(); break; case 9: digitalWrite(led7, LOW); break; case 10: digitalWrite(led6, LOW); break; case 11: digitalWrite(led5, LOW); break; case 12: digitalWrite(led4, LOW); break; case 13: digitalWrite(led3, LOW); break; case 14: digitalWrite(led2, LOW); break; case 15: digitalWrite(led1, LOW); stanPrzycisku2 = 0; wpusc2 = 0; break; } } void czasCzekania() { //jako że program nie jest wymagający to tutaj również można użyć delay'a bo i tak program jest wstrzymany do //cała ta pętla wstrzyma Ci cały program póki nie zostanie spełniony warunek za wyrażeniem while { odczytanaWartosc = analogRead(A0); //odczytujesz wartość z portu A0 czasPodtrzymania = map(odczytanaWartosc, 0, 1023, 0, 10); //zamienia zmienną z przedziału od 0 do 1023 na zmienną od 0 do 10 (sekund) newTimePodtrzymania = millis(); void odczytCzujek(); if (newTimePodtrzymania - oldTimePodtrzymania >= 1000) // odliczaj po 1s { oldTimePodtrzymania = newTimePodtrzymania; zmienna2++; //co 1sek zwiększasz wartość zmiennej2 } } while (zmienna2 < czasPodtrzymania); //a pętla trwa póki zmienna2 nie osiągnie wartości zmapowanej zmiennej czasPodtrzymania } void zeruj() { digitalWrite(led1, 0); digitalWrite(led2, 0); digitalWrite(led3, 0); digitalWrite(led4, 0); digitalWrite(led5, 0); digitalWrite(led6, 0); digitalWrite(led7, 0); } void debugging() { Serial.print("zmiennaP1-"); Serial.println(zmiennaP1); Serial.print("zmiennaP2-"); Serial.println(zmiennaP2); } Edytowano Listopad 3, 2020 przez matrix0606 Cytuj Link do komentarza Share on other sites More sharing options...
Wprost123 Listopad 3, 2020 Autor tematu Udostępnij Listopad 3, 2020 (edytowany) Poprawienie zapisu warunku pomogło 🙂 Dziękuję. Kod Kolegi też wgram i popatrzę jakie będą efekty. Edytowano Listopad 3, 2020 przez Wprost123 Cytuj Link do komentarza Share on other sites More sharing options...
Wprost123 Listopad 4, 2020 Autor tematu Udostępnij Listopad 4, 2020 Kod Kolegi (narazie na jednym przycisku) też działa nieźle. Dodałem tylko na początku funkcji ledsOnUp zerowanie zmiennej2, ponieważ przy pierwszym uruchominiu program czekał czas określony przez potencjometr po czym rozpoczynał gaszenie, ale przy kolejnym naciśnięciu już tego nie robił, bo zmienna2 była już na tyle duża, że od razu rozpoczynało się gaszenie. Cytuj Link do komentarza Share on other sites More sharing options...
Wprost123 Listopad 7, 2020 Autor tematu Udostępnij Listopad 7, 2020 (edytowany) Chciałbym jeszcze dodać możliwość podświetlenia wszystkich schodów na stałe, poprzez dłuższe naciśnięcie przycisku. Proszę o podpowiedź jak to obwarunkować. Myślałem, żeby w pętlii loop, przed dotychczasowymi warunkami czyli min. jeśli wciśnięto przycisk to stan przycisku==1 i uruchom funkcję ledsOn itd. dodać warunek, że jeśli zmienna ileRazy została naliczona np więcej niż 30 razy, to wtedy uruchomi się funkcja wlaczNaStale rozświetlająca wszystkie diody. Nie wiem niestety jak sprawić, aby program najpierw sprawdzał czy naliczono więcej niż 30 razy zmiennej ileRazy, a jeśli nie, to żeby sprawdzał pozostałe warunki w funkcji loop. Jeśli wlaczNaStale zostanie uruchomiona, to po kolejnym naciśnięciu przycisku powinna zostać uruchomiona funkcja wylaczStale która wygasi diody i program znów przejdzie do czekania na naciśnięcie przycisku- długie lub krótkie. Napisałem kod jak poniżej, ale nie działa dobrze. Proszę o podpowiedź jak można to zrealizować. void loop() { if(ileRazy>30 and wszystkieWlaczone==false){ // Jeśli wciśnięto dłużej przycisk to włącz ledy na stałe wlaczNaStale(); } if(digitalRead(przycisk1)==LOW and wszystkieWlaczone==true){ // Jeśli wszystkie włączone i wciśnięto przycisk, to wyłącz stałe podświetlanie wylaczStale(); } else{ if (digitalRead(przycisk1) == 0) { stanPrzycisku1 = 1; } if (digitalRead(przycisk2) == 0) { stanPrzycisku2 = 1; } if (stanPrzycisku1 == 1) { ledsOn(); } if (stanPrzycisku2 == 1) { ledsOn(); } if(stanPrzycisku1==0 and zmienna2 >= czasPodtrzymania){ // wejście do f gaszenia ledsOff(); } if((stanPrzycisku1==1)&& (zmiennaP1>8)){ // Jeśli kolejne naciśnięcie przycisku, a jesteśmy w gaszeniu to rozświetl od początku zmiennaP1=0; zmienna2=0; ledsOn(); } } } Funkcja wlaczNaStale to wszystkie diody ustawione na HIGH i zmienna wszystkieWlaczone ustawiona na true i zeruje zmienną ileRazy. Funkcja wylaczStale to wszystkie diody na LOW i zmienna wszystkieWlaczone ustawiona na false i zeruje zmienną ileRazy. Edytowano Listopad 7, 2020 przez Wprost123 Cytuj Link do komentarza Share on other sites More sharing options...
matrix0606 Listopad 8, 2020 Udostępnij Listopad 8, 2020 Jak by kolega mógł ciut jaśniej napisać bo nic nie rozumiem. Czy przycisk już istnieje i jest używany do czegoś czy go nie ma ? Jeśli nie ma to co stoi na przeszkodzie by taki przycisk dodać i po sprawie. Cytuj Link do komentarza Share on other sites More sharing options...
Anonim Listopad 8, 2020 Udostępnij Listopad 8, 2020 Mam pytanie czy w tym projekcie nie lepiej jest użyć biblioteki Timers. Gdzieś na tym forum jest opis jak jej użyć.Wydaje się ,że program się uprości.Gdybyście zdecydowali się na użycie biblioteki Timers to muszę Wam powiedzieć,że są dwie różne o tej samej nazwie.Wersja biblioteki tylko z dwoma plikami jest tą właściwą do tego projektu. Timers.rar Cytuj Link do komentarza Share on other sites More sharing options...
Wprost123 Listopad 8, 2020 Autor tematu Udostępnij Listopad 8, 2020 (edytowany) 5 godzin temu, matrix0606 napisał: Jak by kolega mógł ciut jaśniej napisać bo nic nie rozumiem. Czy przycisk już istnieje i jest używany do czegoś czy go nie ma ? Jeśli nie ma to co stoi na przeszkodzie by taki przycisk dodać i po sprawie. Przycisk już jest. Jeden (bo narazie robię tylko rozświetlanie w górę) i chciałbym, żeby w zależności od tego jak długo jest wciśnięty, uruchamiała się albo funkcja ledsOn albo wlaczNaStale. Przy krótkim naciśnięciu przycisku program nalicza mi ok 5-10 razy zmienną ileRazy (wtedy powinna się uruchomić funkcja ledsOn). Więc gdy przytrzymałbym przycisk odpowiednio długo to naliczy np. więcej niż 30 i wtedy powinna się uruchomić funkcja wlaczNaStale. Jeśli diody włączą się na stałe, to po ponownym naciśnięciu przycisku (już dowolna długość naciśnięcia) wszystkie diody powinny zgasnąć i program powinien czekać na kolejne krótkie lub długie naciśnięcie przycisku i zależnie od długości tego naciśnięcia, znów albo uruchomić rozświetlanie po kolei, albo wszystkie na stałe. A może da się ten wybór która funkcja ma zostać uruchomiona (czy rozświetlanie po kolei czy włączenie na stałe), jakoś inaczej uzależnić od tego jak długo jest wciśnięty przycisk, bez zliczania zmiennej ileRazy? Chociaż nie mam zupełnie pomysłu jak. @szymonw Dziękuję. Poszukam informacji nt. tej biblioteki Timers. Edytowano Listopad 8, 2020 przez Wprost123 Cytuj Link do komentarza Share on other sites More sharing options...
Wprost123 Listopad 9, 2020 Autor tematu Udostępnij Listopad 9, 2020 (edytowany) @matrix0606 Jak narazie, mimo wielu prób nie udało mi się stworzyć sposobu aby dobrze rozróżnić jaka ma się wykonać akcja w zależności od długości naciśnięcia przycisku. Chyba jest tak dlatego, że gdy daję warunki if(ileRazy<20) {ledsOn();} oraz if(ileRazy>20) {wlaczNaStale();} to ten pierwszy warunek zawsze zostanie spełniony gdy tylko nacisnę przycisk (nie zależnie od tego jak długo jest wciśnięty) i uruchomi przypisaną mu funkcję, a drugi warunek zostanie spełniony tylko gdy przytrzymam przycisk dłużej. Czyli pierwszy jest spełniony zawsze i ewentualnie drugi. A chciałbym osiągnąć stan albo jeden, albo drugi. Edytowano Listopad 9, 2020 przez Wprost123 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!