Przerzutnik bistabilny

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
Radek_K
Młodszy majsterkowicz
Posty: 11
Rejestracja: 2 sty 2018, 15:07

Przerzutnik bistabilny

Post autor: Radek_K » 2 sty 2018, 15:23

witam,
na początek zaznaczę, że dopiero zaczynam przygodę z Arduino po długim czasie przerwy z programowaniem :)

mam problem z przerzutnikiem bistabilnym. Znalazłem kod opisujący taki przerzutnik i uruchomiłem go. Działał. Ponieważ do projektu potrzebuje trzech sztuk (sterowanie światłem przy łóżku) więc skopiowałem i stworzyłem drugą sekcję. również zadziałało. Przy trzeciej sekcji zaczęły się problemy. Trzecia sekcja zaczyna lekko mówiąc świrować... wyjście generuje prostokąt ( dioda mruga z tą samą częstotliwością) a sekcja pierwsza i druga nie reaguje na przełączniki. po wyłączeniu trzeciej (/*...*/) sekcji i przeładowaniu wszystko wraca do normy...

Kod: Zaznacz cały

[int in0 = 0;         // the number of the input pin
int in1 = 1;         // the number of the input pin
int in2 = 2;         // the number of the input pin
int Out10 = 10;       // the number of the output pin
int Out11 = 11;       // the number of the output pin
int Out12 = 12;       // the number of the output pin

int state = LOW;      // the current state of the output pin
int reading;           // the current reading from the input pin
int previous = HIGH;    // the previous reading from the input pin

int state1 = LOW;      // the current state of the output pin
int reading1;           // the current reading from the input pin
int previous1 = HIGH;    // the previous reading from the input pin

int state2 = LOW;      // the current state of the output pin
int reading2;           // the current reading from the input pin
int previous2 = HIGH;    // the previous reading from the input pin

// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0;         // the last time the output pin was toggled
long debounce = 200;   // the debounce time, increase if the output flickers


void setup()
{
  pinMode(in0, INPUT);
  pinMode(Out10, OUTPUT);
  pinMode(in1, INPUT);
  pinMode(Out11, OUTPUT);
  pinMode(in2, INPUT);
  pinMode(Out12, OUTPUT);
}

void loop()
{
  //first switch section
  reading = digitalRead(in0);
  if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;
    time = millis();
  }
  digitalWrite(Out10, state);
  previous = reading;

  //second switch section
  reading1 = digitalRead(in1);

  if (reading1 == HIGH && previous1 == LOW && millis() - time > debounce) {
    if (state1 == HIGH)
      state1 = LOW;
    else
      state1 = HIGH;
    // time = millis();
  }
  digitalWrite(Out11, state1);
  previous1 = reading1;

 /* //third switch section
  reading2 = digitalRead(in2);

  if (reading2 == HIGH && previous2 == LOW && millis() - time > debounce) {
    if (state2 == HIGH)
      state2 = LOW;
    else
      state2 = HIGH;
    time = millis();
  }
  digitalWrite(Out12, state2);
  previous2 = reading2;*/
}]
wielka prośba o jakieś wskazówki
Kod w załączeniu, a jeżeli potrzebny schemat to przerysuję.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony 2 sty 2018, 15:48 przez Radek_K, łącznie zmieniany 1 raz.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Przerzutnik bistabilny

Post autor: ethanak » 2 sty 2018, 15:30

No i co ja z tym zipem na komórce zrobię? Wrzuć kod na forum to pogadamy.
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Przerzutnik bistabilny

Post autor: Marhef » 2 sty 2018, 15:33

Moim zdaniem powinieneś zmienną time powielić dla pozostałych dwóch sekcji.
Zauważ, że dwa razy używasz time = millis(); (dla pierwszej i trzeciej sekcji). Sprawdź czy zadziała
Radek_K
Młodszy majsterkowicz
Posty: 11
Rejestracja: 2 sty 2018, 15:07

Re: Przerzutnik bistabilny

Post autor: Radek_K » 2 sty 2018, 15:50

