Go Down

Topic: Controllo e gestione carico casalingo con sistema di priorità ! (Read 9301 times) previous topic - next topic

Brunello

quello che volevo dirti e' che fino a che e' collegato all'USB, Arduino viene alimentato dall'USB ( se la tensione sul Vin <6.6V )

Al momento che scolleghi l'USB , con solo 5,08V sul Vin, probabilmente hai una tensione di poco superiore a 4V per alimentare Arduino

5a2v0

riporto quanto leggo dalla pagina guida di YUN

Quote
There is no built in 5V regulator. If you power your Yún with more than 5V, you will likely damage it. If you are not powering the Yún from the micro-USB connection, you can apply power to the VIN and 5V pins on the board. If using the VIN pin, you cannot provide more than 5V, it will damage your board. It is recommended to power the Yún from the USB connection whenever possible.


http://arduino.cc/en/Guide/ArduinoYun

Brunello


5a2v0

credo di aver sistemato  8) 8)
Dico credo perché ho fatto a distanza l'upload del nuovo sketch e attualmente il tutto è montato senza i sensori...

Visto che fare una sola (o una manciata: si ho provato anche a mettere 3 o 4 letture consecutive di ogni porta prima di leggere la seguente) letture a vuoto prima della lettura ritenuta affidabile non risolveva, ho provato in quest'altro modo:

Code: [Select]

//Lettura dati dei sensori e calcolo della corrente assorbita e dei consumi in watt
  sensorTotValue = 0;
  sensorCucinaValue = 0;
  sensorStanzeValue = 0;
  sensorBagniValue = 0;
  offsetValue = 0;
  //SENSORE BAGNI
  numeroCampionamenti = 0;
  inizioCampionamenti = millis() ;
  do
  {
    numeroCampionamenti++;
    sensorBagniValue += analogRead(sensorBagniPin);
  }
  //20 sono i millisecondi che verranno campionati per ogni sensore (tempo di ciclo della corrente elettrica alternata a 50 Hz utilizzata in Europa)
  while ((millis() - inizioCampionamenti) < 20);
  sensorBagniValue /= numeroCampionamenti;
  //SENSORE STANZE
  numeroCampionamenti = 0;
  inizioCampionamenti = millis() ;
  do
  {
    numeroCampionamenti++;
    sensorStanzeValue += analogRead(sensorStanzePin);
  }
  //20 sono i millisecondi che verranno campionati per ogni sensore (tempo di ciclo della corrente elettrica alternata a 50 Hz utilizzata in Europa)
  while ((millis() - inizioCampionamenti) < 20);
  sensorStanzeValue /= numeroCampionamenti;
  //SENSORE CUCINA
  numeroCampionamenti = 0;
  inizioCampionamenti = millis() ;
  do
  {
    numeroCampionamenti++;
    sensorCucinaValue += analogRead(sensorCucinaPin);
  }
  //20 sono i millisecondi che verranno campionati per ogni sensore (tempo di ciclo della corrente elettrica alternata a 50 Hz utilizzata in Europa)
  while ((millis() - inizioCampionamenti) < 20);
  sensorCucinaValue /= numeroCampionamenti;
  //SENSORE TOTALE
  numeroCampionamenti = 0;
  inizioCampionamenti = millis() ;
  do
  {
    numeroCampionamenti++;
    sensorTotValue += analogRead(sensorTotPin);
  }
  //20 sono i millisecondi che verranno campionati per ogni sensore (tempo di ciclo della corrente elettrica alternata a 50 Hz utilizzata in Europa)
  while ((millis() - inizioCampionamenti) < 20);
  sensorTotValue /= numeroCampionamenti;
  //OFFSET
  numeroCampionamenti = 0;
  inizioCampionamenti = millis() ;
  do
  {
    numeroCampionamenti++;
    //offsetValue è la lettura senza carico che poi sottraiamo alle letture dei sensori
    offsetValue += analogRead(offsetPin);
  }
  //20 sono i millisecondi che verranno campionati per ogni sensore
  while ((millis() - inizioCampionamenti) < 20);
  offsetValue /= numeroCampionamenti;
  sensorTotValue -= offsetValue;
  sensorCucinaValue -= offsetValue;
  sensorStanzeValue -= offsetValue;
  sensorBagniValue -= offsetValue;
  //Alcune differenze potrebbero avere valore negativo per cui noi consideriamo il valore assoluto
  sensorTotValue = abs(sensorTotValue);
  sensorCucinaValue = abs(sensorCucinaValue);
  sensorStanzeValue = abs(sensorStanzeValue);
  sensorBagniValue = abs(sensorBagniValue);
  //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 = sensorTotValue * fattoreConversione;
  ampereCucina = sensorCucinaValue * fattoreConversione;
  ampereStanze = sensorStanzeValue * fattoreConversione;
  ampereBagni = sensorBagniValue * 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;


e ho 0 watt in tutte e 4 le variabili:  consumoTot, consumoCucina, consumoStanze, consumoBagni.

Appena torno sul posto, provo a collegare i sensori per accertarmi che non ci siano errori  o altri problemi  :smiley-red:

5a2v0

Aggiornamento situazione:
ho collegato i sensori e provato a leggere i 4 valori .. non erano attendibili, avevo spesso 0 oppure 38 oppure 76 oppure maxxxx su quello del totale 114 !!

però seguono il consumo, infatti se accendo un utilizzatore in bagno (phon da circa 1800watt) il valore di quel sensore sale, il totale pure, gli altri no ---> OK!

Però ovviamente non riportano valori giusti... ho provato ad abbassare il tempo di campionamento per ogni sensore (su Uno campionavo in 20 ms sia l'unico sensore che l'offset)... ho messo 10ms (a testa)  e i sensori hanno iniziato a mostrare valori piu reali (2000watt per la cucina con forno acceso!) ma se aggiorno velocemente la pagina che mostra i valori, vedo che ho dei brevi intervalli che mostrano valori più bassi del normale.

esempio ancora con cucina con forno acceso:

2050 - 2100 - 2050 - 1200 - 2050 (sono dati di esempio eh !!)

come posso aggirare il nuovo problema ?

5a2v0

Ci tengo, mentre cerco ancora di risolvere il problema,  a pubblicare 4 fotine dell'app per android che è uscita fuori:


gateway74

perché hai utilizzato un contattore NO e non NC ?
Nella normale operatività sarebbe stato non alimentato (minor usura, minor consumo di corrente) 

pablos

perché hai utilizzato un contattore NO e non NC ?
Nella normale operatività sarebbe stato non alimentato (minor usura, minor consumo di corrente)
??... NO = contatto Normalmente Open e quindi non alimentato perciò minor consumo, tutti i contattori hanno i contatti NO e non sono deviati come i relay a bassa potenza, non esiste NO-C-NC nei contattori ... cosa vuoi dire?
no comment

gateway74



Quote
??... NO = contatto Normalmente Open e quindi non alimentato perciò minor consumo, tutti i contattori hanno i contatti NO e non sono deviati come i relay a bassa potenza, non esiste NO-C-NC nei contattori ... cosa vuoi dire?
NO non vuol dire non alimentato.. vuol dire che senza tensione il suo contatto è aperto.

esistono contattori NC cioè nella normalità chiudono il circuito e quindi senza essere alimentati.
quando sono eccitati aprono il circuito.

Nell'impianto di casa considerando la normalità, tutti i circuiti devono essere alimentati, quindi mi chiedevo: perchè utilizzare un contattore NO e  tenerlo alimentato per farlo diventare NC?

ecco un esempio


5a2v0

Scusa se rispondo solo adesso, ma avrò perso la notifica della discussione...Ho usato dei contattori "da eccitare" solo e soltanto perché nella mia città avevano solo questi...i normalmente chiusi li trovavo solo online e mi sarebbero costati il triplo...

Sono comunque in piena possibilità di "se li trovo al giusto prezzo" sostituire i contattori e collegarli diversamente alla scheda relè che uso per pilotarli.

5a2v0

Nuovo post per aggiornamento importante... oggi con qualche minuto di tempo libero ho preso ArduinoUNO e ho fatto delle prove per cercare di capire meglio il problema delle letture un po sfalsate e se possibile risolverlo..

Con il seguente sketch, che mantiene degli aspetti simili allo sketch utilizzato nel progetto vero e proprio anche se qui praticamente inutili (vedi il ciclo while che li serve per effettuare un TOT di letture e poi fare la media dei valori)
Code: [Select]
void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
}

void loop() {
  unsigned long prev = millis();
  long a = 0;
  long b = 0;
  while (millis() - prev <= 80) {
    a = analogRead(A0);
    b = analogRead(A1);
  }
  Serial.println(b);
}



avendo un cavetto che collega il pin dei 5v (o dei 3,3 o altra tensione) con A0 e un cavetto che collega A1 a GND, il valore stampato su seriale NON E' sempre 0 !! Perchè l'adc rimane influenzato dalla lettura precedente di A0 dove aveva appunto una certa tensione...nel caso dei 5v a me riportava ogni tanto qualche 1 o qualche 2 ma ho provato ad aggiungere altri valori su altre porte e leggere anche quelle per rendere quanto piu simile il tutto al mio caso ed effettivamente il tutto peggiora portando la lettura di A1 (ricordo essere collegato verso massa) a valori come 7 o 8 ecc..

Nel mio progetto, l'adc deve leggere: offset (tensione in uscita da un partitore di tensione) poi 4 porte analogiche diverse dove la tensione sarà quella dell'offset +o- quella del sensore... il tutto viene fatto un tot di volte entro un tot di millisecondi e poi viene fatta la media dei valori assoluti...in pratica dei valori anche di 7 o 8 letti al posto di uno zero, creano quel consumo fantasma che in realtà non c'è !!

Sempre su UNO ho provato allora quest'altro sketch:

Code: [Select]
void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
}

void loop() {
  unsigned long prev = millis();
  long a = 0;
  long b = 0;
  long c = 0;
  while (millis() - prev <= 80) {
    c = analogRead(A2);
    a = analogRead(A0);
    c = analogRead(A2);
    b = analogRead(A1);
  }
  Serial.println(b);
}


dove A2 è collegato a massa e la sua lettura non serve a null'altro che a far "scaricare" il condensatore sample&hold dell'adc cosi da leggere poi il valore "pulito" di A1... infatti provando mi legge sempre 0 fisso qualunque voltaggio io abbia su A0 !!!

Nel mio progetto attualmente ho in uso solo 5 delle 6 porte analogiche per cui ho pensato che al posto di:


Code: [Select]
do
  {
    numeroCampionamenti++;
    //offsetValue è la lettura senza carico quindi lo sottraiamo alle letture dei sensori
    offsetValue = analogRead(offsetPin);
    sensorStanzeValue = analogRead(sensorStanzePin);   
    sensorStanzeValue -= offsetValue;
    sensorBagniValue = analogRead(sensorBagniPin);
    sensorBagniValue -= offsetValue;
    sensorCucinaValue = analogRead(sensorCucinaPin);
    sensorCucinaValue -= offsetValue;
    sensorTotValue = analogRead(sensorTotPin);
    sensorTotValue -= offsetValue;
    //Alcune letture potrebbero avere valore negativo per cui noi consideriamo il valore assoluto
    ampereTot += abs(sensorTotValue);
    ampereCucina += abs(sensorCucinaValue);
    ampereStanze += abs(sensorStanzeValue);
    ampereBagni += abs(sensorBagniValue);
  }
  //20 sono i millisecondi che verranno campionati per ogni pin-analogico/sensore (tempo di ciclo della corrente elettrica alternata a 50 Hz utilizzata in Europa)
  while ((millis() - inizioCampionamenti) < 100);


dovrei collegare il pin analogico non utilizzato a GND e fare

Code: [Select]

do
  {
    numeroCampionamenti++;
    //offsetValue è la lettura senza carico quindi lo sottraiamo alle letture dei sensori
    int cleaner = analogRead(inutilizzato);
    offsetValue = analogRead(offsetPin);
    int cleaner = analogRead(inutilizzato);
    sensorStanzeValue = analogRead(sensorStanzePin);   
    sensorStanzeValue -= offsetValue;
    int cleaner = analogRead(inutilizzato);
    sensorBagniValue = analogRead(sensorBagniPin);
    sensorBagniValue -= offsetValue;
    int cleaner = analogRead(inutilizzato);
    sensorCucinaValue = analogRead(sensorCucinaPin);
    sensorCucinaValue -= offsetValue;
    int cleaner = analogRead(inutilizzato);
    sensorTotValue = analogRead(sensorTotPin);
    sensorTotValue -= offsetValue;
    //Alcune letture potrebbero avere valore negativo per cui noi consideriamo il valore assoluto
    ampereTot += abs(sensorTotValue);
    ampereCucina += abs(sensorCucinaValue);
    ampereStanze += abs(sensorStanzeValue);
    ampereBagni += abs(sensorBagniValue);
  }
  //20 sono i millisecondi che verranno campionati per ogni pin-analogico/sensore (tempo di ciclo della corrente elettrica alternata a 50 Hz utilizzata in Europa)
  while ((millis() - inizioCampionamenti) < 120);

Go Up