attivare rele tramite serial read e pressione del bottone

ciao ragazzi in anzi tutto mi presento!
sono un ragazzo di 21 anni molto appassionato sia di elettronica che di informatica.
spero di aver scritto nella sezione giusta.
sto lavorando a un piccolo progetto per rendere domotica una stanza della mia casa.
Ho riscontrato una difficolta:
vorrei incitare un rele sia dalla porta seriale che dalla pressione di un bottone e un paio di giorni che ci provo ma purtroppo non ne riesco a venire a capo!
se faccio le cose separate riesco senza problemi ma combinare le due cose incontro sempre difficoltà!

x incitare un relè basta che gli gridi "forza! forza! forza!"
Per quanto riguarda il resto puoi postare il codice usato, tramite gli appositi tag code, e possiamo discuterne

Spero che tu non voglia incitarlo alla violenza, ce ne sono già troppi in giro di relè delinquenti...
(scusate non ho resistito)

scusate ecco qua il codice il rele in questione e rele_lampadario

#include <LiquidCrystal.h>
#define NOTE_C4 262

int rele_porta = 6;
int rele_lampadario = 7;
int rele_luce2 = 8;
int rele_luce3 = 9;
int lucedisp = 13;
int val_Adc = 0;
float temp = 0;
int note2 = NOTE_C4;

int button = 13;
boolean statobutton;
int counbutton = 0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 

void setup() {
  Serial.begin( 9600 );
  lcd.begin(16, 2); 
  pinMode( rele_porta, OUTPUT );
  pinMode( rele_lampadario, OUTPUT );
  pinMode( rele_luce2, OUTPUT );
  pinMode( rele_luce3, OUTPUT );
  pinMode( button, INPUT );
} //fine set up

void loop() {
  val_Adc = analogRead(0);
  temp = ((val_Adc * 0.00488) - 0.5) / 0.01;
  attesa();
  statobutton = digitalRead(button);
delay(300);

if (statobutton == true){
counbutton = counbutton +1;
}

if (counbutton == 1){
  digitalWrite( rele_lampadario, HIGH ); 
  lcd.clear();
  lcd.print("Lampadario ON");
  delay(2000);
}

if (counbutton == 2){
  digitalWrite( rele_lampadario, LOW );
  lcd.clear();
  lcd.print("Lampadario OFF");
  counbutton = 0;
  delay(2000);

}

  while (Serial.available() == 0);
  
  int COM_value = Serial.read() - '0';
  Serial.println(COM_value);
  //apriporta
  if( COM_value == 1 ){
    lcd.clear();
    lcd.print("porta aperta");
    digitalWrite( rele_porta, HIGH ); 
    delay(1000);
    digitalWrite( rele_porta, LOW );
    delay(1000);
  }
  
  //Lampadario
  if( COM_value == 3 ){
    counbutton=1;
  }
  
  if( COM_value == 4 ){
    counbutton=2;
  }
  
  
  //Luce 2
  if( COM_value == 5 ){
    digitalWrite( rele_luce2, HIGH );
    lcd.clear();
    lcd.print("Luce 2 ON");
    delay(2000);
  }
  if( COM_value == 6 ){
    digitalWrite( rele_luce2, LOW );
    lcd.clear();
    lcd.print("Luce 2 OFF");
    delay(2000); 
  }
  
  //Luce 3
  if( COM_value == 7 ){
    digitalWrite( rele_luce3, HIGH );
    lcd.clear();
    lcd.print("Luce 3 ON");
    delay(2000); 
  }
  if( COM_value == 8 ){
    digitalWrite( rele_luce3, LOW );
   lcd.clear();
    lcd.print("Luce 3 OFF");
    delay(2000); 
  }
  
  
  //INTRUSIONE
  if( COM_value == 2 ){
    lcd.clear();
    lcd.print("tentativo di");
    lcd.setCursor(0, 1);
    lcd.print("intrusione!!!");
    tone(10, note2);
    delay(2000);
    noTone(10);
    delay(500);
    tone(10, note2);
    delay(2000);
    noTone(10);
  }

} //FINE DEL LOOP


void attesa(){
  lcd.clear();
  lcd.print("attesa comando");
  lcd.setCursor(0, 1);
  lcd.print("temp ");
  lcd.print(temp);
  lcd.print(" C");
}

Quel codice fa molte più cose di quelle che vuoi fare te... Non prendere codici belli e fatti senza sapere cosa fanno, fanne uno tuo con lo stretto necessario.

lol io mi chiedo come puoi dire che quel codice è stato copiato da qualche parte e tutto mio..
che ne sai del mio progetto?? io ho solo postato una domanda riguardo a quello che non riesco a fare...

pjor94:
ciao ragazzi in anzi tutto mi presento!

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

fatto chiedo scusa per non averlo fatto prima!!
ho gia cercato in vari thread purtroppo non ho trovato soluzione al mio problema!!

