Cestpasidiot : Différence entre versions

De fablabo
Aller à : navigation, rechercher
(/* récepteur avec DHT simplifié à l'extrême)
(récepteur pour capteur DHT + luxmètre : + détecteur de mouvement)
 
(9 révisions intermédiaires par le même utilisateur non affichées)
Ligne 45 : Ligne 45 :
 
Le dispositif sera présenté dans le cadre de ces deux évènements :
 
Le dispositif sera présenté dans le cadre de ces deux évènements :
  
* Le FESTIVAL D les 26 et 27 septembre* (encadrement Laurent Neyssensas & Arnaud LE ROI)
+
* Le FESTIVAL D les 26 et 27 septembre* (encadrement Laurent Neyssensas)
  
 
* Le Boot camp design Make de l’IRT JV le jeudi 8 octobre* (encadrement Laurent Neyssensas)
 
* Le Boot camp design Make de l’IRT JV le jeudi 8 octobre* (encadrement Laurent Neyssensas)
Ligne 76 : Ligne 76 :
 
=== Liste et plage de valeurs des données radio émises ===
 
=== Liste et plage de valeurs des données radio émises ===
  
Température ambiante (°C) = float 0-99,99
+
Déjà implémentés
Degré d'humidité  ambiante = float 0-99,99
 
Lumière ambiante (lux) = int 0-9999
 
Bloc de 4 interrupteurs capacitifs = boolean 0 ou 1
 
Capteur de pollution aérienne (fumée) = float 0-99,99 (après étalonnage)
 
télémètre à ultrason (distance en cm) = entier 0-9999 (valeur théorique, de 20 à 120cm dans les faits)
 
  
D'autres capteurs peuvent être ajoutés à la demande, on peut ainsi capter des données environnementales en ligne et les insérer dans notre flux. Ex: http://www.airpl.org/Air-exterieur/mesures-en-direct vs https://air.plumelabs.com/Nantes
+
* Température ambiante (°C) = float 0-99,99
 +
* Degré d'humidité  ambiante = float 0-99,99
 +
* Lumière ambiante (lux) = int 0-9999
 +
 
 +
Pas encore implémentés:
 +
 
 +
* Bloc de 4 interrupteurs capacitifs = boolean 0 ou 1
 +
* Capteur de pollution aérienne (fumée) = float 0-99,99 (après étalonnage)
 +
* télémètre à ultrason (distance en cm) = entier 0-9999 (valeur théorique, de 20 à 120cm dans les faits)
 +
 
 +
D'autres capteurs peuvent être ajoutés à la demande. On peut également envisager de capter des données environnementales en ligne et les insérer dans notre flux. Ex: http://www.airpl.org/Air-exterieur/mesures-en-direct vs https://air.plumelabs.com/Nantes
  
 
===Liste des composants fournis ===
 
===Liste des composants fournis ===
Ligne 217 : Ligne 222 :
 
Utilisation de la librairie [https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library NeoPixel].  
 
Utilisation de la librairie [https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library NeoPixel].  
 
Exemple en français sur le site de [http://mchobby.be/wiki/index.php?title=NeoPixel-UserGuide McHobby.be]
 
Exemple en français sur le site de [http://mchobby.be/wiki/index.php?title=NeoPixel-UserGuide McHobby.be]
 +
 +
* Ajouter un condensateur 1000uF en parallèle  entre le pôle - et le pole +
 +
* Ajouter une résistance 470Ohm (jaune violetmarron) en série sur la ligne + (fil rouge)
  
 
==assemblage de code fonctionnel==
 
==assemblage de code fonctionnel==
  
===récepteur pour capteur DHT seul===
+
=== émetteur pour capteur DHT + luxmètre + télémètre ===
 +
<pre>
 +
#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
 +
#include "DHT.h"
 +
#include<stdlib.h>
 +
#include <Wire.h>
 +
#include <Adafruit_Sensor.h>
 +
#include <Adafruit_TSL2561_U.h>
 +
#include <NewPing.h> // pour le télémètre DYP-ME007
 +
 
 +
// les broches et paramètre du télémètre
 +
#define TRIGGER_PIN  12  // broche reliée au trigger du télémètre.
 +
#define ECHO_PIN    11  // broche reliée à l'echo du télémètre.
 +
#define MAX_DISTANCE 99 // distance maximale évaluée (en centimeters).
 +
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
 +
 
 +
 
 +
// les broches des capteurs
 +
#define SENSDHTPIN 4 // la broche dédiée au capteur de température & hygrométrie de l'air
 +
#define DHTTYPE DHT22  // DHT 22  (AM2302) le modèle du capteur
 +
DHT dht(SENSDHTPIN, DHTTYPE);
 +
 
 +
// les capteurs I2C sont branchés en série
 +
// attention au 3,3V vs 5v
 +
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);
 +
   
 +
////////////////////////////////////////////////
 +
 
 +
//message à envoyer.
 +
char msg[40];
 +
 
 +
// ses élements : les valeurs des capteurs
 +
float tempValue=2000;      // variable de température
 +
float humidityValue=6000;      // variable % hygrométrie de l'air
 +
unsigned int luxValue=48;
 +
unsigned int distanceValue=10;
 +
// unsigned int sensLight = 0 ; // variable dédiée au niveau lumièe en lux
 +
// unsigned int sensProx = 0 ; // variable de distance
 +
//    unsigned int sensBend = 0; // variable du capteur de flexion
 +
// unsigned int sensSwitch = 0; //  l'interrupteur
 +
 
 +
/////////////////////////////////////////////////////////////
 +
 
 +
    // les variables temporelles
 +
    unsigned long latestSendingMillis =  millis(); // mémorise la dernière fois qu'on a envoyé les valeurs
 +
    unsigned long latestSensingMillis =  millis(); // mémorise la dernière fois qu'on a interogé les capteurs
 +
    unsigned long latestDHTSensingMillis = millis(); //  la dernière fois qu'on a interogé le capteur temp+hygro
 +
    unsigned long i2cSensingIntervalMillis =  1000; // intervalle de temps avant une nouvelle interrogation des capteurs
 +
    unsigned long sensingDHTIntervalMillis = 2500; // intervalle de temps avant nouvelle interrogation capteur DHT
 +
    unsigned long sendingIntervalMillis = 1000; // intervalle de temps avant nouvel envoi de valeurs
 +
    unsigned long time;
 +
 
 +
/////////////////////////////////////////////////////////////
 +
 
 +
void setup()
 +
{
 +
  Serial.begin(9600);
 +
  // la communication radio
 +
  vw_setup(2000);                // Bits par seconde (2000 = bonne portée. Si augmente, portée diminue
 +
  vw_set_tx_pin(3);            // La broche 3 pour transmettre la DATA
 +
  // on lance le capteur de temp + hygro
 +
  Serial.println("DHTxx test!");
 +
  dht.begin();
 +
 
 +
  Serial.println("Light Sensor Test"); Serial.println("");
 +
  /* Initialise le capteur TSL2561 */
 +
  if(!tsl.begin())
 +
  {
 +
    /* There was a problem detecting the ADXL345 ... check your connections */
 +
    Serial.print("Ooops, no TSL2561 detected ... Check your wiring or I2C ADDR!");
 +
    while(1);
 +
  }
 +
  /* Display some basic information on this sensor */
 +
  displaySensorDetails();
 +
  /* Setup the sensor gain and integration time */
 +
  configureSensor();
 +
  Serial.println("");
 +
}
 +
 
 +
////////////////////////// le loooooooop ///////////////////////////////////////
 +
 
 +
 
 +
