Monitoraggio funzionamento dispositivo

Salve a tutti,

vorrei controllare quante volte si accende e per quanto tempo funziona un determinato dispositivo, una lampada, l'impianto di innaffiamento del giardino, la caldaia, .......

E' possibile farlo con Arduino Uno?

Grazie

Purché non manometti l'impianto (quindi utilizzi dei sensori non intrusivi) e purché il segnale dei sensori usati sia compatibile con i livelli di tensione di Arduino ... la risposta è SI :slight_smile:

Guglielmo

Certo, il sensore dovrebbe essere un semplice relè che porterebbe un segnale a bassa tensione o un contatto.

Lo schema del progetto quindi è :

1 - dispositivo alimentato da tensione
2 - si eccita un relè che trasmette il segnale ad Arduino Uno
3 - Arduino Uno invia un segnale (tramite USB, Wi-Fi o altro)
4 - il segnale permane per tutta la durata dell'accensione
5 - il PC registra le accensioni e ne calcola i tempi di funzionamento

Dove e dove posso raccogliere il segnale proveniente dal relè ?

Grazie

O io non ho capito cosa vuoi fare, o... come lo collegheresti il relé?

Se usi dei rele', dovrebbero essere rele' a 230VAC previsti per il funzionamento prolungato (roba DIN o simile), quindi se li devi collegare all'impianto elettrico, dovrai farlo fare ad un'elettricista (per via delle attuali leggi in materia), e poi i contatti "puliti" e galvanicamente isolati dei rele' li potrai leggere come normali pulsanti o interruttori, con ingressi digitali ...

Se invece utilizzi dei TA (trasformatori amperometrici) per leggere il passaggio della 230VAC senza collegarti fisicamente all'impianto (basta far passare UNO dei due fili all'interno del TA, senza quindi doverlo interrompere o collegarci elettricamente nulla), avrai poi un circuitino collegato al TA che ti genera un segnale digitale (o analogico, se devi anche misurare il consumo) compatibile con arduino ... il tipo di circuito e di TA dipendera' ovviamente dal carico e dall'utilizzo ...

Purtroppo, per ragioni di sicurezza e di regolamento (vedi punto 15) non possiamo dare informazioni che riguardino la manomissione degli impianti, per quanto riguarda la parte 230VAC (per quello dicevo di far collegare i rele' all'elettricista ... se lo fa lui, tu poi agisci solo sui contatti dei rele', che sono isolati rispetto all'impianto, e quindi sei a norme)

Quando il dispositivo viene acceso, mettiamo la caldaia che viene quindi accesa dal termostato ambiente, viene passata tensione a 220 V per il funzionamento di quest'ultima.

Qui collegherei il relè che chiude, all'accensione della caldaia, il contatto, questo segnale che potrebbe essere anche una bassa tensione (5 V =) e dovrebbe essere letto da Arduino e spedito al PC.

Grazie

Dinamo2016:
Dove e dove posso raccogliere il segnale proveniente dal relè ?

... dai contatti del relè no ? ? ? :o :o :o

Metti il relè che chiude il contatto verso massa, metti un pin di Arduino in INPUT_PULLUP (così è normalmente HIGH) e poi leggi il pin ... quando va LOW il relè è attivo, quando è HIGH no ...
... o non ho capito cosa vuoi fare ?

Guglielmo

Il segnale che arriva dal relè (completamente isolato dalla tensione 220 V, viene pilotato del termostato ambiente), può essere :

A - un semplice segnale dovuto alla chiusura dei contatti del relè
B - passaggio di corrente continua a 5 V (portando tensione al contatto del relè).

Questo segnale deve essere passato ad Arduino e poi al PC.

Tramite la lettura dello stato di Acceso/Spento, tramite opportuno programma per PC (lo scrivo io), registrerei i tempi di accensione e durata delle accensioni per effettuare il completo monitoraggio dell'attività della caldaia/dispositivo.

Grazie.

E quindi fai quello che ti ho scritto al post qui sopra ...
... dove è il problema ? :o

Guglielmo

Non esiste problema, essendo un neofita, chiedo umilmente consiglio.

  • Quindi collego un contatto del relè (termostato) a GND di Arduino (A);

  • collego l'uscita 5V di Arduino all'altro capo del relè ed a (A) con interposizione di una resistenza valore da calcolare, penso oltre 300 Ohm); (B)

  • collego (B) alla porta digitale 8 di Arduino con l'interposizione di una resistenza (valore da calcolare, pochi Ohm);

Questo è lo sketch che ho scritto che ti prego di verificare:

int spia=13; // la variabile spia assume il valore 13
int termostato=8; // la variabile termostato assume il valore 8
int statospia=0; // la variabile statospia assume il valore 0

void setup()
{
 pinMode(spia, OUTPUT);
 pinMode(termostato , INPUT);
 digitalWrite(spia, termostato);
}

void loop()
{
  statospia = digitalRead(termostato);   // lettura del segnale del termostato
  if (statospia == HIGH) {               // controlla se il termostato è ON
    digitalWrite(spia, HIGH);   // se si, invia il segnale alla porta del PC
  }
  else if (statospia == LOW) {              // controlla se il termostato è OFF
    digitalWrite(spia, LOW);    // invia il segnale alla porta del PC
  }
}

Mi manca la lettura della porta da parte del PC ma non dovrebbe essere un problema.

Allego lo schema elettrico di funzionamento con Arduino Uno :

Grazie.

Leggi bene quello che ti ho scritto, non si serve il collegamento con i 5V al relè, basta il GND su un contatto ...

... difatti ti ho indicato di usare il pin di input come INPUT_PULLUP (... e NON solo INPUT), ovvero di usare le resistenze interne della MCU per tenere il pin a livello HIGH. Quando il relè si chiude porta il pin a livello LOW (quindi logica inversa, relè aperto HIGH, relè chiuso LOW).

Sistema il codice e vedi se va.

Guglielmo

OK Guglielmo,

spero che così vada bene!

int spia=13; // la variabile spia assume il valore 13
int termostato=8; // la variabile termostato assume il valore 8
int statospia=0; // la variabile statospia assume il valore 0

void setup()
{
 pinMode(spia, OUTPUT);
 pinMode(termostato , INPUT);
 digitalWrite(spia, termostato);
}

void loop()
{
  statospia = digitalRead(termostato);   // lettura del segnale del termostato
  if (statospia == LOW) {               // controlla se il termostato è ON
    digitalWrite(spia, HIGH);   // se si, invia il segnale alla porta del PC >>> acceso
  }
  else if (statospia == HIGH) {              // controlla se il termostato è OFF
    digitalWrite(spia, LOW);    // invia il segnale alla porta del PC >>> spento
  }
}

Perdona la mia inesperienza e Grazie.

MonitorCaldaia.pdf (90.9 KB)

Non ci siamo ... guarda le varie possibilità della pinMode e vedrai che c'è proprio la INPUT_PULLUP come modalità da selezionare per un ingresso, così da ATTIVARE la resistenza di pull-up interna ...

Guglielmo

Penso di aver capito, ho modificato lo sketch con l'accensione di un led e la scrittura dei dati (Data) e (Ora).

Non ho scritto il metodo di estrazione della data e dell'ora, non ne conosco il metodo e il dispositivo che occorre.

Mi sembra di aver acquistato, tra le varie cose, un modulo orologio che ha una batteria a bordo.

Grazie

int spia=13;                                            // la variabile spia assume il valore 13
int termostato=8;                                    // la variabile termostato assume il valore 8
int statospia=0;                                      // la variabile statospia assume il valore 0

void setup()
{
 Serial.begin(9600);
 pinMode(spia, OUTPUT);
 pinMode(termostato , INPUT_PULLUP);
 pinMode(12, OUTPUT);  // accensione led acceso/spento
 digitalWrite(spia, termostato);
}

void loop()
{
  statospia = digitalRead(termostato);        // lettura del segnale del termostato
  if (statospia == LOW) {                         // controlla se il termostato è ON
    digitalWrite(spia, HIGH);                      // se si, invia il segnale alla porta del PC come acceso
    digitalWrite(12, HIGH);                        // accende il led
    file = SD.open("caldaialog.txt", FILE_WRITE); //File in scrittura
    //// preleva la data e l'ora (data_orario) da definire
    if (file) //Se il file è stato aperto correttamente
    { 
       file.println("Accensione"); 
       file.println(data_orario);                 // scrivo la data e l'ora dell'accensione
       file.close();                                  //Chiusura file
       delay(1000);                                // attendi un secondo
    {
  }
  else if (statospia == HIGH) {              // controlla se il termostato è OFF
    digitalWrite(spia, LOW);                   // invia il segnale alla porta del PC come spento
    digitalWrite(12, LOW);                     // spegne il led
    //// preleva la data e l'ora (data_orario) da definire
    if (file) //Se il file è stato aperto correttamente
    { 
       file.println("Spegnimento");
       file.println(data_orario);              // scrivo la data e l'ora dello spegnimento
       file.close();                               //Chiusura file
       delay(1000);                             // attendi un secondo
    {
  }
}

Puoi spiegarmi cosa intendevi fare in queste due istruzioni :

pinMode(12, OUTPUT);  // accensione led acceso/spento
digitalWrite(spia, termostato);

Guglielmo

Ho tolto l'istruzione digitalWrite(spia, termostato); in quanto inutile.

con l'istruzione pinMode(12, OUTPUT); pensavo di definire la porta da usare per l'accensione del led di accensione/spegnimento.

Pensavo che per monitorare il funzionamento della caldaia, non è necessario l'assiduo controllo della sua attività.

E' più logico prelevare ogni tanto il contenuto della scheda SD, questa è un'altro argomento da approfondire.

Mi potresti indicare il modo ed il modulo da usare per l'estrazione della data e dell'ora?

Grazie

int spia=13;                                 // la variabile spia assume il valore 13
int termostato=8;                          // la variabile termostato assume il valore 8
int statospia=0;                            // la variabile statospia assume il valore 0
 
void setup()
{
 Serial.begin(9600);
 pinMode(termostato , INPUT_PULLUP);
 pinMode(spia, OUTPUT);
 pinMode(12, OUTPUT);                    // accensione led acceso/spento
}

void loop()
{
  statospia = digitalRead(termostato);   // lettura del segnale del termostato
  if (statospia == LOW) {                // controlla se il termostato è ON
    digitalWrite(spia, HIGH);            // se si, invia il segnale alla porta del PC come acceso
    digitalWrite(12, HIGH);              // accende il led
    file = SD.open("caldaialog.txt", FILE_WRITE); //File in scrittura
    // preleva la data e l'ora
    if (file) //Se il file è stato aperto correttamente
    { 
       file.println("Accensione"); 
       file.println(data_orario);        // scrivo la data e l'ora dell'accensione
       file.close(); //Chiusura file
       delay(1000);                      // attendi 1 secondo
    {
  }
  else if (statospia == HIGH) {         // controlla se il termostato è OFF
    digitalWrite(spia, LOW);            // invia il segnale alla porta del PC come spento
    digitalWrite(12, LOW);              // spegne il led
    // preleva la data e l'ora
    if (file) //Se il file è stato aperto correttamente
    { 
       file.println("Spegnimento");
       file.println(data_orario);       // scrivo la data e l'ora dello spegnimento
       file.close(); //Chiusura file
       delay(1000);                     // attendi 1 secondo
    {
  }
}

Dinamo2016:
...... Mi potresti indicare il modo ed il modulo da usare per l'estrazione della data e dell'ora?

Come modulo ti consiglio di prendere un RTC basato su DS3231 che è molto preciso (... sicuramente superiore al DS1307 che spesso viene usato). Il costo per una schedina con sopra anche una batteria di backup (... e spesso anche una memoria) è irrisorio (stiamo nell'ordine di quale US$).

Se vai nel "Library Manager" dell'IDE e, tramite l'apposito spazio in alto a destra, cerchi DS3231, trovi le librerie pronte con gli esempi per leggere e scrivere tutti i campi.

Guglielmo

Ho tolto l'istruzione digitalWrite(spia, termostato); in quanto inutile.

Più che inutile, direi che è errata. In pratica dai sul pin 13 il valore di 8
Comunque a parte questa disquisizione, in codesto sketch vedo un problema:
Scrivi ad ogni secondo nella SD la data e l'ora, mentre dovresti scriverci solo quando cambia di stato

Dipende dalla caldaia ... quelle vecchie avevano i comandi a 220, ma credo che attualmente le normative lo proibiscano ...

Certo, sarebbe meglio controllare prima :smiley:

Rispondo a tutti :

  • il segnale del termostato è isolato dalla tensione di rete (220 V~), arriva una tensione di 12V= tramite relè ed alimentatore dedicati;

  • non voglio scrivere ogni secondo sulla SD, voglio scrivere ad ogni accensione o spegnimento indipendentemente dalla loro frequenza, infatti la condizione è legata al fatto che lo stato sia High o Low ovvero ad ogni intervento del termostato, sia in accensione che in spegnimento.

  • vado a vedere il modulo orologio (RTC) basato su DS3231, poi vedo cosa fare;

  • non mi avete detto se lo sketch va bene.

Grazie