Le but est de savoir si le pot est rempli d'eau ou s'il faut arroser la plante, pour cela il suffi de tester l'humidité de la terre.
Chaque capteurs d'humidité va renvoyer une valeur qu'il faudra interpréter en couleur (rouge pour "c'est sec" et bleu pour "il y a de l'eau"). On allume les LED correspondantes au capteur en faisant un dégradé sur les LEDs intermédiaires.
Vue que le pot est profond (environ 50 cm de terre), j'ai prévu de mettre plusieurs sondes d'humidité :
Les sondes d'humidité vont être dans la terre, qui est un milieu corrosif. Il est donc nécessaire de rendre les soudures des sondes étanches, pour cela c'est tout simple : il faut un pistolet à colle et mettre une grosse boule sur chaque soudures.
EDIT : Au bout de 1 mois dans la terre, j'ai remarqué que les sondes étaient totalement hors d'usage car la partie métallique a été complétement rongée (voir photo). J'ai donc décidé de la recouvrir d'étain pour la protéger. Pour cela, il faut se munir d'un fer à souder et de recouvrir la partie métallique d'étain, comme pour une soudure classique.
Ici, j'ai représenté 4 connections possibles pour les sondes d'humidité, mais seulement 3 seront utilisée dans le code.
/**
* This sketch will display humidity level on a LEDs strip.
* You need :
* - Adressable RVB LEDs strip.
* - Humidity sensors (type YL39-69) plugged on Analogic port (A1 to A4)
*
* Programm setting :
* -> NbSensors : You need to settup le number of sensors you use (4 max).
* -> NUMPIXELS : The number of pixels you hav in your LEDs strip.
*
* @Author : (c) Alexandre PERETJATKO 2017.
* -----------------------------------------------------------------------------------------------------
*/
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
// ----------------------------------------------------------------------------------
// THE NUMBER OF LEDS YOU WILL USE
#define NUMPIXELS 12
#define LEDPIN 6
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, LEDPIN, NEO_GRB + NEO_KHZ800);
// ----------------------------------------------------------------------------------
// YL-39 + YL-69 humidity sensor
// Sensor must be connected to the A1 - A4 pin (Sensor number 1 to A1, Sensor number 2 to A2, ... )
int NbSensors = 3;
int humidityMaxValue = 1023;
byte humidity_sensor_vcc = 6;
void setup() {
// This initializes the NeoPixel library.
pixels.begin();
pixels.setBrightness(30);
// Init the humidity sensors board
pinMode(humidity_sensor_vcc, OUTPUT);
digitalWrite(humidity_sensor_vcc, LOW);
// Setup Serial (for debug)
/*
while (!Serial);
delay(1000);
Serial.begin(9600);
*/
}
void loop() {
Serial.println();
for ( int i = 1; i <= NbSensors; i++) {
Serial.print("Humidity du capteur ");
Serial.print(i);
Serial.print(" : ");
Serial.println(read_humidity_sensor(i));
}
Serial.println();
AfficheCouleurs();
delay(500);
}
int read_humidity_sensor(int NumSensor) {
int value = 0;
digitalWrite(humidity_sensor_vcc, HIGH);
delay(500);
switch (NumSensor) {
case 1 :
value = analogRead(A1);
break;
case 2 :
value = analogRead(A2);
break;
case 3 :
value = analogRead(A3);
break;
case 4 :
value = analogRead(A4);
break;
}
digitalWrite(humidity_sensor_vcc, LOW);
return humidityMaxValue - value;
}
void AfficheCouleurs() {
// Calcul de la couleur
// Pas d'eau = Rouge
// beaucoup d'eau = bleu
/*
int couleur = value / 2.5;
if( couleur > 255 ) couleur = 255;
int R = 255 - couleur;
int V = 0;
int B = couleur;
// Mise ? jour de la LED du capteur.
pixels.setPixelColor(NumSensor - 1, pixels.Color(R, V, B));
pixels.show(); // This sends the updated pixel color to the hardware.
*/
int R, V, B;
int couleur;
int value = 0;
int value2 = 0;
int numPixel = 0;
int sensor;
int interval = (NUMPIXELS / NbSensors); // C'est le nombre de leds (entre celle des capteurs) dont il faut calculer la valeur
Serial.print("interval=");
Serial.println(interval);
for ( sensor = 1; sensor < NbSensors; sensor++) {
// Recuperation de la valeur du capteur
value = read_humidity_sensor(sensor);
// Calcul de la couleur
couleur = value / 2.5;// * 255 / humidityMaxValue;
if ( couleur > 255 ) couleur = 255;
R = 255 - couleur;
V = 0;
B = couleur;
Serial.print(" *");
Serial.print(couleur);
Serial.print("* ");
// Alumage de la led du capteur
pixels.setPixelColor(numPixel , pixels.Color(R, V, B)); numPixel++;
// alumage des leds entre celles des capteurs
value2 = abs( value - read_humidity_sensor(sensor + 1) ) / interval ;
for ( int i = 1; i <= interval; i++) {
couleur = abs(value - (value2 * i)) / 2.5;
if ( couleur > 255 ) couleur = 255;
R = 255 - couleur;
V = 0;
B = couleur;
Serial.print(couleur);
Serial.print(" ");
pixels.setPixelColor(numPixel, pixels.Color(R, V, B)); numPixel++;
}
}
// la derni?re led
value = read_humidity_sensor(NbSensors);
couleur = value / 2.5;
if ( couleur > 255 ) couleur = 255;
R = 255 - couleur;
V = 0;
B = couleur;
Serial.print(" *");
Serial.print(couleur);
Serial.print("* ");
value = read_humidity_sensor(sensor + 1);
pixels.setPixelColor(numPixel , pixels.Color(R, V, B));
pixels.show(); // This sends the updated pixel color to the hardware.
}