Controllo e gestione carichi casalinghi con sistema di priorità e tapparelle!

riprendo il topic in mano visto che dopo un po di "gavetta" con arduino Yun, mi sono deciso ad utilizzarlo al posto di Uno per lo stesso progetto, ma con qualche modifica. Ecco le principali:

  • Controllo consumi anche da remoto;

  • Distacco e riallaccio da remoto;

  • Possibilità futura di aggiungere la funzione per alzare ed abbassare le serrande già motorizzate da remoto;

  • Le suddette operazioni saranno eseguibili comodamente da un app per Android che ho già realizzato e testato (e funziona :slight_smile: )

  • Segnalazioni acustiche tramite cassa audio (di quelle che si usano per i portatili o per ipod etc etc) collegata ad una scheda audio usb collegata alla porta usb gestita da linux, con riproduzione di file mp3 posti sulla scheda microSD (già funzionante);

Siccome ho deciso di risparmiare qualche pin prezioso che, con il primo progetto avevo un po trascurato, ho deciso di collegare il monitor (un nuovo 20x4 al posto del 16x2) tramite i2C.

I sensori di corrente (SCT-013-030) sono diventati 4:

pin A1 --- sensore linea BAGNI

pin A2 --- sensore linea STANZE

pin A3 --- sensore linea CUCINA

pin A4 --- sensore TOTALE

pin A5 --- offset (leggo la tensione in uscita da un partitore di tensione realizzato partendo dal VIN, che in particolare viene dall'alimentatore switching stabilizzato che alimenta il tutto (arduino + proto shield con partitore di tensione, 4 led, 1 scheda relè, 1 monitor 20x4);

I sensori sono tutti collegati al partitore di tensione come l'offset, ad ogni loop, come già nel progetto precedente con UNO, eseguo un tot (X) di letture in un dato tempo (20ms), ad ogni lettura sottraggo l'offset, ne considero i valori assoluti, sommo i valori e divido per il numero di letture ottenendo così la media. Da questo valore ottengo poi in modo (consapevolmente approssimato) gli ampere, quindi i watt!

Il mio attuale problema nasce dal fatto che nei 20ms (ho provato anche ad aumentare il tempo di campionamento) leggo X volte ben 5 porte analogiche che, in condizioni di carico quasi nullo in tutta la casa, dovrebbero avere letture uguali o quasi alla lettura del pin A5, portando la differenza uguale o quasi a 0, ottenendo quindi circa 0 watt di consumo dai calcoli.

Con Uno ed un solo sensore, era (quasi) così, in assenza di carico magari la media mi riportava 4 - 5 watt di consumo ma del tutto trascurabile (per me) visto la consapevolezza di una certa approssimazione alla base del progetto...

Con Yun e con 4 sensori, il fenomeno è diventato più evidente e volevo cercare di limitarlo!

In assenza di carico nei sensori, in genere ho 70 - 80 watt per ogni sezione !!! Fermo restando che se ad esempio accendo un utilizzatore in CUCINA, il valore riportato dal relativo sensore è molto attendibile e gli altri rimarrebbero intorno ai 70 - 80 watt..

Ho fatto fin ora davvero tante prove per cercare di capire dove potrebbe essere il problema, nell'ultimo disperato tentativo, ho deciso di togliere completamente i sensori, e collegare direttamente il partitore di tensione ai pin A1 - A2 - A3 - A4 - A5!

nel codice in particolare ho:

 //Lettura dati dei sensori e calcolo della corrente assorbita e dei consumi in watt
  ampereTot = 0.00;
  ampereCucina = 0.00;
  ampereStanze = 0.00;
  ampereBagni = 0.00;
  numeroCampionamenti = 0;
  inizioCampionamenti = millis() ;
  do
  {
    numeroCampionamenti++;
    //offsetValue è la lettura senza carico quindi lo sottraiamo alle letture dei sensori
    offsetValue = analogRead(offsetPin);
    sensorTotValue = analogRead(sensorTotPin) - offsetValue;
    sensorCucinaValue = analogRead(sensorCucinaPin) - offsetValue;
    sensorStanzeValue = analogRead(sensorStanzePin) - offsetValue;
    sensorBagniValue = analogRead(sensorBagniPin) - offsetValue;
    //Alcune letture potrebbero avere valore negativo per cui noi consideriamo il valore assoluto
    sensorTotValue = abs(sensorTotValue);
    sensorCucinaValue = abs(sensorCucinaValue);
    sensorStanzeValue = abs(sensorStanzeValue);
    sensorBagniValue = abs(sensorBagniValue);
    ampereTot += sensorTotValue;
    ampereCucina += sensorCucinaValue;
    ampereStanze += sensorStanzeValue;
    ampereBagni += sensorBagniValue;
  }
  //20 sono i millisecondi che verranno campionati
  while ((millis() - inizioCampionamenti) < 20);
  //Per ottenere gli ampere reali moltiplichiamo la media di ampere letti nei 20ms per 0.166 che è il fattore di conversione calcolato con un carico noto
  ampereTot = (ampereTot / numeroCampionamenti) * fattoreConversione;
  ampereCucina = (ampereCucina / numeroCampionamenti) * fattoreConversione;
  ampereStanze = (ampereStanze / numeroCampionamenti) * fattoreConversione;
  ampereBagni = (ampereBagni / numeroCampionamenti) * fattoreConversione;
  //Infine moltiplichiamo gli ampere per la tensione stabilita per ottenere il consumo in Watt
  consumoTot = ampereTot * tensione;
  consumoCucina = ampereCucina * tensione;
  consumoStanze = ampereStanze * tensione;
  consumoBagni = ampereBagni * tensione;

Mi aspettavo (non dico degli 0 ma comunque dei valori molto vicini) e invece ho sempre quel maledetto "consumo fantasma" su ogni linea..

Ho letto su un altro topic del forum (si parlava di controllare la tensione di diverse batterie, ognuna collegata ad una porta analogica) qualcuno spiegava che a causa dell'alta impedenza delle porte analogiche, il sample-and-hold dell'ADC non permetteva una lettura corretta di valori possibilmente simili tra loro di diverse porte analogiche lette velocemente...

Ammesso che sia questo il mio problema, posso risolvere in qualche modo ???
In un altro topic ancora (si parlava di letture analogiche relative a sensori di temperatura) qualcuno consigliava di collegare ANCHE a massa la porta analogica (con una resistenza) in modo da avere letture più precise.. è fattibile/consigliabile nel mio caso ?

Allego per completezza, lo schema (seppur elementare) dell'attuale collegamento sperando possa aiutarVi ad aiutarMi :slight_smile: