Home
Accesso / Registrazione
 di 

due e più sensori verso Pachube

5 risposte [Ultimo post]
ritratto di Arrigo
Offline
Titolo: User+
Utente+
Ultima visita:
3 settimane 1 giorno fa
Utente dal: 09/12/2012
Messaggi: 40
Utente PREMIUM

Ciao a tutti,
da un pò sto arrancando sui sentieri dell'utilizzo di Arduino 2009.
Ora sono riuscito anche ad inviare i dati di un mio sensore a Pachube e farlo arrivare in forma grafica sul mio sito (www.fotoarrigo.com) dove ho creato una sezione solo per Arduino.
Lo sketch è scopiazzato seguendo i vari forum e funziona ma...
Ogni tanto se controllo su Pachube vedo che ho delle letture che mi danno NaN
Ho tentato di inserire il secondo sensore ma la mia ignoranza mi ha subito confinato nell'insuccesso.
Allego il listato sperando che qualcuno mi aiuti ad implementare il secondo, e perchè no, il terzo sensore.
Grazie, Arrigo
=========================================================================
questo funziona perfettamente e ho forzato io la connessione ogni circa 6-7 minuti
=========================================================================
/*
Pachube client --- 1 sensore
Questo programma collega un sensore SHT11 tramite Pachube (http://www.pachube.com)
Circuito:
* Sensore collegato pin 2 e 3
* sensore luminosità in A3
* Ethernet shield collegato ai piedini 10, 11, 12, 13
UPDATE:
* Utilizzando Pachube di API V2
* IP pachube.com
* Per il momento scrive solo la Temperatura
*/
#include
#include
#include
#include

// assegnare un indirizzo MAC per il controller ethernet.
// inserisci il tuo indirizzo qui:
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// assegnare un indirizzo IP per il controller:
byte ip[] = {192,168,3,175 };
byte gateway[] = {192,168,3,1};
byte subnet[] = {255, 255, 255, 0 };
// L'indirizzo del server a cui si desidera connettersi (pachube.com):
byte server[] = {173,203,98,29 };
// initializza l'istanza alla libreria:
Client client(server, 80);
// variabili
int a;
int luce;
float temp_c;
int humidity;
//=================================================
long lastConnectionTime = 0; // ultima volta che ci si è collegati al server, in millisecondi
boolean lastConnected = false; // stato della connessione l'ultima volta attraverso il ciclo principale
const int postingInterval =7000; // definisce l'intervallo di tempo tra gli aggiornamenti Pachube.com
// definizione per SHT11 - temperatura esterna
#define dataPin 2
#define clockPin 3
SHT1x sht1x(dataPin, clockPin);

void setup()
{
// start della connessione ethernet
Ethernet.begin(mac, ip);
// dare tempo al modulo ethernet di avviarsi:
delay(300);
}

void loop()
{
// start della connessione ethernet
Ethernet.begin(mac, ip);
// dare tempo al modulo ethernet di avviarsi:
delay(300);
//rilevazione tempertura con correzione valore costante
temp_c = (sht1x.readTemperatureC()+(-1));
delay(300);
// Se non c'è connessione di rete, ma c'era l'ultima volta
// Attraverso il ciclo, quindi arresto il client:
if (!client.connected() && lastConnected)
{
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
// Se non si è connessi, e "n" secondi sono passati da quando è avvenuta
// La tua ultima connessione, collegare di nuovo e inviare i dati:
if(!client.connected() && (millis() - lastConnectionTime > (postingInterval*1)))
{
sendData(temp_c);
delay(300);
}
//Memorizzare lo stato della connessione per la prossima volta che attraverso il ciclo
lastConnected = client.connected();

// for(a=1;a<10;a++){
// delay(5000);}
}

// Questo metodo effettua una connessione HTTP al server:
void sendData(int thisData) {
// se c'è una connessione:
if (client.connect()) {
Serial.print("Temperatura: ");
Serial.println(thisData);
Serial.println("connecting...");

// Invia la richiesta HTTP PUT.
// Inserisci qui il tuo codice Feed (es.57063) e l'ID relativo (es. 01)
client.print("PUT /v2/feeds/57063/datastreams/01 HTTP/1.1\n");
client.print("Host: api.pachube.com\n");
// Inserisci qui la tua Pachube API key
client.print("X-PachubeApiKey: DbpHB5lYctFpS478jEkw4XBn_saSAKxRTWFMeGN5amxQWT0g\n");
client.print("Content-Length: ");
// Calcola la lunghezza della lettura del sensore in byte:
int thisLength = getLength(thisData);
client.println(thisLength, DEC);
// ultima parte della richiesta HTTP PUT
client.print("Content-Type: text/csv\n");
client.println("Connection: close\n");
// questo è il contenuto effettivo della richiesta PUT:
client.println(thisData, DEC);
// rileva il tempo utilizzato per la connessione
lastConnectionTime = millis();
//=========================================================
// attivo la seriale per avere un controllo dei sensori
// lo scrivo solo quando invio i dati a Pachube
Serial.begin(38400);
humidity = sht1x.readHumidity();
luce= analogRead(A3);
Serial.begin(38400);
Serial.print("temperatura esterna ");
Serial.println(int(temp_c)) ;
Serial.print("Umidita' esterna ");
Serial.println(humidity);
Serial.print("Percentuale Luce ");
Serial.print (int(luce/10.3));
Serial.println(" %");
//chiudo la seriale
Serial.end();
//tempo imposto tra due trasmissioni di dati
for (a=1; a<41; a++){
delay (9000);}
//==========================================================
}
else
{
// se non posso instaurare la connessione:
Serial.println("connection failed");
}
}

/* Questo metodo calcola il numero di cifre del valore della lettura del Sensore.
Dal momento che ogni cifra del decimale ASCII è un byte, il numero di cifre
è pari al numero di byte:*/

int getLength(int someValue) {

// c'è almeno 1 byte
int digits = 1;

// Si divide sempre il valore per 10 aggiungendo 1 al conteggio delle cifre
// Si continua a dividere fino ad ottenere un risultato = 0

int dividend = someValue /10;
while (dividend > 0)
{
dividend = dividend /10;
digits++;
}
// restituisce il numero di digits:
return digits;
}

====================================================================
Questo è invece il maldestro tentativo per il 2° sensore
====================================================================
/*
Pachube sensore client
Questo programma collega un sensore SHT11 tramite Pachube (http://www.pachube.com)
Circuito:
* Sensore collegato pin 2 e 3
* Ethernet shield collegato ai piedini 10, 11, 12, 13
UPDATE:
* Utilizzando Pachube di API V2
* IP pachube.com
*/
#include
#include
#include
// assegnare un indirizzo MAC per il controller ethernet.
// inserisci il tuo indirizzo qui:
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// assegnare un indirizzo IP per il controller:
byte ip[] = {192,168,3,175 };
byte gateway[] = {192,168,3,1};
byte subnet[] = {255, 255, 255, 0 };
// L'indirizzo del server a cui si desidera connettersi (pachube.com):
byte server[] = {173,203,98,29 };
// initialize the library instance:
Client client(server, 80);
int sensorCelsius;
long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
boolean lastConnected = false; // state of the connection last time through the main loop
const int postingInterval =5000; //delay between updates to Pachube.com
// definizione per SHT11 - temperatura esterna
#define dataPin 2
#define clockPin 3
SHT1x sht1x(dataPin, clockPin);
void setup()
{
// start the ethernet connection and serial port:
Ethernet.begin(mac, ip);
Serial.begin(38400);
// give the ethernet module time to boot up:
delay(300);
}

void loop()
{
float temp_c;
int humidity;
temp_c = (sht1x.readTemperatureC()-2.5);
humidity = sht1x.readHumidity();
delay(300);
/* 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*1)))
{
sendData(temp_c);
delay(300);
sendDataH(humidity);
}
// 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(int thisData) {
// if there's a successful connection:
if (client.connect()) {
Serial.print("Temperatura: ");
Serial.println(thisData);
Serial.println("connecting...");
// send the HTTP PUT request. // fill in your feed address here
client.print("PUT /v2/feeds/57063/datastreams/01 HTTP/1.1\n");
client.print("Host: api.pachube.com\n");
// fill in your Pachube API key here:
client.print("X-PachubeApiKey: DbpHB5lYctFpS478jEkw4XBn_saSAKxRTWFMeGN5amxQWT0g\n");
client.print("Content-Length: ");
// calculate the length of the sensor reading in bytes:
int thisLength = getLength(thisData);
client.println(thisLength, DEC);
// last pieces of the HTTP PUT request:
client.print("Content-Type: text/csv\n");
client.println("Connection: close\n");
// here's the actual content of the PUT request:
client.println(thisData, DEC);
// note the time that the connection was made:
lastConnectionTime = millis();
}
else
{
// if you couldn't make a connection:
Serial.println("connection failed");
}
}
// this method makes a HTTP connection to the server:
void sendDataH(int thisDataH) {
// if there's a successful connection:
if (client.connect()) {
Serial.print("Umidita: ");
Serial.println(thisDataH);
Serial.println("connecting...");
// send the HTTP PUT request. // fill in your feed address here
client.print("PUT /v2/feeds/57109/datastreams/02 HTTP/1.1\n");
client.print("Host: api.pachube.com\n");
// fill in your Pachube API key here:
client.print("X-PachubeApiKey: oMKI3Zx6zW0M65im0y8fIVOLJCGSAKxFVmVFNmZWc01EWT0g\n");
client.print("Content-Length: ");
// calculate the length of the sensor reading in bytes:
int thisLength = getLength(thisDataH);
client.println(thisLength, DEC);
// last pieces of the HTTP PUT request:
client.print("Content-Type: text/csv\n");
client.println("Connection: close\n");
// here's the actual content of the PUT request:
client.println(thisDataH, DEC);
// note the time that the connection was made:
lastConnectionTime = millis();
}
else
{
// if you couldn't make a connection:
Serial.println("connection failed");
}
}
// 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;
}

ritratto di Piero Boccadoro
Offline
Titolo: Moderator
Moderatore
Ultima visita:
1 settimana 4 giorni fa
Utente dal: 28/06/2011
Messaggi: 868
Utente PREMIUM
Scusami, forse sono davvero

Scusami, forse sono davvero cieco, ma non è che ho capito dove hai collegato il secondo sensore...

ritratto di Arrigo
Offline
Titolo: User+
Utente+
Ultima visita:
3 settimane 1 giorno fa
Utente dal: 09/12/2012
Messaggi: 40
Utente PREMIUM
Hai ragione, in effetti non

Hai ragione, in effetti non ho specificato che il sensore è unico e trasmette i due valori usando solo due pin.
Se tu avessi la libreria dello STH11 forse serabbe per te più semplice capire il tutto, per me è ancora ostica la cosa.
Praticamente invia la stringa valore temperatura e umidità collegati alla variabile temp_c e humidity ; il terzo sensore verrà collegato ad un analog perchè è in pratica una fotoresistenza per la lettura della luminosità.
Saluti,Arrigo

ritratto di Piero Boccadoro
Offline
Titolo: Moderator
Moderatore
Ultima visita:
1 settimana 4 giorni fa
Utente dal: 28/06/2011
Messaggi: 868
Utente PREMIUM
Ho cercato in giro per la

Ho cercato in giro per la rete ma ci son tanti integrati "sth11"*...
Puoi mandarmi un link alla tua libreria ed al tuo datasheet?
Per caso è questo della sensiron?
http://uk.farnell.com/sensirion/sht11/sensor-humidity-temp-v4/dp/1590511

Detto ciò, io ho visto che la lettura la fai qui:
temp_c = (sht1x.readTemperatureC()-2.5);
humidity = sht1x.readHumidity();
è giusto?

Ad ogni modo un NaN mi fà pensare più ad un errore nella lettura fatta dal sensore che ad altro...
Che dice il datasheet a proposito? Ci son casi in cui restituisce un NaN? Se la lettura non va a buon fine cosa leggi come valore predefinito, 0 oppure NaN?

Comuqnue scusami ancora ma non ho capito.. Tu hai letto i valori...
Bene.
E adesso?
Cioè, non c'è una funzione read in libreria che permetta di accedere ai valori?
E se si, non puoi scrivere qualcosa del tipo
a=read(valore nel registro della seconda misura) ?

Dettagli,please :D

ritratto di Arrigo
Offline
Titolo: User+
Utente+
Ultima visita:
3 settimane 1 giorno fa
Utente dal: 09/12/2012
Messaggi: 40
Utente PREMIUM
Si è proprio quello e

Si è proprio quello e Sensirion ha rilasciato la libreria per Arduino.
Io leggo i vari valori dove correttamente hai rilevato e inizializzando la seriale li scrivo normalmente sul mio pc.
Non riesco invece a inviarli entrambi al sito di Pachube; la prima misura parte normalmente, viene ricevuta (tranne quando per qualche motivo, forse un disturbo scrive NaN = non ho capito)la seconda riguardando il listato non è inserita correttamente perchè la prima fa ricorso al "void SendData" ma la seconda mi sembra non possa farlo , non conosco bene il C e a differenza di altri linguaggi dove le Sub aiutavano qui non so districarmi, forse bisogna chiudere la connessione e riaprire per il secondo valore?
come posso impostare la seconda parte del listato?
Saluti, Arrigo

ritratto di Piero Boccadoro
Offline
Titolo: Moderator
Moderatore
Ultima visita:
1 settimana 4 giorni fa
Utente dal: 28/06/2011
Messaggi: 868
Utente PREMIUM
Curiosità: ma la libreria

Curiosità: ma la libreria l'hai presa da qui, per caso?
https://github.com/practicalarduino/SHT1x

Onestamente non saprei quel NaN a cosa potrebbe essere dovuto... IL sensore ha un tempo di intervallo tra una misura e l'altra di almeno 11 ms ma non credo che tu lo interroghi così spesso...

Onestamente non saprei darti una risposta alla tua domanda ma certamente puoi provare a chiudere la connessione ed a riavviarla, specie se i dati li vedi almeno su seriale...

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 0 utenti e 32 visitatori collegati.

Ultimi Commenti