Ireneusz1984 Temat założony przez niniejszego użytkownika |
Wielokrotne wciśnięcie przycisku » 2016-06-21 12:36:23 Witam. Początkowy samouk. Napisałem program, który działa naprzemiennie w dwóch pętlach While. Program działa, jednak należy się wbić w opóźnienia, by przełączało płynnie i nie przeskakiwało wielokrotnie. Przycisk niewciśnięty ma stan HIGH Po wciśnięciu przeskakuje do drugiej/następnej pętli. Chciałbym jednak napisać to tak, by jedno wciśnięcie przycisku powodowało przeskoczenie do następnej pętli, niezależnie od czasu trwania stanu LOW/HIGH. Oczywiście nie musi być While. void setup() { pinMode( 2, INPUT_PULLUP ); pinMode( 3, OUTPUT ); pinMode( 4, OUTPUT ); pinMode( 5, OUTPUT ); pinMode( 6, OUTPUT ); Serial.begin( 9600 ); }
void loop() { while( digitalRead( 2 ) == HIGH ) { Serial.println( "PIEREWSZE" ); if( analogRead( A0 ) == 0 ) { digitalWrite( 3, HIGH ); } else digitalWrite( 3, LOW ); if( analogRead( A0 ) == 1023 ) { digitalWrite( 4, HIGH ); } else digitalWrite( 4, LOW ); delay( 100 ); } while( digitalRead( 2 ) == HIGH ) { Serial.println( "DWA" ); if( analogRead( A0 ) == 0 ) { digitalWrite( 5, HIGH ); } else digitalWrite( 5, LOW ); if( analogRead( A0 ) == 1023 ) { digitalWrite( 6, HIGH ); } else digitalWrite( 6, LOW ); delay( 100 ); } }
Mam nadzieje, że dobrze zrozumiałem metodę wstawianie kodu. |
|
mateczek |
» 2016-06-21 12:51:21 1 obie pętle mają ten sam warunek 2 loop to zwykłą funkcja która się skończy jeśli digitalRead( 2 ) różne od high aby napewno dobrze wkleiłeś ?? int main() { bool blokada; bool zbocze; bool przelacznik = false; while( 1 ) { zbocze =( digitalRead( 2 ) == LOW ) &&!blokada; blokada =( digitalRead( 2 ) == LOW ); if( zbocze ) przelacznik = !przelacznik; if( przelacznik ) { } else { } } } |
|
Ireneusz1984 Temat założony przez niniejszego użytkownika |
» 2016-06-21 13:24:49 Program wkleiłem ok. Pętle mają mieć tan sam warunek. Przycisk niewciśnięty ma stan HIGH, więc program ciągle wykonuje jedną z pętli, do puki, gdy zostanie przycisk wciśnięty na chwilę - program ma przeskoczyć do drugiej pętli.
Generalnie chodzi mi o to by jednym joystickiem, który działa lewo, prawo, góra, dół, switch (standardowy do adruino za 5 zł), chciałbym sterować czterema rzeczami poprzez(lewo, prawo,góra, dół), a po jednorazowym wciśnięciu switcha czterema innymi. Po ponownym wciśnięciu switcha, znów czterema tymi pierwszymi i tak w kółko.
|
|
mateczek |
» 2016-06-21 15:29:01 przecież w twoim programie wciśnięcie przycisku spowoduje że funkcja loop() się zakończy !!!! void loop() { while( digitalRead( 2 ) == HIGH ) { Serial.println( "PIEREWSZE" ); if( analogRead( A0 ) == 0 ) { digitalWrite( 3, HIGH ); } else digitalWrite( 3, LOW ); if( analogRead( A0 ) == 1023 ) { digitalWrite( 4, HIGH ); } else digitalWrite( 4, LOW ); delay( 100 ); } while( digitalRead( 2 ) == HIGH ) { Serial.println( "DWA" ); if( analogRead( A0 ) == 0 ) { digitalWrite( 5, HIGH ); } else digitalWrite( 5, LOW ); if( analogRead( A0 ) == 1023 ) { digitalWrite( 6, HIGH ); } else digitalWrite( 6, LOW ); delay( 100 ); } Serial.println( "koniec pentli wyjscie z funkcji i byc moze restat procka" ); }
|
|
mateczek |
» 2016-06-21 15:49:25 jak rozwiązanie ze zboczem Ci nie odpowiada to zrób sobie licznik wciśnięć zerowany przy wartości 2; a potem while( 1 ) { licznik = 0; if( digitalRead( 2 ) == low ) { licznik += 1; if( licznik == 2 ) licznik = 0; } if( licznik == 0 ) { } else if( licznik == 1 ) { } }
|
|
Ireneusz1984 Temat założony przez niniejszego użytkownika |
» 2016-06-21 21:02:05 OK. Dzięki, popróbuje twoich rozwiązań. A co do "przecież w twoim programie wciśnięcie przycisku spowoduje że funkcja loop()", tak jak napisałem program działa w jednej lub drugiej pętli. Pozdrawiam.
|
|
mateczek |
» 2016-06-22 07:02:58 dopisz sobie na końcu funkcji loop Serial.println( "koniec pentli wyjscie z funkcji i byc moze restat procka" );
i zobacz czy Ci nie wysypuje procka?? To że po resecie procek wystartuje od nowa i wpadnie w losową pętle. to nie znaczy że nic złego się nie dzieje!!! //edit nie używałem ardruino i nie wiedziałem, że to środowisko automatycznie funkcję loop wywołuje w pętli . loop może być zwykłą funkcją i nie trzeba robić |
|
« 1 » |