pjor94:
lol io mi chiedo come puoi dire che quel codice è stato copiato da qualche parte e tutto mio..
che ne sai del mio progetto?? io ho solo postato una domanda riguardo a quello che non riesco a fare...

non ti arrabbiare... il mio era solo un consiglio... d'altra parte se guardi qui ti rendi conto che la parte che riguarda la seriale sembra proprio presa pari-pari (nomi a parte). Ma questo non è importante, più o meno lo facciamo tutti di riutilizzare parti di programmi fatti da altri, quello che conta è capirli prima di usarli. Ho generalizzato, ma se non è il tuo caso, meglio per te.

io metterei la lettura dalla seriale ad inizio loop e poi un OR all'interno dell'if

if (counbutton == 1 ||  COM_value == 3 ){
  digitalWrite( rele_lampadario, HIGH );
  lcd.clear();
  lcd.print("Lampadario ON");
  delay(2000);
}

doppiozero:
io metterei la lettura dalla seriale ad inizio loop e poi un OR all'interno dell'if

if (counbutton == 1 ||  COM_value == 3 ){

digitalWrite( rele_lampadario, HIGH );
  lcd.clear();
  lcd.print("Lampadario ON");
  delay(2000);
}

ho provato come dici tu ma dopo un po di accensioni il codice inpazzisce e non reagisce piu ai comandi e non riesco a capire il perche...

hai fatto la stessa cosa per spegnere il relè e commentato i comandi che non servono più?

#include <LiquidCrystal.h>
#define NOTE_C4 262

int rele_porta = 6;
int rele_lampadario = 7;
int rele_luce2 = 8;
int rele_luce3 = 9;
int lucedisp = 13;
int val_Adc = 0;
float temp = 0;
int note2 = NOTE_C4;

int button = 13;
boolean statobutton;
int counbutton = 0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  Serial.begin( 9600 );
  lcd.begin(16, 2);
  pinMode( rele_porta, OUTPUT );
  pinMode( rele_lampadario, OUTPUT );
  pinMode( rele_luce2, OUTPUT );
  pinMode( rele_luce3, OUTPUT );
  pinMode( button, INPUT );
} //fine set up

void loop() {
   while (Serial.available() == 0);
 
  int COM_value = Serial.read() - '0';
  Serial.println(COM_value);
  
  val_Adc = analogRead(0);
  temp = ((val_Adc * 0.00488) - 0.5) / 0.01;
  attesa();
  statobutton = digitalRead(button);
delay(300);

if (statobutton == true){
counbutton = counbutton +1;
}

if (counbutton == 1 || COM_value == 3 ){
  digitalWrite( rele_lampadario, HIGH );
  lcd.clear();
  lcd.print("Lampadario ON");
  delay(2000);
}

if (counbutton == 2 || COM_value == 4){
  digitalWrite( rele_lampadario, LOW );
  lcd.clear();
  lcd.print("Lampadario OFF");
  counbutton = 0;
  delay(2000);

}

 
  //apriporta
  if( COM_value == 1 ){
    lcd.clear();
    lcd.print("porta aperta");
    digitalWrite( rele_porta, HIGH );
    delay(1000);
    digitalWrite( rele_porta, LOW );
    delay(1000);
  }
 /*
  //Lampadario
  if( COM_value == 3 ){
    counbutton=1;
  }
 
  if( COM_value == 4 ){
    counbutton=2;
  }
 */
 
  //Luce 2
  if( COM_value == 5 ){
    digitalWrite( rele_luce2, HIGH );
    lcd.clear();
    lcd.print("Luce 2 ON");
    delay(2000);
  }
  if( COM_value == 6 ){
    digitalWrite( rele_luce2, LOW );
    lcd.clear();
    lcd.print("Luce 2 OFF");
    delay(2000);
  }
 
  //Luce 3
  if( COM_value == 7 ){
    digitalWrite( rele_luce3, HIGH );
    lcd.clear();
    lcd.print("Luce 3 ON");
    delay(2000);
  }
  if( COM_value == 8 ){
    digitalWrite( rele_luce3, LOW );
   lcd.clear();
    lcd.print("Luce 3 OFF");
    delay(2000);
  }
 
 
  //INTRUSIONE
  if( COM_value == 2 ){
    lcd.clear();
    lcd.print("tentativo di");
    lcd.setCursor(0, 1);
    lcd.print("intrusione!!!");
    tone(10, note2);
    delay(2000);
    noTone(10);
    delay(500);
    tone(10, note2);
    delay(2000);
    noTone(10);
  }

} //FINE DEL LOOP


void attesa(){
  lcd.clear();
  lcd.print("attesa comando");
  lcd.setCursor(0, 1);
  lcd.print("temp ");
  lcd.print(temp);
  lcd.print(" C");
}

poi quei delay dentro gli if non mi convincono molto, secondo me bloccano il codice e basta