Comunicazione seriale che a volte non prende

docsavage:
Tieni pure conto che la seriale sia sempre libera per il trasmettitore

se la seriale è utilizzata solo se viene premuto il pulsante non risulta libera in caso contrario?

ho cercato un pò sul forum, per gestire lo stop della comunicazione, ma non saprei. devo usare Serial.end?

per trasmettere prova questo

vedi in debug se alla pressione del pulsante tramette la stringa #A*

che poi in ricezione si decodifica

#define PULSANTE 8
boolean stp;
boolean st;

void setup() {

  pinMode(PULSANTE, INPUT);

}

void loop() {
st=digitalread(PULSANTE);
  if ((st!=stp) and (stp=st)) {
serial.print("#A*");

}
}

fammi sapere

ma ti vanno i programmi?

anche magari male intendo, ma vanno?

perché mi accorgo adesso che manca la serial.begin()

anche nel mio listato, l'ultimo
siccom ho solo revisionato il tuo, non ci avevo fatto caso....

Scusate se non ho risposto prima, ma sono stato senza connessione per giorni :confused:

ma ti vanno i programmi?

si, i programmi funzionano inserendo il Serial.begin(), ho fatto un errore nel copia e incolla.

Stamattina ho eseguito un pò di prove e ho utilizzato il codice suggerito da docsavage, vi posto di seguito tutta la situazione aggiornata con quello che accade.

Giusto per rendere più chiaro il tutto, inserisco il circuito

Il ciurcuito utilizzato è reale e non simulato online

Sul RICEVITORE A

#define SPENGO 11
#define RELAY 9

int val = 0;                  
int vecchio_val = 0;       
int stato = 0;  

void setup() {
pinMode(SPENGO,INPUT);
pinMode(RELAY,OUTPUT);
Serial.begin(9600);
}

void loop() {
  if (Serial.available()){
     if (Serial.read() == 'A' ) { //leggo lo stato del pulsante
      digitalWrite(RELAY, HIGH); 
          delay(10);
        }}
val = digitalRead(SPENGO); //pulsante di spegnimento scritto così per evitare rimbalzi
 if ((val == HIGH) && (vecchio_val == LOW)){  
    stato = 1 - stato;  
    delay(15);                // attesa di 15 millisecondi 
  }   
    vecchio_val = val;  
    if (stato == 1) {  
  digitalWrite(RELAY, LOW); //Spego il Relay
    delay(10);
  }
 }

Sul TRASMETTITORE B

#define PULSANTE 8
boolean stp=false;
boolean st;

void setup() {
  pinMode(PULSANTE, INPUT);
  Serial.begin(9600);
}
void loop() {
  st=digitalRead(PULSANTE);
  if ((st!=stp) && (stp=st)) {
    stp=st;
    Serial.write("#A*");
  }
}

Cosa accade:
Gli arduino si avviano allo stesso momento, apparentemente il circuito funziona bene, la comunicazione avviene e il "Relay" si accende, però a volte capita che i due arduino non si "sentono". Provando a resettare il Ricevitore A, tutto torna a funzionare.

di seguito, ho provato a fare una prova per capire di quale natura fosse il problema:

Alla pressione del pulsante sul Trasmettitore B, ho aggiunto l'accensione di un led di prova collegato direttamente al Trasmettitore B e dopo un delay(50);, l'istruzione Serial.write('#A*');.

Il risultato è che il led di prova si accende, ma il "Relay" sul Ricevitore A a volte si e a volte no, e questo cambia ad ogni riavvio del circuito.
Per quel poco che conosco, suppongo ci sia un problema di comunicazione, una perdita di sincronismo o cosa simile, ma non vorrei azzardare ipotesi assurde.

Cosa potrebbe essere?

adesso pappa

dopo viaggio a casa di vacanza

tardo pomeriggio penso

non temere, se ne esce

docsavage:
adesso pappa

dopo viaggio a casa di vacanza

tardo pomeriggio penso

non temere, se ne esce

:smiley: :smiley: :smiley:
si, il weekend è sacro!

io nel frattempo continuo la mia "pappa" cerebrale... :grin:

prova ad abitare in un posto ma la tua compagna in un altro

e scopri nuovi livelli di sacralità del week-end

posso solo immaginare, dopo 5 anni ho tagliato la testa al toro andando a convivere

Ci ho dato uno sguardo mentre bolle acqua

Secondo me il problema è nella parte dove leggi il pulsante di spegnimento

Scarpa via tutto è metti una cosa del tipo

If digitalread pulsante
Digitalwrite relè , low

Metti a posto maiuscole e parentesi, è scritto da telefonino

Non incasinarti con stati e valori vecchi, per spegnere e basta non servono

fatto ma nessun cambiamento, il problema persiste.

non c'è un modo per risincronizzare la seriale dopo aver avviato gli arduino?

è strano perchè se resetto il ricevitore, funziona bene. Ho l'impressione che la serial.write() non arrivi a destinazione

Se resetti il ricevitore il problema è li

Fai così

Siccome usi la stessa seriale per usb e telecomando,

Puoi provare a scrivere nel monitor seriale del ricevitore

Prova a scrivere A

Dovrebbe andare

Vedi cosa succede

prova questo:

#define SPENGO 11
#define RELAY 9


void setup() {
  pinMode(SPENGO, INPUT);
  pinMode(RELAY, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    if (Serial.read() == 'A' ) { //leggo lo stato del pulsante
      digitalWrite(RELAY, HIGH);
    }
    if (Serial.read() == 'S' ) { //leggo lo stato del pulsante
      digitalWrite(RELAY, LOW);
    }
  }

  if (digitalRead(SPENGO)) {
    digitalWrite(RELAY, LOW); //Spego il Relay
  }
}

un tocco più corta e permette anche lo spegnimento da telecomando

Lascia stare, mi sono sbagliato, la terza if facoltà

Mi sono sbagliato alla grande, non può andare bene

Ne parliamo domani

Ho scritto uno switch case, che non fa altro che ripetere quello che facevano gli if, addirittura c'è un passo in più, poi ho posto if (Serial.available() > 0) con il maggiore di zero, e stranamente funziona e non devo più resettare arduino. Bah.

#define SPENGO 11
#define RELAY 9
char azione;
void setup() {
  pinMode(SPENGO, INPUT);
  pinMode(RELAY, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  if (Serial.available() > 0) {
    azione = Serial.read();
  }

  if (digitalRead(SPENGO)) {
    azione = 'S';
    return;
  }
  switch (azione) {
    case 'A':
      digitalWrite(RELAY, HIGH);
      delay(10);
      break;
    case 'S':
      digitalWrite(RELAY, LOW); //Spego il Relay
      delay(10);
      break;
  }
}

quale mistero...

Infatti hai riscritto la parte di gestione del pulsante, era quella che ti dava problemi

Come effetto collaterale hai che puoi spegnere anche da telecomando

AlPinkish:
quale mistero...

Direi nessuno. La Serial.read() si deve scrivere in un solo punto, e solo dopo decidere cosa fare dei dati letti. Se si scrivono diverse Serial.read() in punti diversi si rischia di scartare dati buoni.