Skocz do zawartości

Analogowy joystick i 4x przycisk - zakłócenia w działaniu?


PowerTGS440

Pomocna odpowiedź

Zabawka dla dziecka. Przekaźnik 4ch do którego będzie coś tam podpięte, 8 diód (zielona sygnalizuje ON, czerwona OFF), cztery przyciski wciskam włącza dany przelaznik (x) zapala zielona diodę (x) wciskam znów wyłącza przekaznik (x) i zapala diode czerwona(x). OK, wszystko działało ale ... dodałem joystick. Jakim cudem odczyt na analogowych pinach 14 i 15 (oś x i y) powoduje spełnienie warunku (przycisk_0,1,2,3 = TRUE) ??? i powoduje wykonanie funkcji RelaySwitch(x) ??? magia czy co

//  eHome MiniSystem v0.1.2  beta (09.10.2020)
//  by Marcin M. Logic
//  e-mail: powerTGS440@gmail.com
//
// zmiany: 0.1.2b dodano obsługę joysticka
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// dołączone biblioteki do programu

#include "Arduino.h"
#include "Button.h"
#include "PCF8574.h"
#include "Relay.h"
#include "Joystick.h"
#include <Wire.h>
#include <LED.h>

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// definicje pinów
#define RED1         0      // DIODA LED 0 : przekaznik 0 off (expander 0x20)
#define RED2         1      // DIODA LED 1 : przekaznik 1 off (expander 0x20)
#define RED3         2      // DIODA LED 2 : przekaznik 2 off (expander 0x20)
#define RED4         3      // DIODA LED 3 : przekaznik 3 off (expander 0x20)
#define GREEN1       4      // DIODA LED 4 : przekaznik 0 on  (expander 0x20)
#define GREEN2       5      // DIODA LED 5 : przekaznik 1 on  (expander 0x20)
#define GREEN3       6      // DIODA LED 6 : przekaznik 2 on  (expander 0x20)
#define GREEN4       7      // DIODA LED 7 : przekaznik 3 on  (expander 0x20)
#define BUTTON_1     8      // przycisk 1 na pin 8
#define BUTTON_2     9      // przycisk 2 na pin 9
#define BUTTON_3    10      // przycisk 3 na pin 10
#define BUTTON_4    11      // przycisk 0 na pin 11
#define RELAY4CH_1   4      // przekaznik 4ch kanał 1 na pin 4
#define RELAY4CH_2   5      // przekaznik 4ch kanał 2 na pin 5
#define RELAY4CH_3   6      // przekaznik 4ch kanał 3 na pin 6
#define RELAY4CH_4   7      // przekaznik 4ch kanał 4 na pin 7
#define JOY_SW       2      // przycisk joystick'a na pin 2
#define JOY_RX      14      // oś X joystick'a na analog pin A0
#define JOY_RY      15      // os Y joystick'a na analog pin A1

// pozostało wolnych DIGITAL : 12,13,18,19 pod pomarańczową diodę pozycji josticka

// inicjalizacja obiektów i zmiennych
PCF8574 MyExpander(0x20);   // tworzenie obiektu EXPANDERA PCF8574
Button mikroPrzycisk[4] = {BUTTON_1,BUTTON_2,BUTTON_3, BUTTON_4};                                               // inicjalizacja 4 mikroprzycisków dla przekaźników
Relay  przekaznik[4] = { {RELAY4CH_1, true}, {RELAY4CH_2, true}, {RELAY4CH_3, true}, {RELAY4CH_4, true} };      // inicjalizacja 4 przekazników
Joystick joystick(JOY_RX,JOY_RY,JOY_SW);                                                                        // inicjalizacja joystick'a
const int timeout = 10000;                                                                                      //definicja timeout na 10 sekund
long time0;                                                                                                     // zmienna typu long 
unsigned short int RedLed[] = { RED1, RED2, RED3, RED4 };                                                       // diody czerwone
unsigned short int GreenLed[] = { GREEN1, GREEN2, GREEN3, GREEN4 };                                             // diody zielone

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// setup programu
void setup() 
{
    Serial.begin(9600);                       // połączenie z konsolą pc 9600
    while (!Serial) ;                         // czekaj na połączenie. Wymagane dla natywnego USB
    Serial.println("system start");           // wyślij komunikat na konsolę pc
    MyExpander.begin();                       // inicjuj obiekt MyExpander klasy Expander
    for(byte i=0;i<4;i++)                     // wykonaj petle 4 razy
    {                                         // poczatek zawartosci pętli
      mikroPrzycisk[i].init();                // inicjuj przycisk [i]
      przekaznik[i].begin();                  // inicjuj przekaznik [i]
      przekaznik[i].turnOff();                // wylacz wszystkie przekazniki (Stan HIGH)
      MyExpander.pinMode(i, OUTPUT);          // ustaw wyjscia MyExpander'a 0,1,2,3
      MyExpander.pinMode(i+4, OUTPUT);        // ustaw wyjscia MyExpander'a 4,5,6,7
      MyExpander.digitalWrite(i,HIGH);        // zapal wszystkie diody czerwone 0,1,2,3
      MyExpander.digitalWrite(i+4,LOW);       // wylacz wszystkie diody zielone 4,5,6,7
    }   
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// początek głównej petli sterującej LOOP
 
void loop() 
{
  bool przycisk_0 = mikroPrzycisk[0].onPress();
  bool przycisk_1 = mikroPrzycisk[1].onPress();
  bool przycisk_2 = mikroPrzycisk[2].onPress();
  bool przycisk_3 = mikroPrzycisk[3].onPress();
  int joystickX =  joystick.getX();
  int joystickY =  joystick.getY();
  int joystickSW = joystick.getSW();
  
  if(przycisk_0) RelaySwitch(0);  // wlacz lub wylacz przekaznik i zmien diody zielona/czerwona
  else
  if(przycisk_1) RelaySwitch(1);
  else
  if(przycisk_2) RelaySwitch(2);                                     
  else
  if(przycisk_3) RelaySwitch(3);
  else
  
  if(joystickX == 0) 
    {
      Serial.println("x = 0");
      delay(500);
    }
  else
  if(joystickX == 1023) 
    {
       Serial.println("x = 1023");
       delay(500);
    }
  else
  if(joystickY == 0) 
    {
      Serial.println("y = 0");
      delay(500);
    }
  else
  if(joystickY == 1023) 
    {
      Serial.println("y = 1023");    
      delay(500);
    }
  else
  if(joystickSW == 1) 
    {
        Serial.println("GO");
        delay(500);
    }
  
  if (millis() - time0 > timeout)
  {
                                                        // do wykorzystania ustawień czasowych
  }
 }

// koniec głównej pętli sterującej LOOP
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

void RelaySwitch(int i)
{
    if(przekaznik[i].getState())                        // jeśli przekaznik wlaczony to go wylacz
    {                                                   // początek warunku
        przekaznik[i].turnOff();                        // wyłącz przekaznik     
        MyExpander.digitalWrite(RedLed[i],HIGH);        // czerwona dioda RED(i) ON
        MyExpander.digitalWrite(GreenLed[i],LOW);       // zielona diore GREEN(i) OFF           
    }                                                   // koniec warunku
    else                                                // jeśli przekaznik wyłączony to go włącz
    {                                                   // poczatek warunku
        przekaznik[i].turnOn();                         // włącz przekaznik
        MyExpander.digitalWrite(RedLed[i],LOW);         // czerwona dioda RED(i) OFF
        MyExpander.digitalWrite(GreenLed[i],HIGH);      // zielona diore GREEN(i) ON
    }       
}

 

Edytowano przez PowerTGS440
Link do komentarza
Share on other sites

@PowerTGS440 witam na forum 🙂 Nie napisałeś nic o płytce i podłączeniu, ale pierwsze co przychodzi mi do głowy to fakt, że zakłócasz sobie komunikację po I2C. Ekspander masz podłączony przez I2C, a np. w Arduino UNO interfejs I2C działa na tych samych pinach co A0 i A1. Z jakiej płytki konkretnie korzystasz?

Po drugie, czy świadomie operujesz "else" w tych wszystkich warunkach? Bez nawiasów i odpowiedniego formatowania wygląda to trochę chaotycznie. Po co to wszystko jest zapisane ciągiem i połączone za pomocą "else"? Jak jeden warunek będzie prawdziwy to wykluczasz sobie z automatu sprawdzenie kolejnych warunków.

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.