Pages: [1] 2 3 ... 5   Go Down
Author Topic: Domanda su Pachube/Cosm  (Read 2747 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti,

volevo chiedervi se sapreste a cosa è dovuta la visualizzazione del valore 0 nel grafico che trovate nel Link sottostante.

In pratica sarebbe il Valore della Potenza misurata in casa mia.

Ho utilizzato lo sketch messo a disposizione da COSM e nel Loop ho inserito il mio Sketch.

Se qualcuno saprebbe darmi una dritta ecco il link del grafico --> https://api.cosm.com/v2/feeds/70979/datastreams/A_MaxPower.png?width=730&height=250&colour=%23f15a24&duration=5minutes&show_axis_labels=true&detailed_grid=true&scale=manual&min=0&max=300&timezone=Bern

Saluti
Remo
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 930
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova a fornirci il sorgente, perché così è un po' difficile capire il motivo.

Probabilmente la variabile che usi per spedire l'informazione viene azzerata da qualche parte nel tuo loop.

Ettore Massimo Albani
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Cyberths,
lo sketch ha come base quello fornito da Cosm, nel loop ho inserito il mio Sketch (o meglio diversi sketch presi dalla rete, una brodaglia insomma).
Se non creo troppo stress posto qui sotto il codice....
Secondo me Cosm dovrebbe farmi vedere una segnale lineare e non con sbalzi da 0 a x, lo sketch si collega ogni 10 secondi a Cosm, mentre lo sketch stesso misura 5000 volte prima di passare il tutto a Cosm (almeno credo).
Ho tagliato la prima parte dello sketch altrimenti nn potevo postarlo tutto

Saluti Remo
------------------------------Snip--------------------------------------------




void setup() {
  // start serial port:
  Serial.begin(115200);
   analogReference (EXTERNAL);
 // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // DHCP failed, so use a fixed IP address:
    Ethernet.begin(mac, ip);
  }
}

void loop() {
  
 analogReference (EXTERNAL);
  

  // massimo delle sinus positive
analogReference (EXTERNAL);

  ValA0 = analogRead(A0) ;
  ValA1 = analogRead(A1) ;
  ValA2 = analogRead(A2) ;
  
  


  
  Vpartitore = analogRead(A3);
  
  // record the maximum sensor value
  if (ValA0 > sensorMax1) {
    sensorMax1 = ValA0;
  }

  // record the minimum sensor value
  if (ValA0 < sensorMin1) {
    sensorMin1 = ValA0;
  }
  
  // record the maximum sensor value
  if (ValA1 > sensorMax2) {
    sensorMax2 = ValA1;
  }

  // record the minimum sensor value
  if (ValA1 < sensorMin2) {
    sensorMin2 = ValA1;
  }
  
  // record the maximum sensor value
  if (ValA2 > sensorMax3) {
    sensorMax3 = ValA2;
  }

  // record the minimum sensor value
  if (ValA2 < sensorMin3) {
    sensorMin3 = ValA2;
  }


 // Serial.println(ValA0);
 

 
  

//  if (ValA0 < 510.72 ){ValA0 = 512 + (510.72 - ValA0); }
//  if (ValA1 < 510.72 ){ValA1 = 512 + (510.72 - ValA1); }
//  if (ValA2 < 510.72 ){ValA2 = 512 + (510.72 - ValA2); }

 


  L1 = L1 + sensorMax1 ;
  L2 = L2 + sensorMax2 ;
  L3 = L3 + sensorMax3 ;
  
  


   Cicli++ ;


  // VIENE FATTA LA MEDIA SU 5000 Letture  



  if (Cicli == 5000){

 

    L1 = (L1 / 5000.000)-510.000 ;
    L2 = (L2 / 5000.000)-510.000 ;
    L3 = (L3 / 5000.000)-510.000 ;
  
    Serial.println(L1,4);
        Serial.println(L2,4);
    Serial.println(L3,4);

    
    Vpartitore = analogRead(A3)*0.0032265625;
    
    

    Voltaggio1  = (((L1 * 0.0032265625)-0));
    Voltaggio2  = (((L2 * 0.0032265625)-0));
    Voltaggio3  = (((L3 * 0.0032265625)-0));
    
    Corrente1 =  sqrt(((Voltaggio1*30)/3.3)*0.9);
    Corrente2 =  sqrt(((Voltaggio2*30)/3.3)*0.9);
    Corrente3 =  sqrt(((Voltaggio3*30)/3.3)*0.9);
    
    Potenza1 = Corrente1*240*0.9;
    Potenza2 = Corrente2*240*0.9;
    Potenza3 = Corrente3*240*0.9;
    Ptot = (Potenza1+Potenza2+Potenza3);
    
    Vpartitore = analogRead(A3)*0.0032265625;
    
    Serial.println();
    Serial.print( " Voltaggio 1 --> ");
    Serial.print(Voltaggio1,4);
    Serial.print( "               Ampere --> ");
    Serial.print(Corrente1,4);
    Serial.print( "               Potenza --> ");
    Serial.println(Potenza1,4);
    
    Serial.print( " Voltaggio 2 --> ");
    Serial.print(Voltaggio2,4);
    Serial.print( "               Ampere --> ");
    Serial.print(Corrente2,4);
    Serial.print( "               Potenza --> ");
    Serial.print(Potenza2,4);
    Serial.print( "               Potenta Totale --> ");
    Serial.println(Ptot,4);
    
    
    Serial.print( " Voltaggio 3 --> ");
    Serial.print(Voltaggio3,4);
    Serial.print( "               Ampere --> ");
    Serial.print(Corrente3,4);
    Serial.print( "               Potenza --> ");
    Serial.println(Potenza3,4);
    Serial.println();
    Serial.print( "                           Tensione sul Partitore --> ");
    Serial.println(Vpartitore,4);


    L1 = 0 ;
    L2 = 0 ;
    L3 = 0 ;
    sensorMax1 = 0;
    sensorMax2 = 0;
    sensorMax3 = 0;
    sensorMin1 = 0;
    sensorMin2 = 0;
    sensorMin3 = 0;
    
    


    Cicli = 0 ;}
 
  
 
  // if there's incoming data from the net connection.
  // send it out the serial port.  This is for debugging
  // purposes only:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if there's no net connection, but there was one last time
  // through the loop, then stop the client:
  if (!client.connected() && lastConnected) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }

  // if you're not connected, and ten seconds have passed since
  // your last connection, then connect again and send data:
  if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
    sendData(Ptot,Potenza1,Potenza2,Potenza3);
  }
  // store the state of the connection for next time through
  // the loop:
  lastConnected = client.connected();
}

// this method makes a HTTP connection to the server:
void sendData(float thisData,float thisData1,float thisData2,float thisData3) {
  // if there's a successful connection:
  if (client.connect(server, 80)) {
    Serial.println("connecting...");
    // send the HTTP PUT request:
    client.print("PUT /v2/feeds/");
    client.print(FEEDID);
    client.println(".csv HTTP/1.1");
    client.println("Host: api.cosm.com");
    client.print("X-ApiKey: ");
    client.println(APIKEY);
    client.print("User-Agent: ");
    client.println(USERAGENT);
    client.print("Content-Length: ");

    // calculate the length of the sensor reading in bytes:
    // 8 bytes for "sensor1," + number of digits of the data:
    int thisLength = 8 + getLength(thisData);
    client.println(thisLength);

    // last pieces of the HTTP PUT request:
    client.println("Content-Type: text/csv");
    client.println("Connection: close");
    client.println();

    // here's the actual content of the PUT request:
    client.print("A_MaxPower,");
    client.println(thisData);
    client.print("B_Power_L1,");
    client.println(thisData1);
    client.print("C_Power_L2,");
    client.println(thisData2);
    client.print("D_Power_L3,");
    client.println(thisData3);
    
  
  
  }
  else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }
   // note the time that the connection was made or attempted:
  lastConnectionTime = millis();
}


// This method calculates the number of digits in the
// sensor reading.  Since each digit of the ASCII decimal
// representation is a byte, the number of digits equals
// the number of bytes:

int getLength(int someValue) {
  // there's at least one byte:
  int digits = 1;
  // continually divide the value by ten,
  // adding one to the digit count for each
  // time you divide, until you're at 0:
  int dividend = someValue /10;
  while (dividend > 0) {
    dividend = dividend /10;
    digits++;
  }
  // return the number of digits:
  return digits;
}
--------------snip-----------------------------
Logged

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 7
Posts: 2247
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

i sorgenti postali dentro i tag [code ] e [/ code] (sensa spazi), li trovi cliccando l'icona # nell'editor dei messaggi
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 930
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non hai inserito le dichiarazioni delle variabili, comunque credo di aver capito dov'è il problema.
La precisione delle variabili Float è di 5/6 digit complessivi, come recita la guida:
Quote
...
Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point.
...
Questo vuol dire che se inserisci 0.0032265625 in realtà hai inserito 0.00323 (troncamento ed arrotondamento).
Se a questo aggiungi che durante i calcoli i valori possono diventare molto piccoli, ecco una possibile risposta al tuo problema.
Ti conviene lavorare con i numeri interi e solo alla fine effettuare il calcolo float (o double che per Arduino è la stessa cosa).
Qualche altro consiglio:
1 - inserisci l'struzione analogreference nel setup e non nel loop;
2 - riduci il ciclo allo stretto indispensabile per ridurre il solo "rumore" (basta un ciclo di una decina di letture), ma ricordati di distanziare nel tempo ciascuna istruzione analogread tramite un delayMicroseconds(100);
3 - per effettuare la conversione da int, anzi unsigned int (0-1023) puoi usare la comoda istruzione map().
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie Cyberhs,
provero ad attuare i tuoi consigli.

Saluti

Remo
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho provato il consiglio di cyber ma il risultato rimane invariato, ogni tanto ho dei valori "0" nonostante il segnale sia continuo.

