Outils pour utilisateurs

Outils du site


capteurs_humidite-temperature_lumiere_et_ph

Ceci est une ancienne révision du document !


Principe de fonctionnement

Réunir un ensemble de 4 capteurs :

  • humidité
  • température
  • lumière
  • PH

Capteurs + cable + arduino uno + ecran LCD pour une lecture des données sur un écran LCD

Matériel utilisé :

  • Capteurs température et humidité CYTX DHT11
  • Résistance de 10 KOhm
  • écran LCD 84×48 nokia 5110 module avec rétroéclairage bleu et adaptateur PBC
  • Résistance de 1 KOhm
  • Capteur de lumière : photorésistance
  • Sonde PH : 1 Set Liquide PH 0-14 + BNC Électrode de PH sonde Pour Arduino
  • Arduino uno R3 (chinois)

avec driver port serie pour Mac : CH341SER_Mac 0xcf.com/2015/03/13/chinese-arduinos-with-ch340-ch341-serial-usb-chip-on-os-x-yosemite/ cable USB (port USB périphérique)

Pour commencer il a fallu réunir les capteurs (humidité, température, luminosité) relier à un écran LCD, pour ce faire j'ai fait appel à plusieurs tutoriels en ligne que j'ai associé en un, grâce à l'aide de nombreuses personnes des Open Ateliers version Longue2017, un grand merci à toutes et tous.

'''Pour le capteur de température et d'humidité DHT11 :'''

'''Voici le code associant CapteurLUX, capteur DHT11 et écran LCD :'''

' inclure une librairie pour l'ecranLCD nokia 5110 (chinois)' <code> #include “U8glib.h” #include “dht.h” (pas réussi à l'installer) #define dht_apin A1 #define backlight_pin 11 dht DHT; const byte BROCHE_CAPTEUR = A1; float temperature = 0.0; float humidity = 0.0; const byte DHT_SUCCESS = 0; Pas d'erreur const byte DHT_TIMEOUT_ERROR = 1; Temps d'attente dépassé const byte DHT_CHECKSUM_ERROR = 2; Données reçues erronées const byte photocellPin = A0; int photocellPin = 0; the cell and 10K pulldown are connected to a0 int photocellReading; the analog reading from the analog resistor divider String Lumiere; branchements pin U8GLIB_PCD8544 u8g(8, 4, 7, 5, 6); CLK=8, DIN=4, CE=7, DC=5, RST=6 affichage ecran LCD const uint8_t brainy_bitmap[] PROGMEM = { void draw() { u8g.drawBitmapP( 37, 0, 6, 50, brainy_bitmap); put bitmap u8g.setFont(u8g_font_profont11); select font u8g.drawStr(0, 10, “T: ”); put string of display at position X, Y u8g.drawStr(0, 20, “H: ”); u8g.setPrintPos(15, 10); set position u8g.print1)

1)
int) temperature); display temperature from DHT11 u8g.drawStr(30, 10, “c ”); u8g.setPrintPos(15, 20); u8g.print((int) humidity); display humidity from DHT11 u8g.drawStr(30, 20, “% ”); u8g.drawStr(0, 30, “L: ”); u8g.setPrintPos(15, 30); u8g.print((String) Lumiere);
  
 u8g.drawStr(0, 40, "L: "); 
 u8g.setPrintPos(15, 40);
 u8g.print((String) photocellReading);
   
} void setup(void) {
byte BROCHE_CAPTEUR=A1;
 /* Initialisation du port série */
Serial.begin(115200);
Serial.println(F("Demo DHT11 et DHT22"));
//float temperature, humidity;
 
/* Place la broche du capteur en entrée avec pull-up */
pinMode(BROCHE_CAPTEUR, INPUT_PULLUP);
analogWrite(backlight_pin, 50);  /* Set the Backlight intensity */
} void loop(void) {
mesurerTemperatureHumidite();
mesurerLumiere();
 
// picture loop
//appel de foncton
u8g.firstPage();  
do {
  //draw(temperature, humidity);
  draw();
} while( u8g.nextPage() );

/* Pas plus d'une mesure par seconde */
// N.B. Avec le DHT22 il est possible de réaliser deux mesures par seconde
delay(1000);
} void mesurerLumiere(void) {
photocellReading = analogRead(photocellPin);
Serial.print("Analog reading = ");
Serial.print(photocellReading); // the raw analog reading
// We'll have a few threshholds, qualitatively determined
if (photocellReading < 10) {
  Serial.println(" - Noir"); Lumiere= "Noir";
} else if (photocellReading < 200) {
  Serial.println(" - Sombre"); Lumiere= "Sombre";
} else if (photocellReading < 500) {
  Serial.println(" - Lumiere"); Lumiere= "lumiere";
} else if (photocellReading < 800) {
  Serial.println(" - Lumineux"); Lumiere= "lumineux";
} else {
  Serial.println(" - Tres lumineux"); Lumiere= "tres lumineux";
}
//delay(500);
} ##############fonction qui mesure la réponse du capteur de la température et de l'humidité ######### void mesurerTemperatureHumidite() { N.B. Remplacer readDHT11 par readDHT22 en fonction du capteur utilisé ! switch (readDHT11(BROCHE_CAPTEUR, &temperature, &humidity)) { case DHT_SUCCESS: Serial.print(F(“Humidite (%): ”)); Serial.println(humidity, 2); Serial.print(F(“Temperature (^C): ”)); Serial.println(temperature, 2); break; case DHT_TIMEOUT_ERROR: Serial.println(F(“Pas de reponse !”)); break; case DHT_CHECKSUM_ERROR: Serial.println(F(“Pb de communication !”)); break; } N.B. Avec le DHT22 il est possible de réaliser deux mesures par seconde delay(1000); } byte readDHT11(byte pin, float* temperature, float* humidity) { byte data[5]; byte ret = readDHTxx(pin, data, 18, 1000); if (ret != DHT_SUCCESS) return ret; *humidity = data[0]; *temperature = data[2]; return DHT_SUCCESS; } byte readDHT22(byte pin, float* temperature, float* humidity) { byte data[5]; byte ret = readDHTxx(pin, data, 1, 1000); if (ret != DHT_SUCCESS) return ret; int fh = data[0]; fh *= 256.0; fh += data[1]; fh *= 0.1; *humidity = (float) fh * 0.1; int ft = data[2] & 0x7f; ft *= 256; ft += data[3]; ft *= 0.1; if (data[2] & 0x80) { ft *= -1; } *temperature = (float) ft; return DHT_SUCCESS; } byte readDHTxx(byte pin, byte* data, unsigned long start_time, unsigned long timeout) { data[0] = data[1] = data[2] = data[3] = data[4] = 0; start_time est en millisecondes timeout est en microsecondes uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); volatile uint8_t *ddr = portModeRegister(port); Registre MODE (INPUT / OUTPUT) volatile uint8_t *out = portOutputRegister(port); Registre OUT (écriture) volatile uint8_t *in = portInputRegister(port); Registre IN (lecture) unsigned long max_cycles = microsecondsToClockCycles(timeout); *out |= bit; PULLUP *ddr &= ~bit; INPUT delay(100); Laisse le temps à la résistance de pullup de mettre la ligne de données à HIGH *ddr |= bit; OUTPUT *out &= ~bit; LOW delay(start_time); Temps d'attente à LOW causant le réveil du capteur N.B. Il est impossible d'utilise delayMicroseconds() ici car un délai de plus de 16 millisecondes ne donne pas un timing assez précis. noInterrupts(); *out |= bit; PULLUP delayMicroseconds(40); *ddr &= ~bit; INPUT timeout = 0; while(!(*in & bit)) { if (++timeout == max_cycles) { interrupts(); return DHT_TIMEOUT_ERROR; } } timeout = 0; while(*in & bit) { if (++timeout == max_cycles) { interrupts(); return DHT_TIMEOUT_ERROR; } } for (byte i = 0; i < 40; ++i) { unsigned long cycles_low = 0; while(!(*in & bit)) { if (++cycles_low == max_cycles) { interrupts(); return DHT_TIMEOUT_ERROR; } } unsigned long cycles_high = 0; while(*in & bit) { if (++cycles_high == max_cycles) { interrupts(); return DHT_TIMEOUT_ERROR; } } data[i / 8] «= 1; if (cycles_high > cycles_low) { data[i / 8] |= 1; } } interrupts(); byte checksum = (data[0] + data[1] + data[2] + data[3]) & 0xff; if (data[4] != checksum) return DHT_CHECKSUM_ERROR; else return DHT_SUCCESS; delay(5000); Delay of 5sec before accessing DHT11 (min - 2sec) } </code> ===== 'Pour le circuit avec la sonde PH' ====== 'voici les références :' circuit-phmetre.pdf les plus intéressantes : en anglais : http://scidle.com/how-to-use-a-ph-sensor-with-arduino/ en français : https://matdomotique.wordpress.com/2017/07/17/utilisation-dun-module-chinois-de-mesure-de-ph/ https://forum.arduino.cc/index.php?topic=390751.0 'voici le code' <code> const int analogInPin = A0; int sensorValue = 0; unsigned long int avgValue; float b; int buf[10],temp; void setup() { Serial.begin(9600); } void loop() { for(int i=0;i<10;i++) { buf[i]=analogRead(analogInPin); Serial.print(buf[i]); Serial.print('\n'); delay(10); } for(int i=0;i<9;i++) { for(int j=i+1;j<10;j++) { if(buf[i]>buf[j]) { temp=buf[i]; buf[i]=buf[j]; buf[j]=temp; } } } avgValue=0; for(int i=2;i<8;i++) avgValue+=buf[i]; float pHVol=(float)avgValue*5.0/1024/6; float phValue = -5.70 * pHVol + 21.34; Serial.print(“sensor = ”); Serial.println(phValue); delay(20); } </code>
capteurs_humidite-temperature_lumiere_et_ph.1584025394.txt.gz · Dernière modification : 2020/03/12 15:03 de Benjamin Labomedia