Dati seriali per domotica.

Ciao a tutti, vorrei risolvere un problema su come inviare i dati sulla seriale. Ho visto alcuni tutorial e letto qualche articolo, ma non ho trovato nulla che mi vada bene. Vorrei fare in modo che quando invio un dato sul monitor serial mi rimanga tipo per 4 o 5 secondi e poi scompare.
Allego tutto il codice

// GESTIONE ILLUMINAZIONE PIANO SUPERIORE 

#define rele1  2 // relè 1  pin digitale 2
#define rele2  3 // relè 2 pin digitale 3
#define rele3  4 // relè 3  pin digitale 4
#define rele4  5 // relè 4  pin digitale 5
#define rele5  6 // relè 5 pin digitale 6
#define rele6  7 // relè 6 pin digitale 7

int pulsante8 = 8;
int pulsante9 = 9;
int pulsante10 = 10; 
int pulsante11 = 11;
int pulsante12 = 12;
int pulsante13 = 14;

boolean statoPulsante8 = false;  // si userà valPulsante per conservare lo stato del pin di input pulsante
boolean statoPulsante9 = false;  // si userà valPulsante per conservare lo stato del pin di input pulsante
boolean statoPulsante10 = false; // si userà valPulsante per conservare lo stato del pin di input pulsante
boolean statoPulsante11 = false; // si userà valPulsante per conservare lo stato del pin di input pulsante
boolean statoPulsante12 = false; // si userà valPulsante per conservare lo stato del pin di input pulsante
boolean statoPulsante13 = false; // si userà valPulsante per conservare lo stato del pin di input pulsante

String readString;
  
void setup() {                  
  
Serial.begin(9600);
  
 // IMPOSTA I VARI PIN IN OUTPUT
  pinMode(rele1, OUTPUT); 
  pinMode(rele2, OUTPUT); 
  pinMode(rele3, OUTPUT);
  pinMode(rele4, OUTPUT);
  pinMode(rele5, OUTPUT);
  pinMode(rele6, OUTPUT);
 
  digitalWrite(rele1, HIGH);
  digitalWrite(rele2, HIGH);
  digitalWrite(rele3, HIGH);
  digitalWrite(rele4, HIGH);
  digitalWrite(rele5, HIGH);
  digitalWrite(rele6, HIGH);

  pinMode(pulsante8, INPUT);
  pinMode(pulsante9, INPUT);
  pinMode(pulsante10, INPUT);
  pinMode(pulsante11, INPUT); 
  pinMode(pulsante12, INPUT);
  pinMode(pulsante13, INPUT);

}  
  
 void loop() {  
  
 int  valPulsante8 = digitalRead(pulsante8);
 int  valPulsante9 = digitalRead(pulsante9);
 int  valPulsante10 = digitalRead(pulsante10); 
 int  valPulsante11 = digitalRead(pulsante11); 
 int  valPulsante12 = digitalRead(pulsante12); 
 int  valPulsante13 = digitalRead(pulsante13); 
// Verifica se la luce Scale è ON o OFF e aggiorna lo stato del pulsante sul tablet in ON o OFF  
    if (valPulsante8 == LOW)
    {
      if (statoPulsante8 == false)
      {
      for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("5");// OFF Scale
      }
       
      statoPulsante8 = true;
      }
    }
    
    if (valPulsante8 == HIGH) 
    {
     if (statoPulsante8 == true)
     {
      for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("6");// OFF Scale
      }
       statoPulsante8 = false;
      }
    }
 //  Verifica se la luce Disimpegno è ON o OFF e aggiorna lo stato del pulsante sul tablet in ON o OFF 
    if (valPulsante9 == LOW)
    {
      if (statoPulsante9 == false)
      {
      for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("7");// OFF Disimpegno
      }
      statoPulsante9 = true;
      }
    }
    
    if (valPulsante9 == HIGH) 
    {
     if (statoPulsante9 == true)
     {
       for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("8");// OFF Disimpegno
      }
       statoPulsante9 = false;
      }
    }
//  Verifica se la luce Camera D. è ON o OFF e aggiorna lo stato del pulsante sul tablet in ON o OFF 
    if (valPulsante10 == LOW)
    {
      if (statoPulsante10 == false)
      {
      for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("9");// OFF Camera D.
      }
      statoPulsante10 = true;
      }
    }
    
    if (valPulsante10 == HIGH) 
    {
     if (statoPulsante10 == true)
     {
       for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("10");// OFF Camera D.
      }
       statoPulsante10 = false;
      }
    } 
 //  Verifica se la luce Camera S./G. è ON o OFF e aggiorna lo stato del pulsante sul tablet in ON o OFF 
    if (valPulsante11 == LOW)
    {
      if (statoPulsante11 == false)
      {
      for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("11");// OFF Camera S./G.
      }
      statoPulsante11 = true;
      }
    }
    
    if (valPulsante11 == HIGH) 
    {
     if (statoPulsante11 == true)
     {
       for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("12");// OFF Camera S./G.
      }
       statoPulsante11 = false;
      }
    } 
   //  Verifica se la luce Bagno Su è ON o OFF e aggiorna lo stato del pulsante sul tablet in ON o OFF 
    if (valPulsante12 == LOW)
    {
      if (statoPulsante12 == false)
      {
      for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("13");// OFF Bagno Su
      }
      statoPulsante12 = true;
      }
    }
    
    if (valPulsante12 == HIGH) 
    {
     if (statoPulsante12 == true)
     {
       for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("14");// OFF Bagno Su
      }
       statoPulsante12 = false;
      }
    }
     //  Verifica se la luce Camera C. è ON o OFF e aggiorna lo stato del pulsante sul tablet in ON o OFF 
    if (valPulsante13 == LOW)
    {
      if (statoPulsante13 == false)
      {
      for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("15");// OFF Camera C.
      }
      statoPulsante13 = true;
      }
    }
    
    if (valPulsante13 == HIGH) 
    {
     if (statoPulsante13 == true)
     {
       for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("16");// OOF Camera C.
      }
       statoPulsante13 = false;
      }
    }  
    
  
  while (Serial.available()) {
    delay(3);  
    char c = Serial.read();
    readString += c;
  }
  

// Controlla Se è stato inviato il dato dal tablet per attivare il relè corrispondente "Scale" 
  if (readString.length() >0) {
    Serial.println(readString);
    if (readString == "ON/OFFScale")     
    {
      digitalWrite(rele1, LOW);
      delay(200);//400
      digitalWrite(rele1, HIGH);
   
  }
    

    if (readString == "ON/OFFDisimpegnoSu")     
    {
      digitalWrite(rele2, LOW);
      delay(200);//400
      digitalWrite(rele2, HIGH);
     
    }
    if (readString == "ON/OFFCamDav")     
    {
      digitalWrite(rele3, LOW);
      delay(200);//400
      digitalWrite(rele3, HIGH);
     
    }
      if (readString == "ON/OFFCamSG")     
    {
      digitalWrite(rele4, LOW);
      delay(200);//400
      digitalWrite(rele4, HIGH);
     
    }
     if (readString == "ON/OFFBagnoSu")     
    {
      digitalWrite(rele5, LOW);
      delay(200);//400
      digitalWrite(rele5, HIGH);
     
    }
     if (readString == "ON/OFFCamCar")     
    {
      digitalWrite(rele6, LOW);
      delay(200);//400
      digitalWrite(rele6, HIGH);
     
    }
    
    readString="";
  }
}

per il momento ho risolto cosi, creando un ciclo FOR per fare in modo che mi scriva 4 volte il dato

// Verifica se la luce Scale è ON o OFF e aggiorna lo stato del pulsante sul tablet in ON o OFF  
    if (valPulsante8 == LOW)
    {
      if (statoPulsante8 == false)
      {
      for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("5");// OFF Scale
      }
       
      statoPulsante8 = true;
      }
    }
    
    if (valPulsante8 == HIGH) 
    {
     if (statoPulsante8 == true)
     {
      for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("6");// OFF Scale
      }
       statoPulsante8 = false;
      }
    }

vorrei eliminare questa funzione e fare in modo che il dato viene scritto per un tot di tempo e poi scompare.
Grazie mille.

Gian70Luca:
Ciao a tutti, vorrei risolvere un problema su come inviare i dati sulla seriale. Ho visto alcuni tutorial e letto qualche articolo, ma non ho trovato nulla che mi vada bene. Vorrei fare in modo che quando invio un dato sul monitor serial mi rimanga tipo per 4 o 5 secondi e poi scompare.

Scompare da dove ? Dalla finestra di serial monitor?

Si.. Il programma adesso funziona bene, vorrei solo eliminare la funzione FOR. Fare in modo che il dato che viene inviato alla seriale mi resti sul monitor per un tot di secondi e poi scompare.

Io mi ero fatto una piccola applicazione per ricevere i caratteri dalla seriale in C#.

Per quello che conosco io,le possibilità sono:

  1. Stampi una serie di righe vuote, per cancellare tutto..... :o
  2. Usi un applicazione a parte ad esempio in processing
  3. Cambi terminale ( monitor) perchè serial monitor non supporta alcuni caratteri speciali.
    mentre 'putty' li supporta. Installa putty. http://www.putty.org/

Esempio che simula l'invio di un dato sulla seriale( utilizzare con lo sketch processing oppure con putty):
Lo puoi usare con lo sketch processing o con putty ( per putty elimina il carattere di commento come
spiegato nello sketch infondo)

int cont;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);       //  seriale a 115200
  Serial.println("Hello !");
  delay(1000);   // testa la seriale
  }

void loop() {
  // put your main code here, to run repeatedly:

cont++;
Serial.println(cont);
delay(5000); // simula il tempo tra una azione ed un altra.


/*
 * Se vuoi testare putty con questo sketch Arduino. Togli il commento alle righe sottostanti.
  Serial.write(27);       
  Serial.print("[2J");    
  Serial.write(27);
  Serial.print("[H");     
*/
  
}

sketch Processing ( basic )

import processing.serial.*;

Serial arduino;              // nuova oggetto di tipo 'seriale'
int lf = 10;                //  carattere di Linefeed in codice ascii
String val=null;            //  Dato ricevuto da arduino
String printVal=null;       // variabile che contiene il valore del dato ricevuto da arduino

String portName = Serial.list()[0]; // <-- selezionare la porta corretta

boolean datoOk;            // Alza un flag quando arriva il dato, quindi inizia il conteggio ( 4 secondi), dopo cancella tutto.
int nByte;                 // contiene l'eventuale numero di byte (dato) presente sulla seriale. Se maggiore di zero allora NON lo considera nullo.
int cont;                  // Timer per determinare quanti secondi sono trascorsi dopo l'arrivo del dato
void setup ()

{
 size(500, 500);
 background(255);
 fill(50);
 frameRate(1); // 1 frame per ogni secondo. Quindi se cont = 4 , son trascorsi 4 secondi  
 
  arduino = new Serial(this, portName, 115200);
  arduino.clear();
  val = arduino.readStringUntil(lf);   
  val = null;
  
  printArray(Serial.list());  // stampa le porte disponibili
  
}
void draw()
{

  nByte = arduino.available() ;
   
  if (datoOk == true) cont++;
  
  if (cont>3) { cont = 0; background(255); } // cancella ricolorando lo sfondo...
  
  if ( nByte > 0){
      val = arduino.readStringUntil(lf);         // legge il valore del dato appena arrivato
      if (val !=null)
        {
             printVal = val;
             println(val);
             println(nByte);
             text(val, 200, 200);
             datoOk = true;
       }
  }
}

Altrimenti installa putty e nel tuo sketch quando devi cancellare scrivi:

Serial.write(27);       
Serial.print("[2J");    
Serial.write(27);
Serial.print("[H");

il serial monitor quello che è :confused: o la blocchi o scorre di continuo
una delle prime cose da procurare nei progetti e il display
il serial monitor è più una "cosa" per vedere se tutto sta funzionando

Oppure si può "sparare" una serie di ritorni a capo, che fanno sparire le scritte 40 (o più) righe sopra.
Ma poi la seriale è in genere usata per il debug. Non è che uno ci tiene attaccato un computer o terminale all' Arduino.

ExperimentUno:
Oppure si può "sparare" una serie di ritorni a capo, che fanno sparire le scritte 40 (o più) righe sopra.
Ma poi la seriale è in genere usata per il debug. Non è che uno ci tiene attaccato un computer o terminale all' Arduino.

Infatti perchè non ti crei un'app collegata in bluetooth per leggere lo stato di tutte le tue luci? Potresti tenerti un tab appeso alla parete con tutte le info che vuoi.

Ciao

Fatto. l'impianto domotico che sto realizzando è composto da un Tablet 10" posizionato a muro e si interfaccia via bluetooth con le varie NANO. Attualmente sono in funzione una NANO per gestire il meteo esterno, Un NANO per la gestione tende con controllo luminosità, pioggia e vento e Una NANO che mi gestisce le luci nella zona notte dove sto avendo molti problemi con la gestione dei dati seriali. Grazie alla presenza di persone qualificate che si trova in questo Forum ho risolto molti problemi.

Ma credo che un tablet con interfaccia a terminale non sia molto intuitiva.
si potrebbe farne una con appinventor.
Oppure c'è un programma che permette di sviluppare una interfaccia grafica e creare il codice da caricare nell'arduino. Non so se permette d collegare più dispositivi.

Ciao, voglio solo avvisare che l'impianto domotico che ho realizzato, grazie anche con l'aiuto di persone competenti è funzionante. Attualmente l'impianto comprende :
Gestione Tende esterne con rilevazione di pioggia, luce e vento.
Gestione illuminazione interna con possibilità di avere vari scenari di illuminazione.
Gestione meteo riscaldamento.
il tutto con l'ausilio di sintesi vocale "Attualmente solo con la gestione tende"
MI manca la gestione antifurto e apparecchiature.
Grazie a tutti.