• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino Mega - samoczynna zmiana stanu przełącznika
#1
Witam wszystkich 
Po napisaniu działającego programu dla 30 przycisków i 28 LEDów i jego sprawdzeniu, natrafiłem na problem z samoczynnym "włączaniem" się przycisku. Dokładnie chodzi o to że np. jak wcisnę przycisk P22a na pinie D22 który wywołuje mi zapalenie LED22a to podczas przyciśnięcia P22a "przyciska" mi się również przycisk P0a na pinie D0. Pomimo tego że w ogóle nie został nawet dotknięty.
Nawet jak odpiąłem wszystko inne od Arduino i wpiąłem się bezpośrednio do płytki do dalej występuje ten efekt. 
Brakuje mi pomysłu czemu tak się dzieje że Arduino samo zmienia stany na wejściach mimo tego że ma poprawnie skonfigurowane piny

Oto działający kod. Czy może ktoś wgrać go swojego Arduino Mega i zobaczyć czy jest taki sam problem?
Kod:
#include <Bounce2.h>

unsigned long aktualnyCzas = 0;
unsigned long czasDrgania = 0;


const int button1a = 0;
const int button1b = 1;
const int ledPin1a = 30;
const int ledPin1b = 31;

bool LED1a = LOW;
bool LED1b = LOW;

unsigned long czasLED1a = 0;
unsigned long czasLED1b = 0;

Bounce p1a = Bounce();
Bounce p1b = Bounce();


const int button6a = 18;
const int button6b = 19;



const int button6c = 20;
const int button6d = 21;



const int button6e = 22;
const int button6f = 23;



const int ledPin6a = 48;
const int ledPin6b = 49;



const int ledPin6c = 50;
const int ledPin6d = 51;

bool LED6a = LOW;
bool LED6b = LOW;
bool LED6c = LOW;
bool LED6d = LOW;
bool LED6e = LOW;
bool LED6f = LOW;
unsigned long czasLED6a = 0;
unsigned long czasLED6b = 0;
unsigned long czasLED6c = 0;
unsigned long czasLED6d = 0;
unsigned long czasLED6e = 0;
unsigned long czasLED6f = 0;

Bounce p6a = Bounce();
Bounce p6b = Bounce();
Bounce p6c = Bounce();
Bounce p6d = Bounce();
Bounce p6e = Bounce();
Bounce p6f = Bounce();



void setup() {
  Serial.begin(9600);
  pinMode(30, OUTPUT);
  digitalWrite(30, LOW);
  pinMode(31, OUTPUT);
  digitalWrite(31, LOW);
  p1a.attach(button1a, INPUT_PULLUP);
  p1a.interval(20);
  p1b.attach(button1b, INPUT_PULLUP);
  p1b.interval(20);

  pinMode(48, OUTPUT);
  digitalWrite(48, LOW);
  pinMode(49, OUTPUT);
  digitalWrite(49, LOW);
  pinMode(50, OUTPUT);
  digitalWrite(50, LOW);
  pinMode(51, OUTPUT);
  digitalWrite(51, LOW); 
  p6a.attach(button6a, INPUT_PULLUP);
  p6a.interval(20);
  p6b.attach(button6b, INPUT_PULLUP);
  p6b.interval(20);
  p6c.attach(button6c, INPUT_PULLUP);
  p6c.interval(20);
  p6d.attach(button6d, INPUT_PULLUP);
  p6d.interval(20);
  p6e.attach(button6e, INPUT_PULLUP);
  p6e.interval(20);
  p6f.attach(button6f, INPUT_PULLUP);
  p6f.interval(20);
  
 
}

void loop() {
  aktualnyCzas = millis();
  p1a.update();
  p1b.update();
  bool stanP1a = p1a.read();
  bool stanP1b = p1b.read();

  p6a.update();
  p6b.update();
  p6c.update();
  p6d.update();
  p6e.update();
  p6f.update();
  bool stanP6a = p6a.read();
  bool stanP6b = p6b.read();
  bool stanP6c = p6c.read();
  bool stanP6d = p6d.read();
  bool stanP6e = p6e.read();
  bool stanP6f = p6f.read();

// 1a
    if (p1a.fell() && LED1b == LOW) {
      Serial.println("Przycisk 1a");
      LED1a = !LED1a;
      digitalWrite(30, LED1a);
      czasLED1a = aktualnyCzas;
  }
    if (LED1a){
         Serial.println("LED1a");
         if (aktualnyCzas - czasLED1a >= 1000UL){
          czasLED1a = aktualnyCzas;  
          digitalWrite(30, LOW);
          LED1a = LOW;
      }
    }
// 1b
    if (p1b.fell() && LED1a == LOW) {
      Serial.println("Przycisk 1b");
      LED1b = !LED1b;
      digitalWrite(31, LED1b);
      czasLED1b = aktualnyCzas;
  }
    if (LED1b){
         Serial.println("LED1b");
         if (aktualnyCzas - czasLED1b >= 1000UL){
          czasLED1b = aktualnyCzas;  
          digitalWrite(31, LOW);
          LED1b = LOW;

}
    }



// 6c
    if (p6c.fell() && LED6d == LOW) {
      Serial.println("Przycisk 6c");
      LED6c =!LED6c;
      digitalWrite(48, LED6c);
      czasLED6c = aktualnyCzas;
  }
    if (LED6c){
         Serial.println("LED6c");
         if (aktualnyCzas - czasLED6c >= 1000UL){
          czasLED6c = aktualnyCzas;  
          digitalWrite(48, LOW);
          LED6c = LOW;
      }
    }
// 6d
    if (p6d.fell() && LED6c == LOW) {
      Serial.println("Przycisk 6d");
      LED6d =!LED6d;
      digitalWrite(49, LED6d);
      czasLED6d = aktualnyCzas;
  }
    if (LED6d){
      Serial.println("LED6d");
         if (aktualnyCzas - czasLED6d >= 1000UL){
          czasLED6d = aktualnyCzas;  
          digitalWrite(49, LOW);
          LED6d = LOW;
      }
    }

// 6e
    if (p6e.fell() && LED6f == LOW) {
      Serial.println("PRZYCISK 6e");
      LED6e =!LED6e;
      digitalWrite(50, LED6e);
      czasLED6e = aktualnyCzas;
  }
    if (LED6e){
         Serial.println("LED6e");
         if (aktualnyCzas - czasLED6e >= 1000UL){
          czasLED6e = aktualnyCzas;  
          digitalWrite(50, LOW);
          LED6e = LOW;
      }
    }

// 6f
    if (p6f.fell() && LED6e == LOW) {
      Serial.println("PRZYCISK 6f");
      LED6f =!LED6f;
      digitalWrite(51, LED6f);
      czasLED6f = aktualnyCzas;
  }
    if (LED6f){
      Serial.println("LED6f");
         if (aktualnyCzas - czasLED6f >= 1000UL){
          czasLED6f = aktualnyCzas;  
          digitalWrite(51, LOW);
          LED6f = LOW;
      }
    }


}
 
Odpowiedź
#2
Piny 0 i 1 są od UART, jak robisz Serial.begin... to włączasz im inną funkcję. A nawet jeśli nie to i tak są podłączone do innego urządzenia i ono może wymuszać jakiś stan tych pinów.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości