Modifications

Cestpasidiot

7 484 octets ajoutés, 16 septembre 2015 à 13:26
récepteur pour capteur DHT + luxmètre : + détecteur de mouvement
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)
=== Liste et plage de valeurs des données radio émises ===
Température ambiante (°C) = float 0-99,99Degré d'humidité ambiante = float 0-99,99Lumière ambiante (lux) = int 0-9999Bloc de 4 interrupteurs capacitifs = boolean 0 ou 1Capteur 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é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 . On peut ainsi é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 ===
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]
 
* 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==
===récepteur émetteur pour capteur DHT seul+ 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[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>/**************************************************************************//* Configures the gain and integration time for the TSL2561*// This is a demonstration on how **************************************************************************/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 an input device in low light to trigger changes on your neo pixelsboost 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 */ You should wire a momentary push button to connect from ground to a digital IO pin tsl. setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS); When you/* medium resolution and speed */ // press the button it will change to a new pixel animationtsl. setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS); Note that you need to press the/* 16-bit data but slowest conversions */ button once to start the first animation!
#include <VirtualWire /* Update these values depending on what you've set above! */ Serial.h>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
float humidityValue = 0;
int luxValue = 0;
float hygrometryValue distanceValue = 0;
int i;
int nombre;
String buffeur;
//Serial.println("nouveau msg");
for (i = 0; i <= buflen; i++)
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());
luxValue=(ficelle.substring(4,6).toInt());
distanceValue=(ficelle.substring(6,8).toInt());
motionValue=(ficelle.substring(8,9).toInt());
 
//Serial.print(luxValue);
//Serial.println(" lux");
}
}
//============== 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 =émetteur ==0;float hygrometryValue =0;
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>void setup() {#include <VirtualWire Serial.h> begin(9600); vw_setup(2000); // Bits par seconde vw_set_rx_pin(RADIO_PIN); // Vous devez télécharger et installer la librairie VirtualWire broche DATA du récepteur vw_rx_start(); Serial.h dans votre dossier println("Virtual wire started");} void loop() { //librariesGet 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.#include { int i; int nombre; //Serial.println("DHTnouveau msg"); for (i = 0; i <= buflen; i++) { ficelle+=char(buf[i]); // msg lettre par lettre.hbuf[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());#include<stdlib //Serial.print(luxValue); //Serial.h>println(" lux");
// les broches ici vous pouvez appeler vos propres fonctions destinées à tirer partie 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);variables récupérées juste avant
// les capteurs I2C }// 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#define SWITCHPIN 2 // le compteur à incrémenterint truc = 0;============= FIN DU LOOP ==============================
// le tableau des valeurs#define NUMVALUES 12float sensValues[NUMVALUES];============== emplacements de vos fonctions ==============================
////////////////////////////////////////////////
//message à envoyer.const char *msg="abcdefghijih";ici toute la logique de votre programme
// ses élements : les valeurs des capteurschar *tempValue; // variable de températurechar *humidityValue; // variable % hygrométrie de l'airchar *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 ========= fonctions à ne pas modifier ==============================
//ajouter ici les fonctions Adafruit pour Neopixel par exemple<///////////////////////////////////////////////////////////pre>
// 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 =récepteur pour capteur temp+hygro unsigned long latestSendingMillis DHT seul= 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;
<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!
void setup(){ Serial#include <VirtualWire.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();}h>
////////////////////////// le loooooooop ///////////////////////////////////////
#define RADIO_PIN 3 // broche DATA du récepteur RF
void loop(){// message reçu. time float tempValue = millis()0; getTemp(time)float humidityValue = 0; //getMsgContent(time)int luxValue = 0; //on l'imprime sendMsg(time)float hygrometryValue = 0; // on doit assembler les valeurs en tableau de char}
////////////////////////// les fonctions ///////////////////////////////////////
void getTempsetup(long time) { float t; float h; if (time - latestDHTSensingMillis > sensingDHTIntervalMillis){ //Serial.printlnbegin("get"9600); t = dht.readTemperature vw_setup(2000); // Bits par seconde h = dht.readHumidity vw_set_rx_pin(RADIO_PIN); // broche DATA du récepteur if (isnan(t) || isnan(h)) Serial.println vw_rx_start("capteur DHT injoignable!"); else itoa(t, tempValue, 5); itoa(h, humidityValue, 5); latestDHTSensingMillis = time; return; Serial.println(" Virtual wire started"); Serial.print("Temperature : "); Serial.println(t); Serial.print("Humidity : "); Serial.println(h); Serial.println(" "); latestDHTSensingMillis = time; return; }
}
void sendMsgloop(long time){ // Get current button state. uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN;{ String ficelle=""; if (time - latestSendingMillis > sendingIntervalMillisvw_get_message(buf, &buflen))// On test afin de savoir si un message est reçu. { int i; int nombre; //Serial.println("Msgnouveau msg"); vw_send for (i = 0; i <= buflen; i++) { ficelle+=char(uint8_t *buf[i]); // msg, strlenlettre par lettre. buf[4] == 5ème lettre envoyée } ficelle[buflen] = '\0'; Serial.print(msg)"ficelle : "); vw_wait_tx Serial.println(ficelle); // On attend la fin de juste après commence l'envoi appel de fonction qui ajuste les variables //on récupère une sous-partie du msgmessage ficelle.substring(0,2) // qu'on convertit en entier .toInt() latestSendingMillis tempValue= time(ficelle.substring(0,2).toInt()); delay humidityValue=(ficelle.substring(2,4).toInt(25)); }
}
char buildMyTempValue(char tempValue)//============== FIN DU LOOP =============================={ return;//============== emplacements de vos fonctions ==============================} //============== fonctions à ne pas modifier ==============================
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>
[[Catégorie:Projets]]=== code d'exmple pour le PIR (détecteur de mouvement infrarouge ===[[Catégorie:Edna]][[Catégoriehttps:Workshops]]//learn.adafruit.com/pir-passive-infrared-proximity-motion-sensor/using-a-pir
Emailconfirmed
471
modifications