Esistono altenrative a COSM ? Che offrono servizi del genere ?


Saluti

Remo
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 930
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Posta il codice completo, per favore.

Non so se esista un'alternativa a COSM.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eccolo il Codice, non fare caso al subbuglio.

Saluti
Remo

* Pachube_Ok_A07.ino (7.99 KB - downloaded 2 times.)
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 930
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi puoi mandare lo schema del collegamento tra le sonde di corrente ed Arduino?

Spiegami questi passaggi:
Code:
    Corrente1 = (sensorMax1 - 510) * 0.00323;
    Corrente1 = sqrt(Corrente1);
    Corrente1 = (Corrente1 * 30) / 3.3;
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Cyberhs,

come accennato nei precedenti post, queste sono formule di sola prova, queste che chiedi tu sono le formule per il calcolo della corrente.

sensorMax : Lettura massima rilevata su 5000 letture
510 : il valore del mio partitore che ammonta a 1.645 Volt (ho settato arduino con un Aref di 3.3 Volt esterni)

Sulla prima linea calcolo la tensione effettiva.
sulla seconda linea la Radice della prima
sulla terza faccio una proporzione del mio sensore di corrente : il mio sensore ha queste proprietà 0--30A in entrata (Ac) e in uscita 0..1 Volt Ac.
Allora ho usato la proporzione : 30A : 3.3v = x : voltaggio letto

So che non è la via giusta, ma ci sto lavorando.

Per quanto riguarda lo schema non esiste disegno, in pratica un polo del sensore viene alimentato direttamente dal partitore (1.645v) mentre l'altro polo entra direttamente sull'arduino.
Avro cosi un'offset di ca. 1.65V --> punto "0"---> e da li vado a ricavarmi i massimi valori di lettura.

I sensori sono del tipo Hall.

Saluti
Remo
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 930
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Comincia a mettere mano al saldatore perché se vuoi precisione nella misura devi farti un circuito raddrizzatore.

Lo schema che ti posto usa un operazionale come raddrizzatore ideale ad una semionda e fornisce in uscita una tensione max di 3.3 Vp, ideale per una Aref di 3.3V, così non perdi neanche un bit di precisione.

Nota che ho usato un LM324 a 14 pin perché così con un solo IC puoi assemblare i tre raddrizzatori che ti sono necessari (il quarto è in più). Se non hai dimestichezza con i circuiti stampato o con la millefori ti posso preparare un layout (tempo permettendo).

Poi affronteremo il problema del software che, vedrai, sarà notevolmente più semplice.

* Raddrizzatore Ideale.emf (23.84 KB - downloaded 4 times.)
* Raddrizzatore Ideale.wmf (11.8 KB - downloaded 6 times.)
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buongiorno,
grazie dei file, se gentilmente potresti convertirli in PDF te ne sarei grato, non riesco ad aprirli.

Io ho comunque già provato con degli operazionali, appunto LM324 (vedi allegato), ma il risultato non è stato soddisfacente.
Usai questi Opamp in modalità non invertente, come vedi dalla foto ho usato una R ed un potenziometro per regolarne l'uscita a 3,3V.

Non so come sia concepito il tuo schema, gli daro un'occhiata non appena mi manderai una versione PDF.

Intanto grazie

Saluti
Remo


* 20120828_063416.jpg (2838.41 KB, 3264x2448 - viewed 10 times.)
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sono riuscito ad aprire il tuo schema, a parte i 2 diodi, ho fatto la stessa cosa.

Potresti spiegarmene il motivo dei diodi ?

Avevo escluso questa possibilità poiché il segnale in uscita risultava molto disturbato.

Per la calibrazione del mio print ho utilizzazo un generatore di frequenza, impostato a 2V e 50 Hz, regolandone l'uscita a 3,3 Volt.

Saluti
Remo
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 930
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

I due diodi servono a filtrare l'onda in ingresso: quello in serie alla resistenza determina quale semionda amplificare, mentre l'altro blocca l'altra.
L'amplificazione, essendo invertente, è determinata dal rapporto R2/R1 ed essendo l'alimentazione a 5V (prelevata da Arduino) non può superare il valore 3,5 per evitare il clipping.
I calcoli devono tener conto della caduta di tensione dei diodi, quindi ho scelto A = 2,7 che sommata alla caduta di tensione 0,7 fornisce circa 3,4. Naturalmente bisogna tarare il circuito inserendo un trimmer da 10k in serie con la resistenza d'ingresso in modo da ottenere esattamente i 3,3V con un ingresso di 1 Vp.
Importante: un condensatore da 100n in parallelo e più vicino possibile al pin di alimentazione del IC e cortocircuitare ingresso ed uscita del 4° operazionale non utilizzato (vedi schema allegato).


* Raddrizzatore 3 fasi.jpg (76.9 KB, 1567x1072 - viewed 7 times.)
« Last Edit: August 28, 2012, 04:46:41 am by cyberhs » Logged

Pages: [1] 2 3 ... 5   Go Up
Jump to: