Modifications

Cestpasidiot

16 015 octets ajoutés, 16 septembre 2015 à 13:26
récepteur pour capteur DHT + luxmètre : + détecteur de mouvement
}}
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 ==
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 Boot camp design Make de l’IRT JV le jeudi 8 octobre* (encadrement Laurent Neyssensas)
* 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 <u>ludiques</u> 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:
* http://eskimon.fr/ebook-tutoriel-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 ===
* un [http://snootlab.com/lang-fr/composants/145-recepteur-rf-434-mhz.html 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 http://mchobby.be/wiki/index.php?title=Piles_et_accus_pour_alimenter_des_Pixels-Diodepiles et accus ] '' Vous pourrez avoir besoin de réaliser un circuit de puissance. Voir la doc de flossmanuals : [http://www.flossmanualsfr.net/arduino/ch021_application-utilitaire-poster-suridentica 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: [http://www.airspayce.com/mikem/arduino/VirtualWire/files.html 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
// attention à ne pas descendre en dessous de 200ms, sinon on sature l'espace radio
void setup()
Utilisation de la fonction [http://arduino.cc/en/Tutorial/Tone 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.
* Exemple détaillé utilisant [ https://www.arduino.cc/en/Tutorial/Tone3 Tone()] en fonction d'une variable.
* Exemple de mélodie pré-enregistrée : [http://garagelab.com/profiles/blogs/how-to-use-tone-function-arduino-playing-the-james-bond-theme le thème de James Bond]
Vous pouvez mélanger les deux en passant le code de James Bond en fonction. Vous pouvez consulter à ce sujet la [ http://eskimon.fr/86-arduino-106-le-langage-arduino-22#461108 partie 106] du blog d'eskimon.
====LEDs NeoPixel====
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== === é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 capteurDHT dht(SENSDHTPIN, DHTTYPE); // les capteurs I2C sont branchés en série// attention au 3,3V vs 5vAdafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345); //////////////////////////////////////////////// //message à envoyer.char msg[40]; // ses élements : les valeurs des capteursfloat tempValue=2000; // variable de températurefloat humidityValue=6000; // variable % hygrométrie de l'airunsigned 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[Catégorie:Projets7]=(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[Catégorie40]; 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:Edna "); 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 // 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 ==============================   </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! #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[Catégoriebuflen] = '\0'; Serial.print("ficelle :Workshops"); 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</pre> ===récepteur pour capteur DHT seul=== <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! #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 ==============================  </pre> === code d'exmple pour le PIR (détecteur de mouvement infrarouge === https://learn.adafruit.com/pir-passive-infrared-proximity-motion-sensor/using-a-pir
Emailconfirmed
471
modifications