void loop()
 +
{
 +
    time = millis();
 +
    getTemp(time); // temp & humidité
 +
    getLux(time);
 +
    //getMsgContent(time); //on l'imprime
 +
    getDistance(time);
 +
    sendMsg(time); // on doit assembler les valeurs en tableau de char
 +
}
 +
 
 +
////////////////////////// les fonctions ///////////////////////////////////////
 +
 
 +
void getLux(long time)
 +
{
 +
  if (time - latestSensingMillis >  i2cSensingIntervalMillis){
 +
    //Serial.println("getting Lux value..");
 +
    sensors_event_t event;
 +
    tsl.getEvent(&event);
 +
    if (event.light)
 +
  {
 +
    luxValue=event.light;
 +
    // Serial.print(luxValue); Serial.println(" luxValue");
 +
 
 +
  }
 +
  else
 +
  {
 +
    /* If event.light = 0 lux the sensor is probably saturated
 +
      and no reliable data could be generated! */
 +
    Serial.println("Lux Sensor overload");
 +
  }
 +
    latestSensingMillis = time;
 +
    return;
 +
    }
 +
}
 +
 
 +
void getDistance(long time)
 +
{
 +
  if (time - latestDHTSensingMillis >  i2cSensingIntervalMillis){
 +
  unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
 +
  if ((uS / US_ROUNDTRIP_CM)>10){  // pour filtrer les valeurs < à 10 et ne pas décaler le registre d'envoi
 +
  distanceValue=(uS / US_ROUNDTRIP_CM);
 +
  };
 +
    return;
 +
    }
 +
}
 +
 
 +
void getTemp(long time)
 +
{
 +
  if (time - latestSensingMillis >  sensingDHTIntervalMillis){
 +
    //Serial.println("get");
 +
    tempValue = dht.readTemperature();
 +
    humidityValue = dht.readHumidity();
 +
    if (isnan(tempValue) || isnan(humidityValue))
 +
        Serial.println("capteur DHT injoignable!");
 +
    latestDHTSensingMillis = time;
 +
    return;
 +
    }
 +
}
 +
 
 +
 
 +
void sendMsg(long time)
 +
{
 +
  int i=0;
 +
  if (time - latestSendingMillis >  sendingIntervalMillis){
 +
    msg[0]=(buildMyValue(tempValue))[0];
 +
    msg[1]=(buildMyValue(tempValue))[1]; // ne marche que pour temp >= 10°C
 +
    msg[2]=(buildMyValue(humidityValue))[0];
 +
    msg[3]=(buildMyValue(humidityValue))[1]; // ne marche que pour humidité >= 10%
 +
    msg[4]=(buildMyValue(luxValue))[0];
 +
    msg[5]=(buildMyValue(luxValue))[1]; // ne marche que pour lux >= 10 et < 100
 +
    msg[6]=(buildMyValue(distanceValue))[0];
 +
    msg[7]=(buildMyValue(distanceValue))[1]; // ne marche que pour lux >= 10 et < 100
 +
    msg[8]='\0';
 +
    for (i = 0; i < strlen(msg); i++)
 +
{
 +
    Serial.print(msg[i], HEX);
 +
    Serial.print(' ');
 +
}
 +
    Serial.println();
 +
    vw_send((uint8_t *)msg, strlen(msg));
 +
    vw_wait_tx();              // On attend la fin de l'envoi du msg.
 +
    latestSendingMillis = time;
 +
    //delay(25);
 +
  }
 +
}
 +
 
 +
char *buildMyValue(float value)
 +
{
 +
  char buffer[40];
 +
  itoa(value, buffer, 10);
 +
  return buffer;
 +
}
 +
 
 +
//============== fonctions du capteur de luminosité TSL2561 ===================================
 +
 
 +
 
 +
// ============= by ADAFRUIT ==============
 +
 
 +
void displaySensorDetails(void)
 +
{
 +
  sensor_t sensor;
 +
  tsl.getSensor(&sensor);
 +
  Serial.println("------------------------------------");
 +
  Serial.print  ("Sensor:      "); Serial.println(sensor.name);
 +
  Serial.print  ("Driver Ver:  "); Serial.println(sensor.version);
 +
  Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
 +
  Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" lux");
 +
  Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" lux");
 +
  Serial.print  ("Resolution:  "); Serial.print(sensor.resolution); Serial.println(" lux"); 
 +
  Serial.println("------------------------------------");
 +
  Serial.println("");
 +
  delay(500);
 +
}
  
<pre>
+
/**************************************************************************/
// This is a demonstration on how to use an input device to trigger changes on your neo pixels.
+
/*
// You should wire a momentary push button to connect from ground to a digital IO pinWhen you
+
    Configures the gain and integration time for the TSL2561
// press the button it will change to a new pixel animationNote that you need to press the
+
*/
// button once to start the first animation!
+
/**************************************************************************/
 +
void configureSensor(void)
 +
{
 +
  /* You can also manually set the gain or enable auto-gain support */
 +
  // tsl.setGain(TSL2561_GAIN_1X);      /* No gain ... use in bright light to avoid sensor saturation */
 +
  // tsl.setGain(TSL2561_GAIN_16X);    /* 16x gain ... use in low light to boost sensitivity */
 +
  tsl.enableAutoRange(true);            /* Auto-gain ... switches automatically between 1x and 16x */
 +
 
 +
  /* Changing the integration time gives you better sensor resolution (402ms = 16-bit data) */
 +
  //tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);      /* fast but low resolution */
 +
  tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS); /* medium resolution and speed  */
 +
  // tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS); /* 16-bit data but slowest conversions */
  
#include <VirtualWire.h>
+
  /* Update these values depending on what you've set above! */ 
 +
  Serial.println("------------------------------------");
 +
  Serial.print  ("Gain:        "); Serial.println("Auto");
 +
  Serial.print  ("Timing:      "); Serial.println("101 ms");
 +
  Serial.println("------------------------------------");
 +
}
  
 +
</pre>
  
 +
=== récepteur pour capteur DHT + luxmètre + télémètre + détecteur de mouvement ===
 +
<pre>
 +
#include <VirtualWire.h> // librairie radio
 
#define RADIO_PIN  3    //  broche DATA du récepteur RF
 
#define RADIO_PIN  3    //  broche DATA du récepteur RF
  
Ligne 237 : Ligne 459 :
 
float humidityValue = 0;
 
float humidityValue = 0;
 
int luxValue = 0;
 
int luxValue = 0;
float hygrometryValue = 0;
+
float distanceValue = 0;
  
  
Ligne 257 : Ligne 479 :
 
         int i;
 
         int i;
 
         int nombre;
 
         int nombre;
        String buffeur;
 
 
         //Serial.println("nouveau msg");
 
         //Serial.println("nouveau msg");
 
         for (i = 0; i <= buflen; i++)
 
         for (i = 0; i <= buflen; i++)
Ligne 266 : Ligne 487 :
 
         Serial.print("ficelle : ");
 
         Serial.print("ficelle : ");
 
         Serial.println(ficelle);
 
         Serial.println(ficelle);
        //juste après commence l'appel de fonction qui ajuste les variables
 
        //on récupère une sous-partie du message ficelle.substring(0,2)
 
        // qu'on convertit en entier .toInt()
 
 
         tempValue=(ficelle.substring(0,2).toInt());
 
         tempValue=(ficelle.substring(0,2).toInt());
 
         humidityValue=(ficelle.substring(2,4).toInt());
 
         humidityValue=(ficelle.substring(2,4).toInt());
 +
        luxValue=(ficelle.substring(4,6).toInt());
 +
        distanceValue=(ficelle.substring(6,8).toInt());
 +
        motionValue=(ficelle.substring(8,9).toInt());
 +
 +
        //Serial.print(luxValue);
 +
        //Serial.println(" lux");
 
         }
 
         }
 
}
 
}
Ligne 280 : Ligne 504 :
  
 
//============== fonctions à ne pas modifier ==============================
 
//============== fonctions à ne pas modifier ==============================
 +
  
  
 
</pre>
 
</pre>
 +
=== récepteur pour capteur DHT + luxmètre ===
 +
<pre>
 +
// This is a demonstration on how to use an input device to trigger changes on your neo pixels.
 +
// You should wire a momentary push button to connect from ground to a digital IO pin.  When you
 +
// press the button it will change to a new pixel animation.  Note that you need to press the
 +
// button once to start the first animation!
  
===récepteur avec NeoPixel===
 
 
<pre>
 
 
#include <VirtualWire.h>
 
#include <VirtualWire.h>
#include <Adafruit_NeoPixel.h>
 
  
#define BUTTON_PIN  2    // Digital IO pin connected to the button.  This will be
 
                          // driven with a pull-up resistor so the switch should
 
                          // pull the pin to ground momentarily.  On a high -> low
 
                          // transition the button press logic will execute.
 
  
#define PIXEL_PIN    8    // Digital IO pin connected to the NeoPixels.
 
 
#define RADIO_PIN  3    //  broche DATA du récepteur RF
 
#define RADIO_PIN  3    //  broche DATA du récepteur RF
#define PIXEL_COUNT 8    //
 
 
#define NUMVALUES 8
 
  
 
// message reçu.
 
// message reçu.
int msg[NUMVALUES];
 
 
float tempValue = 0;
 
float tempValue = 0;
 
float humidityValue = 0;
 
float humidityValue = 0;
Ligne 308 : Ligne 526 :
 
float hygrometryValue = 0;
 
float hygrometryValue = 0;
  
// float sensValues[NUMVALUES];
 
 
// Parameter 1 = number of pixels in strip,  neopixel stick has 8
 
// Parameter 2 = pin number (most are valid)
 
// Parameter 3 = pixel type flags, add together as needed:
 
//  NEO_RGB    Pixels are wired for RGB bitstream
 
//  NEO_GRB    Pixels are wired for GRB bitstream, correct for neopixel stick
 
//  NEO_KHZ400  400 KHz bitstream (e.g. FLORA pixels)
 
//  NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
 
 
bool oldState = HIGH;
 
int showType = 0;
 
  
 
void setup() {
 
void setup() {
 
   Serial.begin(9600);
 
   Serial.begin(9600);
 
   vw_setup(2000);                // Bits par seconde
 
   vw_setup(2000);                // Bits par seconde
   vw_set_rx_pin(RADIO_PIN);             //  broche DATA du récepteur
+
   vw_set_rx_pin(RADIO_PIN);         //  broche DATA du récepteur
 
   vw_rx_start();   
 
   vw_rx_start();   
 
   Serial.println("Virtual wire started");
 
   Serial.println("Virtual wire started");
  pinMode(BUTTON_PIN, INPUT_PULLUP);
 
  strip.begin();
 
  strip.show(); // Initialize all pixels to 'off'
 
 
}
 
}
  
 
void loop() {
 
void loop() {
 
   // Get current button state.
 
   // Get current button state.
  bool newState = digitalRead(BUTTON_PIN);
 
 
   uint8_t buf[VW_MAX_MESSAGE_LEN];
 
   uint8_t buf[VW_MAX_MESSAGE_LEN];
 
   uint8_t buflen = VW_MAX_MESSAGE_LEN;
 
   uint8_t buflen = VW_MAX_MESSAGE_LEN;
   
+
   String ficelle="";
   // Check if state changed from high to low (button press).
+
   if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
  if (newState == LOW && oldState == HIGH) {
 
    // Short delay to debounce button.
 
    delay(20);
 
    // Check if button is still low after debounce.
 
    newState = digitalRead(BUTTON_PIN);
 
    if (newState == LOW) {
 
      showType++;
 
      if (showType > 9)
 
        showType=0;
 
      Serial.print("type : ");
 
      Serial.println(showType);
 
      startShow(showType);
 
 
 
    }
 
   }
 
 
 
  // Set the last button state to the old state.
 
  oldState = newState;
 
 
 
    if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
 
 
         {
 
         {
 
         int i;
 
         int i;
         int ii;
+
         int nombre;
         String ficelle = "";  
+
         //Serial.println("nouveau msg");
         for (i = 0; i < buflen; i++)
+
         for (i = 0; i <= buflen; i++)
 
         {
 
         {
             delay(25);
+
             ficelle+=char(buf[i]);  // msg lettre par lettre. buf[4] == 5ème lettre envoyée
            //Serial.write(buf[i]);  // msg lettre par lettre. buf[4] == 5ème lettre envoyée
 
            //Serial.print(" :");
 
            //for (ii=0; ii < NUMVALUES; ii++)
 
            //{
 
                //ficelle += buf[i];
 
                ficelle += bufDecipher(buf[i]);
 
            //}
 
            }
 
        ficelle[buflen] = '\0'; // finir l'array par un NULL en cas de longueur variable
 
        //Serial.print("ficelle : ");
 
        //Serial.println(ficelle); // On saute une ligne pour faciliter la lecture
 
        Serial.print("Temp value : ");
 
        tempValue=getTempValue(ficelle);
 
        Serial.println(tempValue);
 
        Serial.print("Humidity value : " );
 
        humidityValue=getHumidityValue(ficelle);
 
        Serial.println(humidityValue);
 
        Serial.print("Lux value : ");
 
        Serial.println(getLuxValue(ficelle));
 
 
         }
 
         }
}
+
        ficelle[buflen] = '\0';
 +
        Serial.print("ficelle : ");
 +
        Serial.println(ficelle);
 +
        tempValue=(ficelle.substring(0,2).toInt());
 +
        humidityValue=(ficelle.substring(2,4).toInt());
 +
        luxValue=(ficelle.substring(4,6).toInt());
 +
        //Serial.print(luxValue);
 +
        //Serial.println(" lux");
  
//============== FIN DU LOOP ==============================
+
        // ici vous pouvez appeler vos propres fonctions destinées à tirer partie des variables récupérées juste avant
  
//============== emplacements de vos fonctions ==============================
 
  
 
+
        }
//============== fonctions à ne pas modifier ==============================
 
 
 
float getTempValue(String ficelle){
 
  String myBuf=ficelle.substring(0,4);
 
  //Serial.print("Temp buffer : ");
 
  //Serial.println(myBuf);
 
  int ii;
 
  float tempValue=0;
 
  float mulValue=0;
 
  mulValue=bufToFloat(myBuf[0])*10;
 
  //Serial.println(mulValue);
 
  tempValue+=mulValue;
 
  tempValue+=bufToFloat(myBuf[1]);
 
  //Serial.println(bufToFloat(myBuf[1]));
 
  //Serial.println(tempValue);
 
  mulValue=bufToFloat(myBuf[2]);
 
  mulValue/=10;
 
  //Serial.println(mulValue); 
 
  tempValue+=mulValue;
 
  //Serial.println(tempValue); 
 
  mulValue=bufToFloat(myBuf[3]);
 
  mulValue/=100;
 
  tempValue+=mulValue;
 
  //Serial.println(tempValue);
 
  return tempValue;
 
 
}
 
}
  
float getHumidityValue(String ficelle){
+
//============== FIN DU LOOP ==============================
  String myBuf=ficelle.substring(4,8);
 
  int ii;
 
  float value=0;
 
  float mulValue=2;
 
  mulValue=bufToFloat(myBuf[0])*10;
 
  value+=mulValue;
 
  value+=bufToFloat(myBuf[1]);
 
  mulValue=bufToFloat(myBuf[2]);
 
  mulValue/=10;
 
  value+=mulValue;
 
  mulValue=bufToFloat(myBuf[3]);
 
  mulValue/=100;
 
  value+=mulValue;
 
  return value;
 
}
 
  
int getLuxValue(String ficelle){
+
//============== emplacements de vos fonctions ==============================
  String myBuf=ficelle.substring(8,12);
 
  int ii;
 
  float luxValue=0;
 
  float mulValue=0;
 
  mulValue=bufToFloat(myBuf[0])*1000;
 
  luxValue+=mulValue;
 
  luxValue+=bufToFloat(myBuf[1])*100;
 
  luxValue+=bufToFloat(myBuf[2])*10;
 
  luxValue+=bufToFloat(myBuf[3]);
 
  return luxValue;
 
  // return transfrome cequi suit en commentaires
 
  Serial.print("Lux buffer : ");
 
  Serial.println(myBuf);
 
    Serial.print("Lux value : ");
 
  Serial.println(luxValue);
 
  return luxValue;
 
}
 
 
 
int bufToFloat(char src)
 
{
 
  float sortie=0;
 
  switch(src){
 
  case '0':
 
    break;
 
  case '1':
 
    sortie+=1;
 
    break;
 
  case '2':
 
    sortie+=2;
 
    break;
 
  case '3':
 
    sortie+=3;
 
    break;
 
  case '4':
 
    sortie+=4;
 
    break;
 
  case '5':
 
    sortie+=5;
 
    break;
 
  case '6':
 
    sortie+=6;
 
    break;
 
  case '7':
 
    sortie+=7;
 
    break;
 
  case '8':
 
    sortie+=8;
 
  case '9':
 
    sortie+=9;
 
    break;
 
    }
 
   
 
  return sortie;
 
}
 
  
char bufDecipher(char alpha)
 
{
 
    char nombre=0;
 
    switch(alpha){
 
      case 'a':
 
        nombre = '0';
 
        break;
 
      case 'b':
 
        nombre = '1';
 
        break;
 
      case 'c':
 
        nombre = '2';
 
        break;
 
      case 'd':
 
        nombre = '3';
 
        break;
 
      case 'e':
 
        nombre = '4';
 
        break;
 
      case 'f':
 
        nombre = '5';
 
        break;
 
      case 'g':
 
        nombre = '6';
 
        break;
 
      case 'h':
 
        nombre = '7';
 
        break;
 
      case 'i':
 
        nombre = '8';
 
        break;
 
      case 'j':
 
        nombre = '9';
 
        break;       
 
      }
 
      return char(nombre);
 
}
 
  
//============== fonctions liées à la librairie NeoPixel ==============================
+
// ici toute la logique de votre programme
  
//============== ne pas modifier ici ==============================
+
//============== fonctions à ne pas modifier ==============================
 
 
 
 
void startShow(int i) {
 
  switch(i){
 
    case 0: colorWipe(strip.Color(0, 0, 0), 50);    // Black/off
 
            break;
 
    case 1: colorWipe(strip.Color(255, 0, 0), 50);  // Red
 
            break;
 
    case 2: colorWipe(strip.Color(0, 255, 0), 50);  // Green
 
            break;
 
    case 3: colorWipe(strip.Color(0, 0, 255), 50);  // Blue
 
            break;
 
    case 4: theaterChase(strip.Color(127, 127, 127), 50); // White
 
            break;
 
    case 5: theaterChase(strip.Color(127,  0,  0), 50); // Red
 
            break;
 
    case 6: theaterChase(strip.Color(  0,  0, 127), 50); // Blue
 
            break;
 
    case 7: rainbow(20);
 
            break;
 
    case 8: rainbowCycle(20);
 
            break;
 
    case 9: theaterChaseRainbow(50);
 
            break;
 
  }
 
}
 
 
 
// Fill the dots one after the other with a color
 
void colorWipe(uint32_t c, uint8_t wait) {
 
  for(uint16_t i=0; i<strip.numPixels(); i++) {
 
    strip.setPixelColor(i, c);
 
    strip.show();
 
    delay(wait);
 
  }
 
}
 
 
 
void rainbow(uint8_t wait) {
 
  uint16_t i, j;
 
 
 
  for(j=0; j<256; j++) {
 
    for(i=0; i<strip.numPixels(); i++) {
 
      strip.setPixelColor(i, Wheel((i+j) & 255));
 
    }
 
    strip.show();
 
    delay(wait);
 
  }
 
}
 
 
 
// Slightly different, this makes the rainbow equally distributed throughout
 
void rainbowCycle(uint8_t wait) {
 
  uint16_t i, j;
 
 
 
  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
 
    for(i=0; i< strip.numPixels(); i++) {
 
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
 
    }
 
    strip.show();
 
    delay(wait);
 
  }
 
}
 
 
 
//Theatre-style crawling lights.
 
void theaterChase(uint32_t c, uint8_t wait) {
 
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
 
    for (int q=0; q < 3; q++) {
 
      for (int i=0; i < strip.numPixels(); i=i+3) {
 
        strip.setPixelColor(i+q, c);    //turn every third pixel on
 
      }
 
      strip.show();
 
 
 
      delay(wait);
 
 
 
      for (int i=0; i < strip.numPixels(); i=i+3) {
 
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
 
      }
 
    }
 
  }
 
}
 
 
 
//Theatre-style crawling lights with rainbow effect
 
void theaterChaseRainbow(uint8_t wait) {
 
  for (int j=0; j < 256; j++) {    // cycle all 256 colors in the wheel
 
    for (int q=0; q < 3; q++) {
 
      for (int i=0; i < strip.numPixels(); i=i+3) {
 
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
 
      }
 
      strip.show();
 
 
 
      delay(wait);
 
 
 
      for (int i=0; i < strip.numPixels(); i=i+3) {
 
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
 
      }
 
    }
 
  }
 
}
 
 
 
// Input a value 0 to 255 to get a color value.
 
// The colours are a transition r - g - b - back to r.
 
uint32_t Wheel(byte WheelPos) {
 
  WheelPos = 255 - WheelPos;
 
  if(WheelPos < 85) {
 
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
 
  }
 
  if(WheelPos < 170) {
 
    WheelPos -= 85;
 
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
 
  }
 
  WheelPos -= 170;
 
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
 
}
 
  
 +
// ajouter ici les fonctions Adafruit pour Neopixel par exemple
 
</pre>
 
</pre>
  
===émetteur ===
+
===récepteur pour capteur DHT seul===
 
 
Ce code est à mettre du côté émetteur. A utiliser avec le schéma de câblage afin de reproduire le dispositif au labo.
 
  
 
<pre>
 
<pre>
#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
+
// This is a demonstration on how to use an input device to trigger changes on your neo pixels.
#include "DHT.h"
+
// You should wire a momentary push button to connect from ground to a digital IO pin. When you
#include<stdlib.h>
+
// press the button it will change to a new pixel animation. Note that you need to press the
 +
// button once to start the first animation!
  
// les broches des capteurs
+
#include <VirtualWire.h>
#define SENSDHTPIN 4 // la broche dédiée au capteur de température & hygrométrie de l'air
 
#define DHTTYPE DHT22  // DHT 22  (AM2302) le modèle du capteur
 
DHT dht(SENSDHTPIN, DHTTYPE);
 
  
  
// les capteurs I2C
+
#define RADIO_PIN  3   // broche DATA du récepteur RF
// attention au 3,3V vs 5v
 
//#DEFINE SENSLIGHTPIN = 5 ; // la broche dédiée au luxmètre => I2C
 
//#DEFINE SENSPROXPIN = 6 ; // la broche dédiée au télémètre
 
  
// interrupteur
+
// message reçu.
#define SWITCHPIN 2
+
float tempValue = 0;
   
+
float humidityValue = 0;
// le compteur à incrémenter
+
int luxValue = 0;
int truc = 0;
+
float hygrometryValue = 0;
  
// le tableau des valeurs
 
#define NUMVALUES 12
 
float sensValues[NUMVALUES];
 
  
////////////////////////////////////////////////
+
void setup() {
 
+
  Serial.begin(9600);
//message à envoyer.
+
  vw_setup(2000);                 // Bits par seconde
const char *msg="abcdefghijih";
+
  vw_set_rx_pin(RADIO_PIN);         // broche DATA du récepteur
 
+
  vw_rx_start(); 
// ses élements : les valeurs des capteurs
+
  Serial.println("Virtual wire started");
char *tempValue;          // variable de température
 
char *humidityValue;      // variable % hygrométrie de l'air
 
char *luxValue;             
 
unsigned int sensSwitch = 0 ; // variable de l'interrupteur
 
// unsigned int sensLight = 0 ; // variable dédiée au niveau lumièe en lux
 
// unsigned int sensProx = 0 ; // variable de distance
 
//    unsigned int sensBend = 0; // variable du capteur de flexion
 
// unsigned int sensSwitch = 0; //  l'interrupteur
 
 
 
/////////////////////////////////////////////////////////////
 
 
 
    // les variables temporelles
 
    unsigned long latestSensingMillis =  millis(); // mémorise la dernière fois qu'on a interogé les capteurs
 
    unsigned long latestDHTSensingMillis = millis(); //  la dernière fois qu'on a interogé le capteur temp+hygro
 
    unsigned long latestSendingMillis =  millis(); //  la dernière fois qu'on a envoyé les valeurs
 
    unsigned long sensingIntervalMillis = 500; // intervalle de temps avant une nouvelle interrogation des capteurs
 
    unsigned long sensingDHTIntervalMillis = 2500; // intervalle de temps avant nouvelle interrogation capteur DHT
 
    unsigned long sendingIntervalMillis = 1500; // intervalle de temps avant nouvel envoi de valeurs
 
    unsigned long time;
 
 
 
/////////////////////////////////////////////////////////////
 
 
 
void setup()
 
{
 
Serial.begin(9600);
 
  // capteurs & inter
 
  pinMode(SWITCHPIN, INPUT_PULLUP); // pour l'interrupteur
 
// la communication radio
 
    vw_setup(2000);               // Bits par seconde (2000 = bonne portée. Si augmente, portée diminue
 
    vw_set_tx_pin(3);             // La broche 3 pour transmettre la DATA
 
   
 
    // on lance le capteur de temp + hygro
 
Serial.println("DHTxx test!");
 
dht.begin();
 
 
}
 
}
  
////////////////////////// le loooooooop ///////////////////////////////////////
+
void loop() {
 
+
  // Get current button state.
 
+
  uint8_t buf[VW_MAX_MESSAGE_LEN];
void loop()
+
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
{
+
  String ficelle=""; 
    time = millis();
+
  if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
    getTemp(time);
+
        {
    //getMsgContent(time); //on l'imprime
+
        int i;
    sendMsg(time); // on doit assembler les valeurs en tableau de char
+
        int nombre;
 +
        //Serial.println("nouveau msg");
 +
        for (i = 0; i <= buflen; i++)
 +
        {
 +
            ficelle+=char(buf[i]);  // msg lettre par lettre. buf[4] == 5ème lettre envoyée
 +
        }
 +
        ficelle[buflen] = '\0';
 +
        Serial.print("ficelle : ");
 +
        Serial.println(ficelle);
 +
        //juste après commence l'appel de fonction qui ajuste les variables
 +
        //on récupère une sous-partie du message ficelle.substring(0,2)
 +
        // qu'on convertit en entier .toInt()
 +
        tempValue=(ficelle.substring(0,2).toInt());
 +
        humidityValue=(ficelle.substring(2,4).toInt());
 +
        }
 
}
 
}
  
////////////////////////// les fonctions ///////////////////////////////////////
+
//============== FIN DU LOOP ==============================
  
void getTemp(long time)
+
//============== emplacements de vos fonctions ==============================
{
 
  float t;
 
  float h;
 
  if (time - latestDHTSensingMillis >  sensingDHTIntervalMillis){
 
    //Serial.println("get");
 
    t = dht.readTemperature();
 
    h = dht.readHumidity();
 
      if (isnan(t) || isnan(h))
 
        Serial.println("capteur DHT injoignable!");
 
      else
 
        itoa(t, tempValue, 5);
 
        itoa(h, humidityValue, 5);
 
    latestDHTSensingMillis = time;
 
    return;
 
    Serial.println(" ");
 
    Serial.print("Temperature : ");
 
    Serial.println(t);
 
    Serial.print("Humidity : ");
 
    Serial.println(h);
 
    Serial.println(" ");
 
    latestDHTSensingMillis = time;
 
    return;
 
    }
 
}
 
  
void sendMsg(long time)
 
{
 
  if (time - latestSendingMillis >  sendingIntervalMillis){
 
    //Serial.println("Msg");
 
    vw_send((uint8_t *)msg, strlen(msg));
 
    vw_wait_tx();              // On attend la fin de l'envoi du msg.
 
    latestSendingMillis = time;
 
    delay(25);
 
  }
 
}
 
  
char buildMyTempValue(char tempValue)
+
//============== fonctions à ne pas modifier ==============================
{
 
  return;
 
}
 
  
char charCipher(char entier)
 
{
 
  char lettre='a';
 
    switch(entier){
 
      case '0':
 
        break;
 
      case '1':
 
        lettre = 'b';
 
        break;
 
      case '2':
 
        lettre = 'b';
 
        break;
 
      case '3':
 
        lettre = 'b';
 
        break;
 
      case '4':
 
        lettre = 'b';
 
        break;
 
      case '5':
 
        lettre = 'b';
 
        break;
 
      case '6':
 
        lettre = 'b';
 
        break;
 
      case '7':
 
        lettre = 'b';
 
        break;
 
      case '8':
 
        lettre = 'b';
 
        break;
 
      case '9':
 
        lettre = 'b';
 
        break;       
 
      }
 
      return char(lettre);
 
}
 
 
 
  
 
</pre>
 
</pre>
  
[[Catégorie:Projets]]
+
=== code d'exmple pour le PIR (détecteur de mouvement infrarouge ===
[[Catégorie:Edna]]
+
 
[[Catégorie:Workshops]]
+
https://learn.adafruit.com/pir-passive-infrared-proximity-motion-sensor/using-a-pir

Version actuelle en date du 16 septembre 2015 à 14:26


Atelier de conception d'objets connectés pour les 8 ans et +



Atelier STARTER DO iT 2 mené par les étudiants en Master 2 du labo Readi de l'EDNA.

Insérez ici un lien vers la page de ce wiki documentant vos réalisations. N'oubliez pas de tagger pour apparaître dans les catégories EDNA & Workshops.

Objectifs & calendrier

A partir d'un boitier connecté (arduino..+flux à définir) émettant du son et/ou un signal lumineux (Kit mis à disposition), les étudiants par groupe de 2/3 devront produire un objet connecté autonome (contexte+service+forme) destiné à un public jeune+parents.

Contexte Spatial : LIVING LAB

Occupation d'un espace semi-fermé doté permettant l'accueil du public dans un contexte de living lab : un peu d'éclairage, une machine à café, un coin détente & lecture, plante verte…

Dans ce lieu, un PC relié à Internet équipé d'un Arduino et de son radio-émetteur. Il capte avant tout des événements issus de capteurs installés localement (barrière infrarouge d'entrée, capteurs de mouvement IR, stress d'une plante verte, télémètres, suivant le stock actuel de l'école). Il collecte des flots de données depuis le réseau (capteurs raspberry pi de l'école, indicateur de pollution atmosphérique de la ville de Nantes, météo, réceptions de tweets, emails, ensemble encore à définir pour qu'il soit pertinent).

Une troisième piste consiste à générer des signaux artificiels (type onde sinusoïde, fractales, bruit brownien). En cas de rupture de la connexion internet ou de non pertinence des signaux (par ex. l'école est fermée le WE durant l'expo Festival D), on peut rejouer des enregistrements des jours précédents. Le but est de créer un flot radiodiffusé d'événements du quotidien, qu'il soit issu de notre environnement physique, électronique ou totalement artificiel. A partir de ce double ensemble (living lab + flot de données), les binômes (impératif : équipes transversales) doivent proposer une réponse finie et fonctionnelle.

Contraintes créatives

  • Le microcontrôleur est connecté à cette source radio qui diffuse les données.
  • La machine sera autonome (non connectée physiquement à un PC)
  • Le boîtier sera naturellement porteur de sens (Esthétique/Forme/ Fonction). Il proposera une réponse originale à la problématique dégagée lors de la première séance.
  • Le dispositif doit réagir et alerter le visiteur, selon un protocole à définir par le binôme, en mettant en avant le potentiel ludique et pratique des kits mis à leur disposition.
  • A chacun de tirer profit des fonctionnalités minimales : ouïe, toucher, vue.


Présentations

Lors des présentations publiques (Festival D/Boot camp) , les binômes devront également proposer des livrables explicitant leur démarche/ mode d'emploi sous forme de POSTERS (format KKmono : 75*110)


Le dispositif sera présenté dans le cadre de ces deux évènements :

  • Le FESTIVAL D les 26 et 27 septembre* (encadrement Laurent Neyssensas)
  • Le Boot camp design Make de l’IRT JV le jeudi 8 octobre* (encadrement Laurent Neyssensas)

Les étudiants devront prévoir la présence d’un membre de chaque équipe (rotation) sur ces 2 évènements.

Principes techniques

Vous vous voyez remettre le premier jour un kit électronique (cf liste infra) qui offre un ensemble réduit de caractéristiques:

  • il permet la réception sans fil de données environnementales
  • il permet de réagir de façon lumineuse, sonore et tactile aux données reçues
  • il permet de fonctionner de façon autonome en énergie sur piles ou accus AA. L'autonomie dépendra de la gourmandise de vos circuits et de l'efficacité de votre code.

Des exemples de code sont réunis à la fin de cette page. Ils sont abondamment commentés afin de faciliter la réutilisation dans votre projet,particulièrement la partie finale intitulée récepteur. Mind the // !!!

Le travail ayant été simplifié du côté de l'envoi de données (cf liste infra) et sa réception, et les composants sélectionnés et documenter pour vous en faciliter la prise en main, vous pourrez vous focaliser sur la conception de 2 voire 3 propositions ludiques de feedback sensitif pour objets connectés, les soumettre lors d'un PechaKucha. La proposition la plus pertinente sera retenu. A vous ensuite de passer à la mise en oeuvre:

  • analyser la pertinence des données reçues
  • concevoir un algorithme permettant de les filtrer
  • concevoir un autre algorithme générant le feedback sensoriel
  • mettre en oeuvre et debugger le tout
  • concevoir un objet autonome mettant en avant ce feedback suivant la fonction et l'usage que vous atribuez à votre objet
  • documenter sur ce wiki (storytelling) et sur vos livrables le projet retenu

Quelques lectures en français pour vous rafraîchir la mémoire sur l'électronique embarquée avec Arduino:

Liste et plage de valeurs des données radio émises

Déjà implémentés

  • Température ambiante (°C) = float 0-99,99
  • Degré d'humidité ambiante = float 0-99,99
  • Lumière ambiante (lux) = int 0-9999

Pas encore implémentés:

  • Bloc de 4 interrupteurs capacitifs = boolean 0 ou 1
  • Capteur de pollution aérienne (fumée) = float 0-99,99 (après étalonnage)
  • télémètre à ultrason (distance en cm) = entier 0-9999 (valeur théorique, de 20 à 120cm dans les faits)

D'autres capteurs peuvent être ajoutés à la demande. On peut également envisager de capter des données environnementales en ligne et les insérer dans notre flux. Ex: http://www.airpl.org/Air-exterieur/mesures-en-direct vs https://air.plumelabs.com/Nantes

Liste des composants fournis

Chaque binôme se voit remettre le kit suivant:

  • un Arduino Uno et câble USB A/B
  • un chargeur avec interrupteur pour 4 piles AA (non fournies!)
  • un adaptateur Mâle DC 5.5/2.1 bornier à vis
  • une plaque d'essai 270 trous (Osez le golf!)
  • 4 LEDs NeoPixels RGB ( + condensateur 100uF + résistance 470 Ohm + diode 1n4001)
  • un moteur vibreur ( + condensateur 0,1uF + résistances 33 Ohm & 1kOhm + diode 1n4001 + transistor 2n222 + mini-circuit pré assemblé )
  • un piezo (+ condensateur 1uF & résistance 22kOhm + potentiomètre 220 kOhm logarithmique)
  • un récepteur RF 434Mhz (ajouter une antenne de 17,3cm de long)

Les câbles pour connecter l'ensemble, fers à souder et brasure seront également disponibles sur place.

conseils pour l'alimentation électrique avec des piles et accus

Vous pourrez avoir besoin de réaliser un circuit de puissance. Voir la doc de flossmanuals : la cigarette ne tue pas les machines. Ce type de circuit est requis lorsque vous utilisez une tension différente de celle délivrée par l'Arduino (5V ou 3,3V), et lorsque vous avez besoin d'une puissance totale supérieure à 250mA, qui est le maximum que peut fournir un Arduino sans griller.

Exemples de code Arduino

Réception RF

Librairie VirtualWire. Attention à prendre la bonne version depuis le site suivant: Airspayce .


Exemple de code émetteur:


#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !

int IntervalleEmission = 2000; // on définit une variable globale

void setup()
{
    vw_setup(2000);  // Bits par seconde 
                     // (vous pouvez le modifier mais cela modifiera la portée)
    vw_set_tx_pin(3);             // La broche 3 sera utilisée pour transmettre la DATA
                                   //vous pouvez changez de broche si vous le désirez.
}

void loop()
{
   const char *msg = "EDNA is ReaDi";                   // C'est le message à envoyer.
   vw_send((uint8_t *)msg, strlen(msg));
   vw_wait_tx();                                          // On attend que le message complet soit envoyé.
   delay(intervalleEmission);
}

Exemple de code récepteur:

    #include <VirtualWire.h>
     // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
    
    int IntervalleEmission = 2000; // on définit une variable globale
    // attention à ne pas descendre en dessous de 200ms, sinon on sature l'espace radio

    void setup()
    {
        Serial.begin(9600);    // On initialise "le serial monitor",
        // 9600 bauds ici car c'est la valeur par défaut 
        //Attention à bien mettre la même valeur dans votre Serial Monitor et dans votre programme.
        vw_setup(2000);                 // Bits par seconde 
        //(vous pouvez le modifier mais cela modifiera la portée. 
        // Plus rapide, cela diminue la portée
        vw_set_rx_pin(11);             // numéro de broche du récepteur
        vw_rx_start();                    // On démarre le récepteur.
    }

    void loop()
    {
        uint8_t buf[VW_MAX_MESSAGE_LEN];
        uint8_t buflen = VW_MAX_MESSAGE_LEN;

        if (vw_get_message(buf, &buflen)) // On teste si un message a été reçu.
        {
        int i;
         // Un message est reçu.

        for (i = 0; i < buflen; i++)
        {
            delay(50);
            Serial.write(buf[i]);  // On affiche le message lettre par lettre. 
            //Par exemple buf[3] sera égale à la 5ème lettre de la chaîne  envoyée 
            // (EDNA is Readi donc "a") car on compte depuis zéro.
            }
        Serial.println(""); // On saute une ligne afin d'avoir plus de clarté.
         }
    }

Vibreur

Commande en PWM, sans librairie donc.

const int motorPin = 3;

void setup()
{
pinMode(motorPin, OUTPUT);
}

void loop()
{
digitalWrite(motorPin, HIGH);
delay(1000);
digitalWrite(motorPin, LOW);
delay(59000);
}

NB: il s'agit d'un exemple à ne pas suivre concernant l'utilisation de la fonction delay(). En effet, celle-ci est bloquante. Cela signifie que la dernière ligne de la boucle loop() bloquera toute nouvelle entrée de données provenant de capteurs ou d'actuation de LEDs pendant 59 secondes!

Piezo

Utilisation de la fonction Tone, en important un tableau de hauteurs de notes. Attention, il s'agit de la notation anglo-saxonne ABC et non pas française dorémi.

Vous pouvez mélanger les deux en passant le code de James Bond en fonction. Vous pouvez consulter à ce sujet la partie 106 du blog d'eskimon.

LEDs NeoPixel

Utilisation de la librairie NeoPixel. Exemple en français sur le site de McHobby.be

  • Ajouter un condensateur 1000uF en parallèle entre le pôle - et le pole +
  • Ajouter une résistance 470Ohm (jaune violetmarron) en série sur la ligne + (fil rouge)

assemblage de code fonctionnel

émetteur pour capteur DHT + luxmètre + télémètre

#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
#include "DHT.h"
#include<stdlib.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_TSL2561_U.h>
#include <NewPing.h> // pour le télémètre DYP-ME007

// les broches et paramètre du télémètre
#define TRIGGER_PIN  12  // broche reliée au trigger du télémètre.
#define ECHO_PIN     11  // broche reliée à l'echo du télémètre.
#define MAX_DISTANCE 99 // distance maximale évaluée (en centimeters).
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);


// les broches des capteurs
#define SENSDHTPIN 4		// la broche dédiée au capteur de température & hygrométrie de l'air
#define DHTTYPE DHT22   			// DHT 22  (AM2302) le modèle du capteur
DHT dht(SENSDHTPIN, DHTTYPE);

// les capteurs I2C sont branchés en série
// attention au 3,3V vs 5v
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);
    
////////////////////////////////////////////////

//message à envoyer.
char msg[40];

// ses élements : les valeurs des capteurs
float tempValue=2000;       // variable de température
float humidityValue=6000;      // variable % hygrométrie de l'air
unsigned int luxValue=48;
unsigned int distanceValue=10;
//	unsigned int sensLight = 0 ; 			// variable dédiée au niveau lumièe en lux
//	unsigned int sensProx = 0 ; 			// variable de distance
//    unsigned int sensBend = 0; 			// variable du capteur de flexion
//	unsigned int sensSwitch = 0; 			//   l'interrupteur	

/////////////////////////////////////////////////////////////

    // les variables temporelles
    unsigned long latestSendingMillis =  millis(); // mémorise la dernière fois qu'on a envoyé les valeurs
    unsigned long latestSensingMillis =  millis(); // mémorise la dernière fois qu'on a interogé les capteurs
    unsigned long latestDHTSensingMillis = millis(); //  la dernière fois qu'on a interogé le capteur temp+hygro
    unsigned long i2cSensingIntervalMillis =  1000; // intervalle de temps avant une nouvelle interrogation des capteurs
    unsigned long sensingDHTIntervalMillis = 2500; // intervalle de temps avant nouvelle interrogation capteur DHT
    unsigned long sendingIntervalMillis = 1000; // intervalle de temps avant nouvel envoi de valeurs
    unsigned long time;

/////////////////////////////////////////////////////////////

void setup()
{
  Serial.begin(9600);
  // la communication radio 
  vw_setup(2000);                // Bits par seconde (2000 = bonne portée. Si augmente, portée diminue
  vw_set_tx_pin(3);             // La broche 3 pour transmettre la DATA
  // on lance le capteur de temp + hygro
  Serial.println("DHTxx test!");
  dht.begin();
  
  Serial.println("Light Sensor Test"); Serial.println("");
  /* Initialise le capteur TSL2561 */
  if(!tsl.begin())
  {
    /* There was a problem detecting the ADXL345 ... check your connections */
    Serial.print("Ooops, no TSL2561 detected ... Check your wiring or I2C ADDR!");
    while(1);
  }
  /* Display some basic information on this sensor */
  displaySensorDetails();
  /* Setup the sensor gain and integration time */
  configureSensor();
  Serial.println("");
}

////////////////////////// le loooooooop ///////////////////////////////////////


void loop()
{
    time = millis();
    getTemp(time); // temp & humidité
    getLux(time);
    //getMsgContent(time); //on l'imprime
    getDistance(time);
    sendMsg(time); // on doit assembler les valeurs en tableau de char
}

////////////////////////// les fonctions ///////////////////////////////////////

void getLux(long time)
{
  if (time - latestSensingMillis >  i2cSensingIntervalMillis){
    //Serial.println("getting Lux value..");
    sensors_event_t event;
    tsl.getEvent(&event);
    if (event.light)
  {
    luxValue=event.light;
    // Serial.print(luxValue); Serial.println(" luxValue");

  }
  else
  {
    /* If event.light = 0 lux the sensor is probably saturated
       and no reliable data could be generated! */
    Serial.println("Lux Sensor overload");
  }
    latestSensingMillis = time;
    return;
    }
}

void getDistance(long time) 
{
  if (time - latestDHTSensingMillis >  i2cSensingIntervalMillis){
  unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
  if ((uS / US_ROUNDTRIP_CM)>10){  // pour filtrer les valeurs < à 10 et ne pas décaler le registre d'envoi
  distanceValue=(uS / US_ROUNDTRIP_CM);
  }; 
    return;
    }
}

void getTemp(long time) 
{
  if (time - latestSensingMillis >  sensingDHTIntervalMillis){
    //Serial.println("get");
    tempValue = dht.readTemperature();
    humidityValue = dht.readHumidity();
    if (isnan(tempValue) || isnan(humidityValue))
        Serial.println("capteur DHT injoignable!");
    latestDHTSensingMillis = time;
    return;
    }
}


void sendMsg(long time)
{
  int i=0;
  if (time - latestSendingMillis >  sendingIntervalMillis){
    msg[0]=(buildMyValue(tempValue))[0];
    msg[1]=(buildMyValue(tempValue))[1]; // ne marche que pour temp >= 10°C
    msg[2]=(buildMyValue(humidityValue))[0];
    msg[3]=(buildMyValue(humidityValue))[1]; // ne marche que pour humidité >= 10%
    msg[4]=(buildMyValue(luxValue))[0];
    msg[5]=(buildMyValue(luxValue))[1]; // ne marche que pour lux >= 10 et < 100
    msg[6]=(buildMyValue(distanceValue))[0];
    msg[7]=(buildMyValue(distanceValue))[1]; // ne marche que pour lux >= 10 et < 100
    msg[8]='\0';
    for (i = 0; i < strlen(msg); i++)
	{
	    Serial.print(msg[i], HEX);
	    Serial.print(' ');
	}
    Serial.println();
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();               // On attend la fin de l'envoi du msg.
    latestSendingMillis = time;
    //delay(25); 
  }
}

char *buildMyValue(float value)
{
  char buffer[40];
  itoa(value, buffer, 10);
  return buffer;
}

//============== fonctions du capteur de luminosité TSL2561 ===================================


// ============= by ADAFRUIT ==============

void displaySensorDetails(void)
{
  sensor_t sensor;
  tsl.getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
  Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" lux");
  Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" lux");
  Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" lux");  
  Serial.println("------------------------------------");
  Serial.println("");
  delay(500);
}

/**************************************************************************/
/*
    Configures the gain and integration time for the TSL2561
*/
/**************************************************************************/
void configureSensor(void)
{
  /* You can also manually set the gain or enable auto-gain support */
  // tsl.setGain(TSL2561_GAIN_1X);      /* No gain ... use in bright light to avoid sensor saturation */
  // tsl.setGain(TSL2561_GAIN_16X);     /* 16x gain ... use in low light to boost sensitivity */
  tsl.enableAutoRange(true);            /* Auto-gain ... switches automatically between 1x and 16x */
  
  /* Changing the integration time gives you better sensor resolution (402ms = 16-bit data) */
  //tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);      /* fast but low resolution */
  tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS);  /* medium resolution and speed   */
  // tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS);  /* 16-bit data but slowest conversions */

  /* Update these values depending on what you've set above! */  
  Serial.println("------------------------------------");
  Serial.print  ("Gain:         "); Serial.println("Auto");
  Serial.print  ("Timing:       "); Serial.println("101 ms");
  Serial.println("------------------------------------");
}

récepteur pour capteur DHT + luxmètre + télémètre + détecteur de mouvement

#include <VirtualWire.h> // librairie radio
#define RADIO_PIN  3    //  broche DATA du récepteur RF

// message reçu.
float tempValue = 0;
float humidityValue = 0;
int luxValue = 0;
float distanceValue = 0;


void setup() {
  Serial.begin(9600);
  vw_setup(2000);                 // Bits par seconde
  vw_set_rx_pin(RADIO_PIN);          //  broche DATA du récepteur
  vw_rx_start();  
  Serial.println("Virtual wire started");
}

void loop() {
  // Get current button state.
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  String ficelle="";  
  if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
        {
        int i;
        int nombre;
        //Serial.println("nouveau msg");
        for (i = 0; i <= buflen; i++)
        {
            ficelle+=char(buf[i]);  // msg lettre par lettre. buf[4] == 5ème lettre envoyée
         }
         ficelle[buflen] = '\0';
         Serial.print("ficelle : ");
         Serial.println(ficelle);
         tempValue=(ficelle.substring(0,2).toInt());
         humidityValue=(ficelle.substring(2,4).toInt());
         luxValue=(ficelle.substring(4,6).toInt());
         distanceValue=(ficelle.substring(6,8).toInt());
         motionValue=(ficelle.substring(8,9).toInt());

         //Serial.print(luxValue);
         //Serial.println(" lux");
         }
}

//============== FIN DU LOOP ==============================

//============== emplacements de vos fonctions ==============================


//============== fonctions à ne pas modifier ==============================



récepteur pour capteur DHT + luxmètre

// This is a demonstration on how to use an input device to trigger changes on your neo pixels.
// You should wire a momentary push button to connect from ground to a digital IO pin.  When you
// press the button it will change to a new pixel animation.  Note that you need to press the
// button once to start the first animation!

#include <VirtualWire.h>


#define RADIO_PIN  3    //  broche DATA du récepteur RF

// message reçu.
float tempValue = 0;
float humidityValue = 0;
int luxValue = 0;
float hygrometryValue = 0;


void setup() {
  Serial.begin(9600);
  vw_setup(2000);                 // Bits par seconde
  vw_set_rx_pin(RADIO_PIN);          //  broche DATA du récepteur
  vw_rx_start();  
  Serial.println("Virtual wire started");
}

void loop() {
  // Get current button state.
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  String ficelle="";  
  if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
        {
        int i;
        int nombre;
        //Serial.println("nouveau msg");
        for (i = 0; i <= buflen; i++)
        {
            ficelle+=char(buf[i]);  // msg lettre par lettre. buf[4] == 5ème lettre envoyée
         }
         ficelle[buflen] = '\0';
         Serial.print("ficelle : ");
         Serial.println(ficelle);
         tempValue=(ficelle.substring(0,2).toInt());
         humidityValue=(ficelle.substring(2,4).toInt());
         luxValue=(ficelle.substring(4,6).toInt());
         //Serial.print(luxValue);
         //Serial.println(" lux");

         // ici vous pouvez appeler vos propres fonctions destinées à tirer partie des variables récupérées juste avant


         }
}

//============== FIN DU LOOP ==============================

//============== emplacements de vos fonctions ==============================


// ici toute la logique de votre programme

//============== fonctions à ne pas modifier ==============================

// ajouter ici les fonctions Adafruit pour Neopixel par exemple

récepteur pour capteur DHT seul

// This is a demonstration on how to use an input device to trigger changes on your neo pixels.
// You should wire a momentary push button to connect from ground to a digital IO pin.  When you
// press the button it will change to a new pixel animation.  Note that you need to press the
// button once to start the first animation!

#include <VirtualWire.h>


#define RADIO_PIN  3    //  broche DATA du récepteur RF

// message reçu.
float tempValue = 0;
float humidityValue = 0;
int luxValue = 0;
float hygrometryValue = 0;


void setup() {
  Serial.begin(9600);
  vw_setup(2000);                 // Bits par seconde
  vw_set_rx_pin(RADIO_PIN);          //  broche DATA du récepteur
  vw_rx_start();  
  Serial.println("Virtual wire started");
}

void loop() {
  // Get current button state.
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  String ficelle="";  
  if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
        {
        int i;
        int nombre;
        //Serial.println("nouveau msg");
        for (i = 0; i <= buflen; i++)
        {
            ficelle+=char(buf[i]);  // msg lettre par lettre. buf[4] == 5ème lettre envoyée
         }
         ficelle[buflen] = '\0';
         Serial.print("ficelle : ");
         Serial.println(ficelle);
         //juste après commence l'appel de fonction qui ajuste les variables
         //on récupère une sous-partie du message ficelle.substring(0,2)
         // qu'on convertit en entier .toInt()
         tempValue=(ficelle.substring(0,2).toInt());
         humidityValue=(ficelle.substring(2,4).toInt());
         }
}

//============== FIN DU LOOP ==============================

//============== emplacements de vos fonctions ==============================


//============== fonctions à ne pas modifier ==============================


code d'exmple pour le PIR (détecteur de mouvement infrarouge

https://learn.adafruit.com/pir-passive-infrared-proximity-motion-sensor/using-a-pir