Jouer Avec Thingspeak

Thingspeak est une alternative à cosm (maintenant xively). (http://www.yoctopuce.com/EN/article/cosm-alternatives-to-record-sensor-measurements)

Etape 1

Pour commencer à jouer avec thingspeak, créons un compte. Une fois effectué, on arrive directement dans le vif du sujet: la création de channel.

Les channel sont un regroupement de mesures (ex. : les mesures relatives a une plante, comme l’humidité, la lumière, la luminosité).

Le channel créé, nous devons créer une clef d’API en lecture. Pour cela, aller dans le channel → API Keys → Generate new API Key. La confirmation reçue, une suite de caractère va apparaitre. Il est recommandé de la noter dans un coin. Les clés sont spécifiques à chaque channel.

Il vous suffit maintenant de consulter la documentation disponible à cette adresse : http://community.thingspeak.com/documentation/api./

On y apprend que pour updater un channel vous devez avoir son numéro, la clef d’API et mettre des fields.

Une chose intéressante, c’est qu’il n’y a pas de timestamp. C’est le serveur qui met son timestamp.

Le numéro de channel se trouve dans l’URL du channel.

In [1]: import requests

In [2]: requests.post('https://api.thingspeak.com/update', data={"key":"DL2C0MIDB7QLV9T5", 'field1': 21.7})
Out[2]: <Response [200]>

In [3]: _.content
Out[3]: '1'

Si la réponse est 1, alors c’est gagné. Il est aussi intéressant de noter qu’aucune référence n’est à donner pour le numéro de channel.

Maintenant un peu de fun avec une plante verte. Alors, on récupère des mesures par port série (surement plus tard directement par le shield ethernet). Les mesures sont ensuite envoyées sur le net.

La mesure de température est faite avec un capteur DS18B20 et un capteur pour mesurer l’humidité de marque el cheapo (ex: http://www.ebay.fr/itm/The-soil-the-hygrometer-detection-module-soil-moisture-sensor-Arduino-UK-189-/350792782286?pt=UK_BOI_Electrical_Components_Supplies_ET&hash=item51ace111ce#ht_2433wt_1190 facilement trouvable moins cher)

Code arduino

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS A1
#define MOISTURE_SENSOR A0
#define TEMPERATURE_PRECISION 12

#define SMA_SIZE 5
#define INVALID_TEMP -274

// Used variables
float measures[SMA_SIZE]; // An array of measure
float measure = INVALID_TEMP; // a measure
unsigned char moisture = 0; 

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);


void setup(void)
{
  DeviceAddress tempDeviceAddress;
  // start serial port
  Serial.begin(9600);
  pinMode(MOISTURE_SENSOR, INPUT);  
  

  // Start up the library
  sensors.begin();
  
  sensors.getAddress(tempDeviceAddress, 0);
  sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
  
  for(int i; i < SMA_SIZE; i++){
     measures[i] = INVALID_TEMP; 
  }
}

void add_measure(float* array, int array_size, float value){
  int i;
  for(i=0; i<array_size-1; i++){
    array[i] = array[i+1]; 
  }
  array[i] = value;
}

// Do an SMA calculation on an array
float do_SMA(float* array, int array_size){
  int count = 0;
  int index = 0;
  float sum = 0;
  
  // Interate in the array and add up date
  for(index=0; index < array_size; index++){
    if(array[index] <= INVALID_TEMP)  // Skip over invalid temperature (-200 deg)
     continue;
    count++;
    sum += array[index];
  }
  // Prevent divide by zero
  if(count != 0){
    return sum/count;  // Do a meanu
  } else {
    return 0;
  } 
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  //Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  
  //Serial.print("Temperature for the device 1 (index 0) is: ");
  measure = sensors.getTempCByIndex(0);
  add_measure(measures, SMA_SIZE, measure);
  
  moisture = map(analogRead(MOISTURE_SENSOR), 0, 1023, 0, 100);
  
  
  Serial.print(do_SMA(measures, SMA_SIZE));
  Serial.print(":");
  Serial.println(moisture);
  delay(15000);
}

Code python

import requests
import serial

KEY = "DL2C0MIDB7QLV9T5" # Need change

ser = serial.Serial('/dev/ttyACM0', 9600, timeout=30)
ser.flushInput()  # clean the buffers

while True:
    line = ser.readline().strip()
    (temp, moisture) = line.split(":")
    print requests.post('https://api.thingspeak.com/update', data={"key": KEY, "field1": temp, "field2": moisture}).content