Problem z obsługą przełaczników dźwigienkowych Arduino Mega

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
norbi120
Młodszy majsterkowicz
Posty: 6
Rejestracja: 27 sty 2019, 22:28

Problem z obsługą przełaczników dźwigienkowych Arduino Mega

Post autor: norbi120 » 27 sty 2019, 23:03

Witam,
Jestem początkującym "budowniczym" układów opartych na arduino. Potrzebuję od Was pomocy w oprogramowaniu przełączników dźwigienkowych. Zadanie jest takie: każdy z przełaczników (typ on-off) ma wysłać jednorazowo przy zmianie stanu przez serial port jakiś komunikat tekstowy (przy stanie HIGH jeden komunikat przy stanie LOW inny komunikat). Przełączniki przyjmują na stałe stan HIGH lub LOW. Poradziłem sobie z jednym przełącznikiem za pomocą funkcji if i pętli while natomiast problem pojawił się przy połaczeniu 2 przełacznika, nie chcą działać oddzielnie tzn. albo działa tylko jeden albo działanie jednego zależy od aktualnego stanu drugiego przełącznika. Na tę chwilę próbuję to zrobić za pomocą funcji switch ale efekt jest podobny. Czy ktoś mógłby mnie naprowadzić w jakim kierunku iść? Poniżej ostatn kod z wykorzystaniem funkcji switch
Szkic jest bardzo roboczy, chodzi o sama zasadę. Po wgraniu szkicu działa tylko button2, po zmianie stanu pojawia się żądany komunikat, natomiast button1 nie reaguje w ogóle
Z góry dziekuję za pomoc i wyrozumiałość

Kod: Zaznacz cały

const int button1=4;//przypisanie przełączników do portów
const int button2=2;
int x; //deklaracja zmiennej użytej później w funckji stan_wl
void setup() {

  pinMode(button1,INPUT);//ustawienie portów
  pinMode(button2,INPUT);
  
  Serial.begin(115200);
  
}

  int stan_wl() {   //funkcja sprawdzająca stan przełączników i przypisująca określone wartości zmiennej x
   if (digitalRead(button1)==HIGH) x=1;
  if (digitalRead(button1)==LOW) x=2;
  if (digitalRead(button2)==HIGH) x=3;
  if (digitalRead(button2)==LOW) x=4;
  return(x);
  }

void loop() {
 // odwołanie się do funkcji stan_wl
  //wykonanie określonych czynności w zależności od położenia prełacznika
  
 switch(stan_wl()){
    
    case 1:
    delay(20);
    Serial.println ("wysoki1");
    while(digitalRead(button1)==HIGH);
    delay(20);
    break;
    
   
    case 2:
    delay(20);
    Serial.println ("niski1");
    while(digitalRead(button1)==LOW);
    delay(20);
    break;
   
   
    
    case 3:
    delay(20);
    Serial.println ("wysoki2");
    while(digitalRead(button2)==HIGH);
    delay(20);
    break;
   
   
    case 4:
    delay(20);
    Serial.println ("niski2");
    while(digitalRead(button2)==LOW);
    delay(20);
    break;
    
  }
  
  }

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


Awatar użytkownika
Marhef
Złota rączka
Posty: 1093
Rejestracja: 18 lis 2011, 02:18

Re: Problem z obsługą przełaczników dźwigienkowych Arduino Mega

Post autor: Marhef » 28 sty 2019, 09:42

W ten sposób tego nie zrobisz. Popatrz na funkcję stan_wl(). Funkcja sprawdza po kolei warunki. Przykładowo, włączniki masz ustawione
button1 = HIGH
button2 = LOW
Funkcja zwróci wartość 4. Bo sprawdzi wszystkie warunki i zwróci ostatnią wartość, która pasuje.
A później w instrukcji switch blokujesz działanie programu!

Spróbuj podejść do tego inaczej (instrukcja pisana, przerób na kod:
1) w programie powołaj dwie zmienne, które będą przechowywały stan włącznika
2) w funkcji setup() przypisz im aktualną wartość odczytaną
3) w funkcji loop() sprawdzaj, czy stan przycisku się zmienił. Jeżeli tak, wyślij, co chcesz wysłać.
4) przypisz do zmiennych od przycisków aktualny stan

To powinno zadziałać. I nie blokuj programu instrukcją while(digitalRead(button1)==HIGH);
norbi120
Młodszy majsterkowicz
Posty: 6
Rejestracja: 27 sty 2019, 22:28

Re: Problem z obsługą przełaczników dźwigienkowych Arduino Mega

Post autor: norbi120 » 28 sty 2019, 12:58

Ok, dzięki za podpowiedź, spróbuję tak to zdziałać, chyba coś podobnego wcześniej próbowałem zrobić, natomiast problem jest z wysłaniem tylko jeden raz ciągu znaków pomimo, że przełacznik pozostaje w danej pozycji/stanie i nie umiałem tego zrobić inaczej jak tylko pętlą while, będę działał jak coś sklecę, pozwolę sobie wrzucić na forum do oceny
Jeszcze raz dzięki za wskazówki, faktycznie nie pomyślałem, że przecież mam tylko jedną zmienną i zwróci ona tylko jedną wartość a tutaj będzie potrzebne zwrócenie osobnej wartości dla przełącznika nr 1 i osobnej wartości dla przełacznika nr 2 tak aby działały niezależnie
Awatar użytkownika
Marhef
Złota rączka
Posty: 1093
Rejestracja: 18 lis 2011, 02:18

Re: Problem z obsługą przełaczników dźwigienkowych Arduino Mega

Post autor: Marhef » 28 sty 2019, 16:58

Ale jak sprawdzasz zmianę stanu, to wyśle Ci tylko raz.
norbi120
Młodszy majsterkowicz
Posty: 6
Rejestracja: 27 sty 2019, 22:28

Re: Problem z obsługą przełaczników dźwigienkowych Arduino Mega

Post autor: norbi120 » 28 sty 2019, 21:03

ok, będę działał, jeszcze raz dzięki, muszę mocno się przyłożyć do nauki programowania, nie zawsze jeszcze rozumiem jak to wszystko działa
Awatar użytkownika
Marhef
Złota rączka
Posty: 1093
Rejestracja: 18 lis 2011, 02:18

Re: Problem z obsługą przełaczników dźwigienkowych Arduino Mega

Post autor: Marhef » 29 sty 2019, 09:18

Jeśli coś będzie niejasne, pytaj. Na pewno ktoś pomoże.
norbi120
Młodszy majsterkowicz
Posty: 6
Rejestracja: 27 sty 2019, 22:28

Re: Problem z obsługą przełaczników dźwigienkowych Arduino Mega

Post autor: norbi120 » 30 sty 2019, 23:09

Po poradach od Marhef, trochę jeszcze doczytałem w różnych poradnikach i małych modyfikacjach udało mi się sklecić to:

Kod: Zaznacz cały

const int  wlacznik1 = 2;// ustawienie pinu dla włacznika nr 1
const int  wlacznik2 = 4;// ustawienie pinu dla włacznika nr 2 
int stanwl1 = 0;// zmienna stanu włącznika 1         
int laststanwl1 = 0; //ostatniego stanu włącznika 1
int stanwl2 = 0;//to samo co wyżej tlko dla włacznika 2
int laststanwl2 = 0;//to samo co wyżej tlko dla włacznika 2       

void setup() {
  // inicjalizacjia pinów
  pinMode(wlacznik1, INPUT);
  pinMode(wlacznik2, INPUT);
   // inicjalizacja portu komunikacyjnego
  Serial.begin(115200);
}
void loop() {
  // odczyt stanu włącznika 1
  stanwl1 = digitalRead(wlacznik1);

  // porównanie stanów włacznika 1
  if (stanwl1 != laststanwl1) {
    // jeśli stan się zmienił jedziemy dalej
    if (stanwl1 == HIGH) {
      // tego chyba nie trzeba tłumaczyć
       Serial.println("wysoki1");
       } else {
      Serial.println("niski1");
    }
    // opóźnienie na drganie styków
    delay(50);
  
  // zapis stanu przełacznika do zmiennej
  laststanwl1 = stanwl1;
  }
 // wszystko to samo dla włacznika 2
  stanwl2 = digitalRead(wlacznik2);
  if (stanwl2 != laststanwl2) {
    if (stanwl2 == HIGH) {
     Serial.println("wysoki2");
     } else {
      Serial.println("niski2");
    }
    delay(50);
  }
  laststanwl2 = stanwl2;
  }
I najważniejsze, że działa tak jak chciałem. Włączniki działają niezależnie od siebie. Wyeliminowanie pętli while wydawało sie niemożliwe a jednak...chyba zaczynam kumać powoli jak to działa. Teraz mam następne pytanie, jak to zoptymalizować? tych przełączników na początek będzie 11, do tego potencjometry, enkodery w sumie ok. 20 elementów. Jesli ma ktoś jakiś pomysł chętnie posłucham
Awatar użytkownika
Marhef
Złota rączka
Posty: 1093
Rejestracja: 18 lis 2011, 02:18

Re: Problem z obsługą przełaczników dźwigienkowych Arduino Mega

Post autor: Marhef » 31 sty 2019, 16:18

Ja mam pewien pomysł. Tworzysz tablicę struktur. W strukturze masz cztery pola:
1) numer pinu
2) poprzedni stan
3) tekst do wysłania jeśli stan wysoki
4) tekst do wysłania jeśli stan niski.
I w pętli sprawdzasz po kolei stan włączników.

I tak, wiem, że to trochę wyższy poziom. Ale może Ci się uda ;)
norbi120
Młodszy majsterkowicz
Posty: 6
Rejestracja: 27 sty 2019, 22:28

Re: Problem z obsługą przełaczników dźwigienkowych Arduino Mega

Post autor: norbi120 » 31 sty 2019, 19:37

Ok, będę czytał i próbował, dzieki za wskazówki,mam jeszcze jedno pytanie, jak wstawić tak ładnie kod jak powyżej?
Awatar użytkownika
Marhef
Złota rączka
Posty: 1093
Rejestracja: 18 lis 2011, 02:18

Re: Problem z obsługą przełaczników dźwigienkowych Arduino Mega

Post autor: Marhef » 31 sty 2019, 19:42

Dajesz w znaczniki [ code ] [ /code ] (usuń spacje).
Jak piszesz odpowiedź, masz to jako przyciski do wyboru.
norbi120
Młodszy majsterkowicz
Posty: 6
Rejestracja: 27 sty 2019, 22:28

Re: Problem z obsługą przełaczników dźwigienkowych Arduino Mega

Post autor: norbi120 » 31 sty 2019, 19:46

Acha teraz zauważyłem, dzięki
ODPOWIEDZ

Strony partnerskie: