Oggi ho giocato un pò con il codice per inviare più dati su più datastream di pachube.
Per ogni datastream si possono mandare solo un dato alla volta: non si possono mandare contemporaneamente più dati da rappresentare su un solo grafo o più dati con un unica PUT.
Il modo più semplice per arginare tale problema è usare un algoritmo di scheduling Round Robin: inviare i dati a turno.
Esempio:
*stesso FEED
loop
PUT su DATASTREAM_1 del DATO_X
wait 12secondi
PUT su DATASTREAM_2 del DATO_Y
wait 12secondi
Il risultato è stato questo:
Codice:
/* Pachube sensor client This sketch connects an analog sensor to Pachube (http://www.pachube.com) with one feed and two datastreams using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or the Adafruit Ethernet shield, either one will work, as long as it's got a Wiznet Ethernet module on board. Circuit: * Analog sensors attached to analog in 2 and 3 * Ethernet shield attached to pins 10, 11, 12, 13 This code is in the public domain. UPDATE: *Using Pachube's V2 API *Analog sensor attached to analog in 2 and 3 *New pachube.com IP *Using one feed and two datastreams: first for analog 2 and second for analog 3 08/10/2011 by Andrea Esposito www.blackstufflabs.com */ #include <SPI.h> #include <Ethernet.h> // assign a MAC address for the ethernet controller. // fill in your address here: byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // assign an IP address for the controller: byte ip[] = { 192,168,1,20 }; byte gateway[] = { 192,168,1,1}; byte subnet[] = { 255, 255, 255, 0 }; // The address of the server you want to connect to (pachube.com): byte server[] = { 173,203,98,29 }; // initialize the library instance: Client client(server, 80); 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 = 12000; //delay between updates to Pachube.com short flag=0; void setup() { // start the ethernet connection and serial port: Ethernet.begin(mac, ip); Serial.begin(9600); // give the ethernet module time to boot up: delay(1000); } void loop() { //FEED number on your account settings //ex.: String FEED=37040; String FEED=YOUR_FEED_HERE; //ID_DATASTREAMS setted by you //ex.:String ID_STREAMING_1="1"; String ID_STREAMING_1="YOUR_FIRST_ID_STREAM_HERE"; String ID_STREAMING_2="YOUR_SECOND_ID_STREAM_HERE"; // voltage=5v but on my board is 4.91v float voltage=4.91; // read the analog sensor: //LM35 on A2 int sensorCelsius = analogRead(2); sensorCelsius = (voltage * sensorCelsius * 100.0)/1024.0; //LM335 on A3 int sensorKelvin = analogRead(3); sensorKelvin = (voltage * sensorKelvin * 100.0)/1024.0; //sensorKelving-=273.15; //if you want it in C° // 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)) { //Round Robin if (flag==0) //sending data to first datastream { sendData(sensorCelsius, FEED, ID_STREAMING_1); flag=1; Serial.print("ID_STREAMING_1 = "); Serial.println(ID_STREAMING_1); } else { //sending data to second datastream sendData(sensorKelvin, FEED, ID_STREAMING_2); flag=0; Serial.print("ID_STREAMING_2 = "); Serial.println(ID_STREAMING_2); } } // 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 , String myfeed , String myid) { //Your API_KEY on your account settings String API_KEY="YOUR_API_KEY_HERE"; // if there's a successful connection: if (client.connect()) { Serial.print("Temperature: "); Serial.println(thisData); Serial.println("connecting..."); // send the HTTP PUT request. // fill in your feed address here: // PUT /v2/feeds/<feed_id>/datastreams/<datastream_id> String myput="PUT /v2/feeds/"; myput+=myfeed; myput+="/datastreams/"; myput+=myid; myput+=" HTTP/1.1n"; Serial.println(myput); client.print(myput); client.print("Host: api.pachube.comn"); // fill in your Pachube API key here: client.print("X-PachubeApiKey: "); client.print(API_KEY); client.print("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/csvn"); client.println("Connection: closen"); // 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 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; }
Ciao, sto facendo prove con Pachube ed ho visto ora il tuo sketch.
Vorrei inviare i dati di 6 sensori, puoi darmi una info su come modificare il tuo codice ?
Ciao Valentino
Ciao,
Il progetto Pachube è mutato, sono cambiate un pò di cose e non so se lo sketch funzioni ancora.