Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wielokrotne wciśnięcie przycisku

Ostatnio zmodyfikowano 2016-06-22 07:02
Autor Wiadomość
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.

C/C++
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.
P-149345
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ś ??

C/C++
int main()
{
    bool blokada;
    bool zbocze;
    bool przelacznik = false;
    while( 1 ) {
        zbocze =( digitalRead( 2 ) == LOW ) &&!blokada;
        blokada =( digitalRead( 2 ) == LOW );
        if( zbocze ) przelacznik = !przelacznik; // zmiana stanu za karzdym wciśnięciem przełącznika
       
        if( przelacznik ) {
            // kod 1
            //karzde wciśnięcie przełącznika będzie cię przeżucało między kodami
        } else {
            //kod 2
        }
    }
   
   
}
P-149346
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.


P-149347
mateczek
» 2016-06-21 15:29:01
przecież w twoim programie wciśnięcie przycisku spowoduje że funkcja loop()  się zakończy !!!!
C/C++
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" );
}
P-149350
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
C/C++
while( 1 ) {
    licznik = 0;
    if( digitalRead( 2 ) == low ) {
        licznik += 1;
        if( licznik == 2 ) licznik = 0;
       
    }
    if( licznik == 0 ) {
        //kod 1
    } else if( licznik == 1 ) {
        //kod 2
    }
}
/*
nie wiem jak działa funkcja digitalRead czy w takim kodzie zinkrementuje Ci wartość licznika o 1?? czy może wykona to kilka razy
kod ze zboczem powinien być odporny i działa tak samo
wciśniesz raz kod 1
wciśniesz dwa kod 2
wciśniesz ponownie znów kod1
*/
P-149352
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.
P-149362
mateczek
» 2016-06-22 07:02:58
dopisz sobie na końcu funkcji loop
C/C++
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ć
C/C++
while( 1 ) {
   
}
P-149370
« 1 »
  Strona 1 z 1