Attivare disattivare pin da un pulsante

Ciao a tutti... Ho realizzato un sketch che comanda 4 relè attraverso una comunicazione seriale con il computer nel quale è aperto un programma apposito realizzato in visual basic. Il mio problema adesso è: implementare un pulsante esterno che cambi il valore (HIGH,LOW) del primo relè.
Posto qui lo sketch. Alcune parti sono state prese da questo forum, vi risulteranno familiari. :smiley:

int message = 0;   
int Pr1 = 5;  
int Pr2 = 4;
int Pr3 = 3;
int Pr4 = 2;

//pulsante
const int puls = 8;
const int reledelay = 50;

int buttonState = 0;
int lastBtnState = LOW;
int ledState = LOW;
//pulsante

void setup() { 

  //pulsante
  pinMode(puls,INPUT);  
  //pulsante

  pinMode(Pr1, OUTPUT);
  pinMode(Pr2, OUTPUT);
  pinMode(Pr3, OUTPUT);
  pinMode(Pr4, OUTPUT);

  Serial.begin(9600);  //set serial to 9600 baud rate
}

void loop(){

  //pulsante
  if (puls == HIGH) {
    buttonState = digitalRead(puls);
    if (buttonState != lastBtnState && buttonState == HIGH) {
      ledState = !ledState;
      if (ledState == HIGH) {
        digitalWrite(Pr1, HIGH);
      } 
      else {
        digitalWrite(Pr1, LOW);
      }
    }
    lastBtnState = buttonState;
    delay(reledelay);
  }
  //pulsante

  if (Serial.available() > 0) { 
    message = Serial.read(); 

    if (message == '3'){ 
      Serial.write(4);
    }



    if (message == '1'){ 
      digitalWrite(Pr1, LOW);
    }
    if (message == '2'){ 
      digitalWrite(Pr1, HIGH);
    }



    if (message == '5'){ 
      digitalWrite(Pr2, LOW);
    }
    if (message == '6'){ 
      digitalWrite(Pr2, HIGH);
    }




    if (message == '7'){ 
      digitalWrite(Pr3, HIGH);
    }
    if (message == '8'){ 
      digitalWrite(Pr3, LOW);
    }



    if (message == '9'){ 
      digitalWrite(Pr4, HIGH);
    }
    if (message == '4'){ 
      digitalWrite(Pr4, LOW);
    }


  }
}

Il pulsante non funziona... Dovrebbe cambiarmi lo stato del pin5 (=Pr1).

Ricontrolla la parte del pulsante e da dove l'hai copiata perché c'è un errore.
Questo parte

if (puls == HIGH) {

non ha senso.

:sweat_smile: Quello è un pezzo che ho aggiunto io :sweat_smile: Come posso modificarlo? Voglio che quel if si attivi solo quando vine premuto il pulsante, quindi quando al pin "puls" arriva corrente.

L'ho modificato così:

//pulsante
  if (digitalRead(puls) == HIGH) {

ma non va comunque... è ancora sbagliato?

Sì è corretto ma penso che il problema sia che "lastBtnState" deve essere cambiato all'esterno dell'if.
Prova così:

  //pulsante
  buttonState = digitalRead(puls);
  if (buttonState == HIGH) {
    if (buttonState != lastBtnState) {
      ledState = !ledState;
      if (ledState == HIGH) {
        digitalWrite(Pr1, HIGH);
      } 
      else {
        digitalWrite(Pr1, LOW);
      }
    }
    delay(reledelay);
  }
  lastBtnState = buttonState;
  //pulsante

Grazie a tutti. :slight_smile: Ho risolto così:

int message = 0;   
int Pr1 = 5;  
int Pr2 = 4;
int Pr3 = 3;
int Pr4 = 2;

//pulsante
const int puls = 8;
const int reledelay = 1000;

int buttonState = 0;
int lastBtnState = LOW;
int ledState = LOW;
//pulsante

void setup() { 

  //pulsante
  pinMode(puls,INPUT);  
  //pulsante

  pinMode(Pr1, OUTPUT);
  pinMode(Pr2, OUTPUT);
  pinMode(Pr3, OUTPUT);
  pinMode(Pr4, OUTPUT);

  Serial.begin(9600);  //set serial to 9600 baud rate
}

void loop(){

  //pulsante
  if (digitalRead(puls) == HIGH) {
    buttonState = digitalRead(puls);
    if (ledState == HIGH) {
      digitalWrite(Pr1,LOW);
      ledState = LOW;
      Serial.println(ledState);
      delay(500);
    } 
  }

  if (digitalRead(puls) == HIGH) {
    buttonState = digitalRead(puls);
    if (ledState == LOW) {
      digitalWrite(Pr1,HIGH);
      ledState = HIGH;
      Serial.println(ledState);
      delay(500);
    }
  }
  //pulsante

  if (Serial.available() > 0) { 
    message = Serial.read(); 

    if (message == '3'){ 
      Serial.write(4);
    }



    if (message == '1'){ 
      digitalWrite(Pr1,LOW);
      ledState = LOW;
      Serial.println(ledState);
    }
    if (message == '2'){ 
      digitalWrite(Pr1,HIGH);
      ledState = HIGH;
      Serial.println(ledState);
    }



    if (message == '5'){ 
      digitalWrite(Pr2, LOW);
    }
    if (message == '6'){ 
      digitalWrite(Pr2, HIGH);
    }




    if (message == '7'){ 
      digitalWrite(Pr3, HIGH);
    }
    if (message == '8'){ 
      digitalWrite(Pr3, LOW);
    }



    if (message == '9'){ 
      digitalWrite(Pr4, HIGH);
    }
    if (message == '4'){ 
      digitalWrite(Pr4, LOW);
    }

  }
}