Marhef pisze:
2 sty 2018, 15:33
Moim zdaniem powinieneś zmienną time powielić dla pozostałych dwóch sekcji.
Zauważ, że dwa razy używasz time = millis(); (dla pierwszej i trzeciej sekcji). Sprawdź czy zadziała
to przepisanie jest również w drugiej sekcji i przy dwóch działa OK. Generalnie dotyczy to ustawienia czasów i (chyba) nie powinno mieć wpływu.
Radek_K
Młodszy majsterkowicz
Posty: 11
Rejestracja: 2 sty 2018, 15:07

Re: Przerzutnik bistabilny

Post autor: Radek_K » 2 sty 2018, 15:51

ethanak pisze:
2 sty 2018, 15:30
No i co ja z tym zipem na komórce zrobię? Wrzuć kod na forum to pogadamy.
nauczyłem się i poprawiłęm :)
Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Przerzutnik bistabilny

Post autor: ethanak » 2 sty 2018, 16:08

Chyba to się wesz na grzebieniu.
Masz trzy oddzielne sekcje, i debouncing musisz zrobić dla każdej oddzielnie.
Ewentualnie zrób ogólny debouncing (dla wszystkich wejść) - nie jest to najlepsze rozwiązanie, ale o ile nie robisz symulatora fortepianu powinno wystarczyć.
Oddziel czytanie klawiszy od wykonania funkcji.
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Przerzutnik bistabilny

Post autor: Marhef » 2 sty 2018, 17:11

Radek_K pisze:
2 sty 2018, 15:50
Marhef pisze:
2 sty 2018, 15:33
Moim zdaniem powinieneś zmienną time powielić dla pozostałych dwóch sekcji.
Zauważ, że dwa razy używasz time = millis(); (dla pierwszej i trzeciej sekcji). Sprawdź czy zadziała
to przepisanie jest również w drugiej sekcji i przy dwóch działa OK. Generalnie dotyczy to ustawienia czasów i (chyba) nie powinno mieć wpływu.
Jesteś pewien? Bo widzę, że w drugiej sekcji masz zakomentowaną linijkę time = millis();
I piszesz, że po dodaniu drugiej sekcji działało...
Radek_K
Młodszy majsterkowicz
Posty: 11
Rejestracja: 2 sty 2018, 15:07

Re: Przerzutnik bistabilny

Post autor: Radek_K » 2 sty 2018, 17:26

Marhef pisze:
2 sty 2018, 17:11
Radek_K pisze:
2 sty 2018, 15:50
Marhef pisze:
2 sty 2018, 15:33
Moim zdaniem powinieneś zmienną time powielić dla pozostałych dwóch sekcji.
Zauważ, że dwa razy używasz time = millis(); (dla pierwszej i trzeciej sekcji). Sprawdź czy zadziała
to przepisanie jest również w drugiej sekcji i przy dwóch działa OK. Generalnie dotyczy to ustawienia czasów i (chyba) nie powinno mieć wpływu.
Jesteś pewien? Bo widzę, że w drugiej sekcji masz zakomentowaną linijkę time = millis();
I piszesz, że po dodaniu drugiej sekcji działało...
no fakt. co ślepemu po oczach.... :). Po wstawieniu dodatkowych zmiennych (time1, time2) do drugiej i trzeciej sekcji uzyskałem poprawnie działającą sekcję#1 i #2 a na #3 - impulsator :( - impulsator działa z częstotliwością "debounce" (przetestowane empirycznie)
Ostatnio zmieniony 2 sty 2018, 18:03 przez Radek_K, łącznie zmieniany 1 raz.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Przerzutnik bistabilny

Post autor: Marhef » 2 sty 2018, 17:38

A zmieniłeś wszystkie time na time1, time2? wstaw program
Radek_K
Młodszy majsterkowicz
Posty: 11
Rejestracja: 2 sty 2018, 15:07

Re: Przerzutnik bistabilny

Post autor: Radek_K » 2 sty 2018, 18:03

Marhef pisze:
2 sty 2018, 17:38
A zmieniłeś wszystkie time na time1, time2? wstaw program

Kod: Zaznacz cały

int in0 = 0;         // the number of the input pin
int in1 = 1;         // the number of the input pin
int in2 = 2;         // the number of the input pin
int Out10 = 10;       // the number of the output pin
int Out11 = 11;       // the number of the output pin
int Out12 = 12 ;      // the number of the output pin

int state = LOW;      // the current state of the output pin
int reading;           // the current reading from the input pin
int previous = HIGH;    // the previous reading from the input pin

int state1 = LOW;      // the current state of the output pin
int reading1;           // the current reading from the input pin
int previous1 = HIGH;    // the previous reading from the input pin

int state2 = LOW;      // the current state of the output pin
int reading2;           // the current reading from the input pin
int previous2 = HIGH;    // the previous reading from the input pin

// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time0 = 0;         // the last time the output pin was toggled
long time1 = 0;         // the last time the output pin was toggled
long time2 = 0;         // the last time the output pin was toggled
long debounce = 500;   // the debounce time, increase if the output flickers


void setup()
{
  pinMode(in0, INPUT);
  pinMode(Out10, OUTPUT);
  pinMode(in1, INPUT);
  pinMode(Out11, OUTPUT);
  pinMode(in2, INPUT);
  pinMode(Out12, OUTPUT);
}

void loop()
{
  //first switch section
  reading = digitalRead(in0);
  if (reading == HIGH && previous == LOW && millis() - time0 > debounce) {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;
    time0 = millis();
  }
  digitalWrite(Out10, state);
  previous = reading;

  //second switch section
  reading1 = digitalRead(in1);

  if (reading1 == HIGH && previous1 == LOW && millis() - time1 > debounce) {
    if (state1 == HIGH)
      state1 = LOW;
    else
      state1 = HIGH;
    time1 = millis();
  }
  digitalWrite(Out11, state1);
  previous1 = reading1;

  //third switch section
  reading2 = digitalRead(in2);

  if (reading2 == HIGH && previous2 == LOW && millis() - time2 > debounce) {
    if (state2 == HIGH)
      state2 = LOW;
    else
      state2 = HIGH;
    time2 = millis();
  }
  digitalWrite(Out12, state2);
  previous2 = reading2;
}
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Przerzutnik bistabilny

Post autor: Marhef » 3 sty 2018, 18:51

