Skocz do zawartości

Wprost123

Użytkownicy
  • Zawartość

    41
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O Wprost123

  • Ranga
    3/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Na początku spróbuję sam. Jeśli się uda, to będzie większa satysfakcja. Jeśli polegnę to będę tutaj szukał pomocy.
  2. Miałem jeszcze jeden problem, ale udało mi się go rozwiązać. Kod jest długi i dla znawców, jak Kolega ethank zauważył zapewne paskudnie rozrośnięty, więc chyba nie będę się tutaj "chwalił", chyba że ktoś jest bardzo ciekaw. Następnym etapem będzie próba podłączenia mocnych ledów przez tranzystory, a potem uruchomieniem układu na jakichś schodach. W międzyczasie będę też próbował zmienić program tak, żeby sterowanie mogło się odbywać z czujek ruchu. Bardzo dziękuję za dotychczasową pomoc
  3. O... Przepraszam. Jak pisałem, nie wrzuciłem całego kodu, bo f. włączania lub włączania stałego podświetlania nie ma tu znaczenia. Nie zauważyłem że nie wyciąłem wszystkich miejsc gdzie jest ona wymieniona. Wczoraj udało mi się rozwiązać powyższy problem, w sposób opisany w poprzenim poście (w skrócie pisząc, sprawdzając w "kejsie" 7 czy jest naciśnięty drugi przycisk).
  4. Analizowałem wczoraj pracę programu i doszedłem do wniosku, że być może warunki na uruchomienie funkcji ledsOff są poprawne, ale program działa tak, że nie zostaną spełnione. Otóż, gdy nacisnę dwa przyciski w niewielkim odstępie czasu, to pierwszy przycisk uruchomi np. ledsOnWgore i po dojściu zmiennejP1 do wartości 8, uruchomi się f. czasCzekania. Gdy ta funkcja się skończy, to program zamiast porównać czy zmiennaP2 jest mniejsza od zmiennejP1, zaczyna kontynuować naliczanie wartości zmiennej od przycisku który został naciśnięty później (w tym przypadku zmiennejP2). Dopiero gdy zmiennaP2 też urośnie do 8, to program porównuje wartości zmiennejP1 i zmiennejP2 i wtedy niestety obie mają wartość 8. Więc nie jest spełniony żaden z tych warunków do wejścia do f. ledsOff Powinno być więc może tak, że gdy od jednego z przycisków zapalą się już wszystkie diody (przyjmijmy że pierwszy naciskam Przycisk1) czyli zmiennaP1 osiągnie wartość 7, to sprawdzamy czy zmiennaP2 jest większa od 0 (czyli naciśnięto przycisk 2) i czy zmiennaP2 jest mniejsza od zmiennejP1 (czyli przycisk 2 naciśnięto później niż 1) Lub zmiennaP2 ma wartość 0, czyli nie wciśnięto przycisku 2 i jeśli któryś z tych warunków jest spełniony to zmienną stanPrzycisku1 zmieniam na 0, co spowoduje, że nie będzie się dalej naliczała zmiennaP1 od niego, czyli program nie wejdzie do f. czasCzekania tylko pozowoli zmiennejP2 urosnąć do 8 i dopiero od niej uruchomi f. czasCzekania a po niej f. ledsOff od drugiego przycisku. Co o tym sądzicie, myślicie że dobrze rozumuję?
  5. Nie wrzucam całego kodu, bo niestety jest bardzo długi (jest jeszcze jedna funkcja dla trzeciego przycisku, włączająca inną kombinację podświetlania, ale w powyżej opisanym problemie nie ma żadnego udziału). Pewnie dałoby się zrobić to krócej ale narazie dobrze że działa. Problem jest myślę w dwóch warunkach zapisanych w liniach od 202. W komentarzu przy kodzie opisałem jak wg mnie powinien wyglądać warunek, aby wygaszanie następowało od odpowiedniej strony. Może błędnie zapisałem te warunki ? #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 #define przycisk3 11 //przycisk do efektu Pas startowy unsigned long tKrotkiegoNacisniecia1 = 20; // czas krotkiego wcisniecia przycisku unsigned long tDlugiegoNacisniecia1 = 1000; // czas dlugiego wcisniecia przycisku boolean buttonActive1 = false; boolean longPressActive1 = false; unsigned long tKrotkiegoNacisniecia2 = 20; // czas krotkiego wcisniecia przycisku unsigned long tDlugiegoNacisniecia2 = 1000; // czas dlugiego wcisniecia przycisku boolean buttonActive2 = false; boolean longPressActive2 = false; 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 2-do wejścia do f gaszenia (po skończeniu rozświetlania) byte stanPrzycisku2 = 0; byte stanPrzycisku3 = 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 ileRazyP1 = 0; //ilość naciśnięć przycisku 1 volatile int ileRazyP2 = 0; //ilość naciśnięć przycisku 2 void wlaczNaStale(); //włączenie wszystkich diod na stałe void wylaczStale(); boolean wszystkieWlaczone=false; //zmienna informująca czy wszystkie diody są włączone- do f. wlaczNaStale void czasCzekania(); void ledsOnZdolu(); //rozświetlanie i gaszenie z dołu do góry void ledsOffZdolu(); void ledsOnZgory();//rozświetlanie i gaszenie z góry w dół void ledsOffZgory(); void resetZmienna2P1(); //Ta deklaracja może być zbędna, może wystarczy ta z attachInterrupt void resetZmienna2P2(); //Ta deklaracja może być zbędna, może wystarczy ta z attachInterrupt void pasStartowy(); //efekt pasa startowego 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 pinMode(przycisk3,INPUT_PULLUP); //przycisk 3 do efektu pas startowy attachInterrupt(digitalPinToInterrupt(przycisk1), resetZmienna2P1, FALLING); // Przerwanie reagujące na zbocze malejące Przycisk 1 attachInterrupt(digitalPinToInterrupt(przycisk2), resetZmienna2P2, FALLING); // Przerwanie reagujące na zbocze malejące Przycisk 2 Serial.begin(9600); } void loop() { // Rozróżnianie czy przycisk wciśnięty na krótko czy na długo Dla przycisku 1 if (digitalRead(przycisk1) == LOW) { if (buttonActive1 == false) { buttonActive1 = true; tKrotkiegoNacisniecia1 = millis(); } if ((millis() - tKrotkiegoNacisniecia1 > tDlugiegoNacisniecia1) && (longPressActive1 == false)) { longPressActive1 = true; // procedura dla długiego naciśnięcia Serial.println("dlugie nacisniecie P1 "); wlaczNaStale(); wszystkieWlaczone=true; //zmieniamy stan zmiennej, żeby można było wszystkie wyłączyć (jest to też w f. wlaczNaStale) stanPrzycisku1=0; // zerujemy stan przycisku, żeby prog nie wszedł do f. ledsOn (gdy stanPrzycisku1==1 to rusza ledsOn) } } else { if (buttonActive1 == true) { if (longPressActive1 == true) { longPressActive1 = false; } else { // procedura dla krotkiego stanu przycisku if(wszystkieWlaczone==true){ //jeśli wszystkie włączone na stałe to wyłącz Serial.println("krotkie nac. Wylacz stale z P1"); wylaczStale(); wszystkieWlaczone=false; //po wyłączeniu zmieniamy stan zmiennej (jest to też w f. wylaczStale) zmiennaP1=0; } else{ stanPrzycisku1=1; Serial.println("krotkie nac. do f ledsOn Z D"); } } buttonActive1 = false; } } // Rozróżnianie czasu wciśnięcia dla przycisku 2 if (digitalRead(przycisk2) == LOW) { if (buttonActive2 == false) { buttonActive2 = true; tKrotkiegoNacisniecia2 = millis(); } if ((millis() - tKrotkiegoNacisniecia2 > tDlugiegoNacisniecia2) && (longPressActive2 == false)) { longPressActive2 = true; // procedura dla długiego naciśnięcia Serial.println("dlugie nacisniecie P2"); wlaczNaStale(); wszystkieWlaczone=true; //zmieniamy stan zmiennej, żeby można było wszystkie wyłączyć (jest to też w f. wlaczNaStale) stanPrzycisku2=0; // zerujemy stan przycisku, żeby prog nie wszedł do f. ledsOn (gdy stanPrzycisku1==1 to rusza ledsOn) } } else { if (buttonActive2 == true) { if (longPressActive2 == true) { longPressActive2 = false; } else { // procedura dla krotkiego stanu przycisku if(wszystkieWlaczone==true){ //jeśli wszystkie włączone na stałe to wyłącz Serial.println("krotkie nac. Wylacz stale z P2"); wylaczStale(); wszystkieWlaczone=false; //po wyłączeniu zmieniamy stan zmiennej (jest to też w f. wylaczStale) zmiennaP2=0; } else{ stanPrzycisku2=1; Serial.println("krotkie nac. do f ledsOn Z G "); } } buttonActive2 = false; } } if(stanPrzycisku1==1){ // Bez przypisania po naciśnięciu stanu przycisku na 1, jeśli byłoby tylko wywołanie ledsOn, to po wejściu do ledsOn zapali się tylko 1 dioda bo warunek że przycisk jest wciśnięty, już NIE będzie prawdziwy. ledsOnZdolu(); } // Procedury dla przycisku 2 if(stanPrzycisku2==1){ // Bez przypisania po naciśnięciu stanu przycisku na 1, jeśli byłoby tylko wywołanie ledsOn, //to po wejściu do ledsOn zapali się tylko 1 dioda bo warunek że przycisk jest wciśnięty, już NIE będzie prawdziwy. ledsOnZgory(); } if((stanPrzycisku1==2 && zmienna2 >= czasPodtrzymania)&& (zmiennaP1<zmiennaP2 || zmiennaP2==0)){ // wejście do f gaszenia dla przycisku 1 Jeśli minie czas podtrzymania i przycisk P1 został naciśnięty póżniej niż P2 (czyli zmiennaP1<zmiennaP2) Lub przycisk P2 wogóle nie naciśnięty (zmiennaP2==0), to wygaszaj z dołu ledsOffZdolu(); } if((stanPrzycisku2==2 && zmienna2 >= czasPodtrzymania) && (zmiennaP2<zmiennaP1 || zmiennaP1==0)){ // wejście do f gaszenia dla przycisku 2 analogicznie ledsOffZgory(); } } void ledsOnZdolu(){ ileRazyP1=0; if(zmiennaP1>3 && zmiennaP1<=7 && 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 3 jedn dodatkowePodtrzymanie=3; } newTime = millis(); if (newTime - oldTime >= 600) { oldTime = newTime; zmiennaP1++; Serial.print("zmiennaP1 z ledsOnZdolu "); 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łącz led1 digitalWrite(led1, HIGH); break; case 2: //odliczasz kolejną 1sek i włącz 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: ileRazyP1=0; // zerujemy dla f czas czekania stanPrzycisku1 = 2; //Zmieniamy stan przycisku na 2 bo gdyby był na 0 to po dojściu zmiennej2 powyżej czasPodtrzymania, //zaczęło by się ledsOff również dla drugiego przycisku-drugiej strony, mimo ze tam nie był pzycisk wciśnięty czasCzekania(); break; } } void ledsOnZgory(){ ileRazyP2=0; if(zmiennaP2>3 && zmiennaP2<=7 && digitalRead(przycisk2)==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 3 jedn dodatkowePodtrzymanie=3; } newTime = millis(); if (newTime - oldTime >= 600) { oldTime = newTime; zmiennaP2++; Serial.print("zmiennaP2 z ledsOnZgory "); Serial.println(zmiennaP2); } switch (zmiennaP2) //dzięki temu że minęla 1sek możemy wybrać co się stanie { case 1: //jeśli minęły 1sek włącz led1 digitalWrite(led7, HIGH); break; case 2: //odliczasz kolejną 1sek i włącz led2 digitalWrite(led6, HIGH); break; case 3: digitalWrite(led5, HIGH); //itd 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: ileRazyP2=0; //zerujemy dla f. czas czekania stanPrzycisku2 = 2; //Zmieniamy stan przycisku na 2 bo gdyby był na 0 to po dojściu zmiennej2 powyżej czasPodtrzymania, //zaczęło by się ledsOff również dla drugiego przycisku-drugiej strony, mimo ze tam nie był pzycisk wciśnięty czasCzekania(); break; } } void ledsOffZdolu(){ if((ileRazyP1>=1)&&(zmiennaP1>8)){ //Jeśli ktoś nacisnie w czasie gaszenia, to rozświetl od początku i wyzeruj podtrzymanie // Oraz wyzeruj zmiennaP1. Więc ledsOff startuje ze zmiennaP1=0 NIE = 9 więc przechodzi czas równy podświetlaniu (1-8) potem przy zmiennejP1=9 zaczyna gasnąć. Trochę na odwrót, ale działa zmiennaP1=0; zmienna2=0; ledsOnZdolu(); } newTime = millis(); Serial.print("newTime z ledsOff z D "); Serial.println(newTime); if (newTime - oldTime >= 600) { oldTime = newTime; zmiennaP1++; Serial.print("wart zmiennaP1 z ledsOff Z dolu "); 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); stanPrzycisku1 = 0; stanPrzycisku2=0; //resetowanie wartości obu przycisków zmiennaP1 = 0; zmiennaP2=0; zmienna2=0; ileRazyP1=0; dodatkowePodtrzymanie=0; //reset dodatkowego potrzymania Serial.print("dodatkowe potrzym "); Serial.println(dodatkowePodtrzymanie); break; } } void ledsOffZgory(){ if((ileRazyP2>=1)&&(zmiennaP2>8)){ //Jeśli ktoś nacisnie w czasie gaszenia, to rozświetl od początku i wyzeruj podtrzymanie // Oraz wyzeruj zmiennaP1. Więc ledsOff startuje ze zmiennaP1=0 NIE = 9 więc przechodzi czas równy podświetlaniu (1-8) potem przy zmiennejP1=9 zaczyna gasnąć. Trochę na odwrót, ale działa zmiennaP2=0; zmienna2=0; ledsOnZgory(); } newTime = millis(); Serial.print("newTime z ledsOff z G "); Serial.println(newTime); if (newTime - oldTime >= 600) { oldTime = newTime; zmiennaP2++; Serial.print("wart zmiennaP2 z ledsOff z gory "); Serial.println(zmiennaP2); } switch (zmiennaP2) //kontynuacja switchów z wcześniejszej części { case 9: digitalWrite(led7, LOW); //wyłączasz led1 break; case 10: //wyłączasz led2 digitalWrite(led6, LOW); break; case 11: //wyłaczasz led3 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; stanPrzycisku1=0; //resetowanie wartości obu przycisków zmiennaP2 = 0; zmiennaP1=0; zmienna2=0; ileRazyP2=0; dodatkowePodtrzymanie=0; //reset dodatkowego potrzymania Serial.print("dodatkowe potrzym "); Serial.println(dodatkowePodtrzymanie); 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) if(czasPodtrzymania==0){ //Przy czasie podtrzymania=0 działa błędnie. Więc po skręceniu na 0 itak poprawi na 1 czasPodtrzymania=1; } 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 >= 800) // odliczaj po 1s { oldTimePodtrzymania = newTimePodtrzymania; zmienna2++; //co 1sek zwiększasz wartość zmiennej2 if(ileRazyP1>=1){ //Jeśli naciśnięto kolejny raz przycisk to reset podtrzymania i zmiennejP1. Następnie przechodzi do ledsOff ze zmiennąP1=0 // NIE = 9 więc tam przechodzi czas równy podświetlaniu potem przy zmiennejP1=9 zaczyna gasnąć. Trochę na odwrót, ale działa zmiennaP1=0; zmienna2=0; ileRazyP1=0; } if(ileRazyP2>=1){ //Jeśli naciśnięto kolejny raz przycisk to reset podtrzymania i zmiennejP1. Następnie przechodzi do ledsOff ze zmiennąP1=0 // NIE = 9 więc tam przechodzi czas równy podświetlaniu potem przy zmiennejP1=9 zaczyna gasnąć. Trochę na odwrót, ale działa zmiennaP2=0; zmienna2=0; ileRazyP2=0; } ileRazyP1=0; // Reset zmiennych ileRazy, żeby w f. ledsOff było można wydłużyć świecenie gdy kolejne naciśnięcie ileRazyP2=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 resetZmienna2P1() { ileRazyP1++; delay(100); if(zmiennaP1>15){ zmiennaP1=0; } Serial.print("ile razy P 1 "); Serial.println(ileRazyP1); } void resetZmienna2P2() { ileRazyP2++; delay(100); if(zmiennaP2>15){ zmiennaP2=0; } Serial.print("ile razy P 2 "); Serial.println(ileRazyP2); } A propos biblioteki Timers, to do rozróżnienia czasu naciśnięcia przycisku próbowałem użyć biblioteki EasyButton poleconej mi przez inną osobę. Okazało się, że bibliotek wykonuje tylko jeden kod, zależny od długości czasu naciśnięcia. Więc ktoś podrzucił mi kod rozpoznający czas naciśnięcia bez użycia dodatkowych bibliotek. Długi, ale działa.
  6. A czy Kolega mógłby podpowiedzieć jak taki warunek mógłby wyglądać w moim przypadku?
  7. Udało mi się z rozróżnianiem czasu naciśnięcia dla obu przycisków. Program ma już większość z założonych przeze mnie funkcji (chociaż do miana napisanego w optymalny sposób, mu daleko, ale na tym etapie cieszę się że w ogóle coś działa). Jest jeszcze taki problem- gdy nacisnę jeden przycisk a tuż po nim drugi (dwie osoby idą z przeciwnych kierunków, prawie w tym samym czasie) to dwa poniższe warunki sprawiają, że uruchamia się gaszenie dla każdej ze stron i w efekcie diody gasną od dołu i od góry jednocześnie, po kolei. Ostatnia gaśnie środkowa. A powinno być tak, że diody gasną w sposób wyznaczony przez przycisk naciśnięty później. Czyli jeśli ktoś idzie z dołu, zapaliły się już np. 3 stopnie i w tym momencie wchodzi ktoś z góry czyli zapala dopiero 1 stopień od góry, to gaszenie powinno się odbyć od góry (ledsOffZgory), bo ta osoba później zejdzie ze schodów. Próbowałem, tak jak poniżej, ale niestety nie działa. Może źle zapisałem kod warunku który opisałem w komentarzu ?? if((stanPrzycisku1==2 && zmienna2 >= czasPodtrzymania)&& (zmiennaP1<zmiennaP2 || zmiennaP2==0)){ // wejście do f gaszenia dla przycisku 1 Jeśli minie czas podtrzym i przycisk P1 został naciśnięty póżniej niż P2 (czyli zmiennaP1<zmiennaP2) Lub przycisk P2 wogóle nie naciśnięty (zmiennaP2==0), to wygaszaj z dołu ledsOffZdolu(); } if((stanPrzycisku2==2 && zmienna2 >= czasPodtrzymania) && (zmiennaP2<zmiennaP1 || zmiennaP1==0)){ // wejście do f gaszenia dla przycisku 2 Analogicznie ledsOffZgory(); }
  8. Z pomocą z innego forum stworzyłem taki kod. Niestety nie wiem jak wyłączyć diody gdy będą w funkcji wlaczNaStale (czyli uruchomić funkcję wylaczStale) tak, żeby nie uruchomić przy tym zwykłego podświetlania?? Myślałem, żeby zupełnie poniżej dać kolejny if taki: if(digitalRead(przycisk1)==LOW and wszystkieWlaczone==true){ wylaczStale(); } Żeby, gdy wszystkie ledy świecą i naciśniemy przycisk na dowolny czas, to uruchomi się funkcja wylaczStale, która zgasi wszystkie ledy. Niestety nie działa w ten sposób. void loop() { // Rozróżnianie czy przycisk wciśnięty na krótko czy na długo if (digitalRead(przycisk1) == LOW) { if (buttonActive == false) { buttonActive = true; tKrotkiegoNacisniecia = millis(); } if ((millis() - tKrotkiegoNacisniecia > tDlugiegoNacisniecia) && (longPressActive == false)) { longPressActive = true; // procedura dla długiego naciśnięcia wlaczNaStale(); stanPrzycisku1=0; // zerujemy stan przycisku, żeby prog nie wszedł do f. ledsOn (gdy stanPrzycisku1==1 to rusza ledsOn) } } else { if (buttonActive == true and wszystkieWlaczone==false) { if (longPressActive == true) { longPressActive = false; } else { // procedura dla krotkiego stanu przycisku stanPrzycisku1=1; } buttonActive = false; } } if(stanPrzycisku1==1){ ledsOn(); // Bez przypisania po naciśnięciu stanu przycisku na 1, jeśli byłoby tylko wywołanie ledsOn, //to po wejściu do ledsOn zapali się tylko 1 dioda bo warunek że przycisk jest wciśnięty, już NIE będzie prawdziwy. if(digitalRead(przycisk1)==LOW and wszystkieWlaczone==true){ wylaczStale(); } } 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(); } } Jutro będę próbował zrobić z millis wg pomysłu @jas123
  9. @jas123 @jas123 Kod narazie wygląda tak. Po naciśnięciu przycisku ma po kolei załączać diody. Potem jest regulowany potencjometrem czas w którym wszystkie diody świecą, a na koniec diody po kolei gasną. Kod zapewne mógłby zostać jakoś skrócony, poprawiony itp. Mam nadzieję, że z czasem pewne rzeczy będę potrafił zrobić w jakiś prostszy, ładniejszy sposób. Nie wiem jak go zmodyfikować, żeby w zależności od długości wciśnięcia przycisku uruchamiał funkcję ledsOn lub wlaczNaStale #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 wlaczNaStale(); //włączenie wszystkich diod na stałe void wylaczStale(); boolean wszystkieWlaczone=false; //zmienna informująca czy wszystkie diody są włączone- do f. wlaczNaStale 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(){ ileRazy=0; if(zmiennaP1>3 && zmiennaP1<=7 && digitalRead(przycisk1)==LOW){ // 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 3jedn dodatkowePodtrzymanie=3; } 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łącz led1 digitalWrite(led1, HIGH); break; case 2: //odliczasz kolejną 1sek i włącz 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(); stanPrzycisku1 = 0; break; } } void ledsOff(){ newTime = millis(); Serial.print("newTime z ledsOff "); Serial.println(newTime); if (newTime - oldTime >= 800) { 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); stanPrzycisku1 = 0; zmiennaP1 = 0; zmienna2=0; dodatkowePodtrzymanie=0; //reset dodatkowego potrzymania Serial.print("dodatkowe potrzym "); Serial.println(dodatkowePodtrzymanie); 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 >= 800) // 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 podtrzymania i zmiennej1. Następnie przechodzi do ledsOff ze zmiennąP1=0 // NIE = 9 więc tam przechodzi czas równy podświetlaniu potem przy zmiennejP1=9 zaczyna gasnąć. Trochę na odwrót, ale działa zmiennaP1=0; 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); } void wlaczNaStale() { digitalWrite(led1,HIGH); digitalWrite(led2,HIGH); digitalWrite(led3,HIGH); digitalWrite(led4,HIGH); digitalWrite(led5,HIGH); digitalWrite(led6,HIGH); digitalWrite(led7,HIGH); ileRazy=0; wszystkieWlaczone=true; } void wylaczStale(){ digitalWrite(led1,LOW); digitalWrite(led2,LOW); digitalWrite(led3,LOW); digitalWrite(led4,LOW); digitalWrite(led5,LOW); digitalWrite(led6,LOW); digitalWrite(led7,LOW); ileRazy=0; wszystkieWlaczone=false; }
  10. @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.
  11. 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.
  12. 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.
  13. 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.
  14. Poprawienie zapisu warunku pomogło Dziękuję. Kod Kolegi też wgram i popatrzę jakie będą efekty.
  15. @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.
×
×
  • Utwórz nowe...