Radek_K pisze:
2 sty 2018, 17:26
impulsator :( - impulsator działa z częstotliwością "debounce" (przetestowane empirycznie)
Znaczy, trzeci "przekaźnik" przełącza się co czas "debounce"?
Radek_K
Młodszy majsterkowicz
Posty: 11
Rejestracja: 2 sty 2018, 15:07

Re: Przerzutnik bistabilny

Post autor: Radek_K » 3 sty 2018, 19:52

Marhef pisze:
3 sty 2018, 18:51
Radek_K pisze:
2 sty 2018, 17:26
impulsator :( - impulsator działa z częstotliwością "debounce" (przetestowane empirycznie)
Znaczy, trzeci "przekaźnik" przełącza się co czas "debounce"?
tak :(
Radek_K
Młodszy majsterkowicz
Posty: 11
Rejestracja: 2 sty 2018, 15:07

Re: Przerzutnik bistabilny

Post autor: Radek_K » 3 sty 2018, 19:54

pozamieniałem wyjścia i wejścia na inne aby wykluczyć hardware i zawsze trzeci segment kodu powodował mruganie...
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Przerzutnik bistabilny

Post autor: Marhef » 3 sty 2018, 19:59

Spróbuję wieczorem złożyć taki układ u siebie i sprawdzę, czy mi tak samo będzie działało
Na czym to testujesz?
Radek_K
Młodszy majsterkowicz
Posty: 11
Rejestracja: 2 sty 2018, 15:07

Re: Przerzutnik bistabilny

Post autor: Radek_K » 3 sty 2018, 21:56

Marhef pisze:
3 sty 2018, 19:59
Spróbuję wieczorem złożyć taki układ u siebie i sprawdzę, czy mi tak samo będzie działało
Na czym to testujesz?
UNO, wejścia sterowane stanem LOW, wyjścia wysokie.
powodzenia :)

docelowo, jak kod bdzie poprawny, planuję przełączenie na NANO +4 przekaźniki z optoizolacją.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Przerzutnik bistabilny

Post autor: Marhef » 3 sty 2018, 23:53

A wrzuć jeszcze schemat podłączenia. Może być też zdjęcie.
Radek_K
Młodszy majsterkowicz
Posty: 11
Rejestracja: 2 sty 2018, 15:07

Re: Przerzutnik bistabilny

Post autor: Radek_K » 3 sty 2018, 23:58

Problem rozwiązany :)
błąd był w HD. Switch połączony był tylko do GND nie mając odniesienia poziomów. Dodanie rezystora podłączonego do 5V rozwiązało problem.

ciekawostką jest, że dla wejść 0 i 1. układ działał poprawnie. Wszystkie inne wyjścia zachowywały się tak samo. Poprzednio pisałem, że zmieniałem adresy wyjść. To prawda ale tylko w obrębie 0/1/2. po przełączeniu na inne (powyżej 2) wszystkie wyjścia działały tak samo, tzn błyskały. Dodatkowe rezystory rozwiązały sprawę.
Dodatkowo przetestowałem parametr "time" poprzednio każda sekcja miała swój. Po zmianie na wspólny, działa OK.

ponieważ projekt działa to pora na zakup NANO i przekaźników. A kolejnym krokiem będzie zabawa z napisaniem funkcji wykonującą przełączenie i uproszczenie kodu.

Dzięki wszystkim za pomoc i wskazówki.
Sugestia o podłączeniu a raczej sprawdzeniu switcha przyszła z forum ARDUINO.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Przerzutnik bistabilny

Post autor: Marhef » 4 sty 2018, 00:10

W sumie chciałem zapytać o podciągnięcie przycisków, ale liczyłem, że pokażesz schemat.
Co do tego, że wejścia 0 i 1 działały poprawnie... widziałeś schemat? Na tych wejściach masz sygnały Rx i Tx (są połączone z konwerterem USB<=>UART), więc stan na nich był wymuszony.
Osobiście, zmieniłbym typ wejścia na INPUT_PULLUP i sprawdzał, czy wejście jest w stanie niskim. Nie musisz dodawać wtedy żadnych dodatkowych elementów.
Radek_K
Młodszy majsterkowicz
Posty: 11
Rejestracja: 2 sty 2018, 15:07

Re: Przerzutnik bistabilny

Post autor: Radek_K » 5 sty 2018, 20:07

Dzięki za poradę - wygląda, że muszę poczytać o rodzajach wejść i co to oznacza. Jeżeli będzie działało tak jak piszesz, to jako, że jestem minimalista (tym razem w HD) to więcej kodu a mniej elementów bardziej do mnie przemawia. Dzięki
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Przerzutnik bistabilny

Post autor: Marhef » 6 sty 2018, 13:02

Ale nie masz więcej kodu. Zmieniasz 3 linijki w setup() (z INPUT na INPUT_PULLUP) i trzy linijki w loop() (z reading == HIGH na reading == LOW). I to wszystko.
Jak zaczynałem przygodę z programowaniem, też zrobiłem podobny błąd. Dlatego teraz podpowiadam innym. Szkoda tracić czas na szukanie rozwiązania problemu, który dawno został rozwiązany.

Jeszcze jedno, zmieniłbym piny przycisków na inne niż 0 i 1. Są to piny od UARTa, może będziesz chciał go wykorzystać w przyszłości.
Radek_K
Młodszy majsterkowicz
Posty: 11
Rejestracja: 2 sty 2018, 15:07

Re: Przerzutnik bistabilny

Post autor: Radek_K » 7 sty 2018, 12:56

Prosta zmiana (INPUT na PULLUP) i zadziałało. Układ uproszczony. Teraz czas na kod - zamiana powtarzającego się fragmentu na funkcję.
ODPOWIEDZ

Strony partnerskie: