Publié le

Sonde humidité pour le sol

Ce soir, je vous propose de nous occuper de nos plantes vertes. on va prendre le cas d’une plante qui a besoin d’un taux d’humidité du sol supérieur à 75%, si le taux d’humidité est entre 50% et 75% il faut arroser et si on passe en dessous de 50% c’est critique.

Matériel requis :

  • Un Arduino NANO ;
  • 3 Résistances 330Ω;
  • Un capteur humidité pour le sol.

Le capteur :

Mon kit est en deux parties, une carte et la fourche à mettre dans le sol. Il y a deux possibilités pour le relier à l’Arduino :

  • D0 : sortie digitale qui va nous renvoyer soit 1, soit 0
  • A0 : sortie analogique qui nous renvoie une valeur entre 0 et 1023

Ici je ne vais m’intéresser qu’à la sortie analogique vu que je souhaite obtenir un taux d’humidité pour le sol.

Le montage :

humité sol_bb

Programmation :

Intoduction – Déclarations :

int pinA =A0;          // Pin Analogique du capteur
int Sensor = 3;        // Pin d'alimentation du capteur
int ledR = 4;          // Pin LED Rouge
int ledJ = 5;          // Pin LED Jaune
int ledV = 6;          // Pin LED Verte

Dans le Void Setup

void setup() {
 Serial.begin(9600);
 pinMode(pinA,INPUT);
 pinMode(ledR,OUTPUT);
 pinMode(ledJ,OUTPUT);
 pinMode(ledV,OUTPUT);
 pinMode(Sensor,OUTPUT);
}

Dans le Void loop :

void loop() {
digitalWrite(Sensor,HIGH);
delay(1000);
float h=analogRead(pinA);
float taux = (1023.0-h)/7.0;
 Serial.print(h);
 Serial.print(" ");
 Serial.println(taux);
 led(taux);
 digitalWrite(Sensor,LOW);
 delay(20000);

}

Dans le void led() :

void led(float taux)
{

  digitalWrite(ledV,LOW);
  digitalWrite(ledJ,LOW);
  digitalWrite(ledR,LOW);

  if (taux > 70)
      digitalWrite(ledV,HIGH);
      else {
        if (taux > 50)
            digitalWrite(ledJ,HIGH);
            else digitalWrite(ledR,HIGH);
          }
}

Résultat :

Si je laisse la sonde à l’air libre, pas de conduction entre les deux fourches de la sonde, valeur renvoyée sur le pin A0 : 1023, la led rouge est allumée.

IMG_2574

Si je met la sonde dans un verre d’eau, conduction entre les deux fourches de la sonde, valeur mesurée sur le pin A0 : 300, la led verte est allumée.

IMG_2575

Je passe l’explication mathématique pour définir l’équation d’une fonction affine, ce qui m’a permit de définir que

taux = (1023.0-h)/7.0;

Si je tiens la fourche de la sonde avec les doigts légèrement humides, j’obtiens une valeur intermédiaire qui allume la led jaune.

IMG_2576

 

Publié le

Capteur humidité / température DHT22

Et pourquoi ne pas se faire une petite station météo avec l’Arduino ?

Pour cela je vais vous parler aujourd’hui des sondes humidité – température DHT.

Il existe 2 types de DHT :

  • DHT11 : Précision humidité 5%, température 2°C
  • DHT22 : Précision humidité 2%, température 0,5°C

 

Matériel requis :

Le montage :

DHT

 

Programmation :

Intoduction – Déclarations :

#include <DHT.h>

#define DHTPIN 2                  // Declaration du pin du DHT

//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22

DHT dht(DHTPIN, DHTTYPE); // Initialisation du capteur

Dans le Void Setup

void setup() {
 Serial.begin(9600);
 Serial.print("Test du DHT");
 Serial.println(DHTTYPE);
 dht.begin();
}

Dans le Void loop

void loop(){
// Pause en début pour laisser le temps au capteur de démarrer
 delay(5000);

 float h = dht.readHumidity();
 float t = dht.readTemperature();

 Serial.print("Humidity: ");
 Serial.print(h);
 Serial.print(" %t");
 Serial.print("Temperature: ");
 Serial.print(t);
 Serial.println(" *C ");
}

Capture

Publié le

Controle d'un module Relais par une module RTC

Je vous ai déjà présenté les modules Relais et RTC, mais qu’en est il d’un module RTC qui pourrait commander un relais ?

 

Matériel requis :

  • Un Arduino MEGA;
  • 1 Résistances 330Ω;
  • Une led;
  • Un module RTC ici
  • Un module Relais ici

 

Le montage :

Pour le montage, on fait une fusion des deux concernant Relais et RTC :

RTC_relai

 

Programmation :

Intoduction – Déclarations :

#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC;                  // Declaration du module RTC

const int RELAIS = 3;           // Declaration broche 3 output
float temp;
boolean etatRelais = 0;

Dans le Void Setup

void setup() {
 pinMode(RELAIS, OUTPUT);      // Configure la broche RELAIS en sortie
 digitalWrite(RELAIS,0);       // On place le relais dans l'etat off
 Wire.begin();
 RTC.begin();
}

Dans le Void loop

void loop(){
heure();                      // On fait tourner la fonction heure
}

La fonction « heure »

void heure()
{
 DateTime now = RTC.now();                     // On récupère le temps actuel
 if (now.hour() <=17 && now.minute() <= 45)    // Boucle de condition avec des variables
 {
 etatRelais=1;                                 // Si la condition est respectée on allume la led
 digitalWrite(RELAIS,etatRelais);
 }
 else
 {
 etatRelais=0;                                 // Si la condition n'est pas respectée on éteint la led
 digitalWrite(RELAIS,etatRelais);
 }
}


Publié le

Module RTC et Arduino

Aujourd’hui je vais me pencher sur les modules RTC (Real Time Clock) et voir ce qu’on peut en faire avec un Arduino (Méga dans mon cas).

 

Matériel requis :

 

  • Un Arduino MEGA;
  • Un module RTC DS3231;

Description du module RTC :

 

Le module que j’ai choisit dispose d’une batterie Lithium pour nous permettre de de sauvegarder l’heure et la date si on le débranche (plus pratique qu’un module RTC sans pile).

IMG_2461

Dans cet exemple, nous n’allons utiliser que les entrée SDA et SCL (Nous verrons plus tard à quoi servent 32K et SQW).

Nous allons avoir besoin de deux librairies pour faire fonctionner le programme :

  • Wire.h qui est inclue dans les librairies Arduino
  • RTClib.h que vous pouvez trouver ici : RTClib.h

Pour connecter le module RTC sur un Arduino MEGA, il suffit juste de raccorder SCL sur le pin 21 et SDA sur le pin 20 ainsi que l’alimentation évidement !

RTC_bb

 

Programmation :

Premier test : 

#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC; // Avec cette librairie on déclare le DS3231 comme un DS1307

void setup() {
 Serial.begin(9600);
 Wire.begin();
 RTC.begin();
}

void loop() {
  //Affichage de l'heure
  DateTime now = RTC.now(); // Lit l'heure du module
  Serial.print(now.day(), DEC); // Affiche le jour
  Serial.print('/');
  Serial.print(now.month(), DEC); // Affiche le mois
  Serial.print('/');
  Serial.print(now.year(), DEC);  //Affiche l'année
  Serial.print(' ');
  Serial.print(now.hour(), DEC); //Affiche les heures
  Serial.print(':');
  Serial.print(now.minute(), DEC); // Affiche les minutes
  Serial.print(':');
  Serial.print(now.second(), DEC); // Affiche les secondes
  Serial.println();
  delay(3000);

}

Résultat :

Progr1

Ah non, nous ne sommes pas le 1er Janvier 2000 à minuit !

 

Mise à l’heure du module :

Nous allons ouvrir un nouvel onglet pour créer une fonction qui va mettre notre module à l’heure par rapport à l’heure de compilation du programme. Assez pratique même si nous aurons quelques secondes de décalage par rapport à l’heure de notre PC.

On modifie juste le « void setup » pour ajouter la fonction « reglageheure() »

void setup() {
 Serial.begin(9600);
 Wire.begin();
 RTC.begin();
reglageheure();
}

On ouvre un onglet pour la fonction avec le code suivant :

void reglageheure()
{
  Serial.println("Mise a l'heure");
  RTC.adjust(DateTime(__DATE__, __TIME__));
  DateTime now = RTC.now();
  Serial.print(now.day(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.year(), DEC);
  Serial.print(' ');
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
  delay(5000);
}

On compile et on ouvre le moniteur série :

mise à l'heure

Heure de mon iMac : 16:45:06

Heure du module RTC : 16:44:52

Nous avons donc 14 secondes d’écart entre les deux ce qui reste convenable.

 

Publié le

Commande d'éclairage de LEDs par un relais avec un Arduino

Les relais peuvent être utile pour commander un appareil en 220V à partir de l’Arduino. Par exemple on peut commander un éclairage, une pompe… Ici je vous propose de voir simplement comment fonctionne un relais :

 

Matériel requis :

  • Un Arduino Mega;
  • 2 Résistances 330Ω;
  • 2 LEDs (une bleu, une rouge);
  • Des fils;

Le montage :

 

Pour étudier le relais on va tester les deux sorties du relais, la led bleu sera allumée puis la rouge et ainsi de suite :

relais+led_bb

Programmation :

Programmation relativement simple ici, on change juste l’état du pin 3 pour faire commuter le relais :

const int RELAIS = 3; // On déclare le PIN sur lequel est connecté In1 du relais
boolean EtatRelais = 0; // On crée un booléen ( 0 - 1) pour définir l'état du PIN 3

void setup() {
  pinMode(RELAIS,OUTPUT); // On définit le pin 3 comme une sortie

}

void loop() {
  EtatRelais =! EtatRelais; // On inverse la valeur du booléen ( Note : "!=" signifie différent et "=!" donne l'inverse)
  digitalWrite(RELAIS,EtatRelais);
  delay(2500*);

}

 

Résultat :

Et voilà, on sait a présent faire fonctionner le relais.

Publié le

Organisation différente d'un programme Arduino

Aujourd’hui je ne vous propose pas un nouveau montage, mais plutôt de regarder comment on peut améliorer la visibilité dans un programme Arduino.

Le programme de base :

Je vais reprendre le programme que j’avais fait pour le capteur température avec l’afficheur LED à segments.

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2
OneWire ourWire(ONE_WIRE_BUS);
DallasTemperature sensors(&ourWire);



float temp;
int temp2;



int ledA = 13;
int ledB = 4;
int ledC = 8;
int ledD = 11;
int ledE = 12;
int ledF = 3;
int ledG = 5;
int Ana1 = 6;
int Ana2 = 7;
int Ana3 = 9;
int Ana4 = 10;

void setup() {
  Serial.begin(9600);
  pinMode(ledA, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(ledC, OUTPUT);
  pinMode(ledD, OUTPUT);
  pinMode(ledE, OUTPUT);
  pinMode(ledF, OUTPUT);
  pinMode(ledG, OUTPUT);
  pinMode(Ana1, OUTPUT);
  pinMode(Ana2, OUTPUT);
  pinMode(Ana3, OUTPUT);
  pinMode(Ana4, OUTPUT);
  sensors.begin();

}

void loop() {
   sensors.requestTemperatures();
  Serial.println(sensors.getTempCByIndex(0));
  temp2 = 10* sensors.getTempCByIndex(0);


for (int i=0; i<1000; i++)
    {

     int tab[3];
     tab[0] = temp2 % 10;
     tab[1] = (temp2 /10) % 10 ;
     tab[2] = temp2 /100 ;
     digitalWrite(Ana1,HIGH);
     digitalWrite(Ana2,LOW);
     digitalWrite(Ana3,LOW);
     digitalWrite(Ana4,LOW);
     affichenombre(tab[2]);
     delay(5);
     digitalWrite(Ana1,LOW);
     digitalWrite(Ana2,HIGH);
     digitalWrite(Ana3,LOW);
     digitalWrite(Ana4,LOW);
     affichenombre(tab[1]);
     delay(5);
     digitalWrite(Ana1,LOW);
     digitalWrite(Ana2,LOW);
     digitalWrite(Ana3,HIGH);
     digitalWrite(Ana4,LOW);
     digitalWrite(ledA,LOW);
     digitalWrite(ledB,LOW);
     digitalWrite(ledG,LOW);
     digitalWrite(ledF,LOW);
     digitalWrite(ledC,HIGH);
     digitalWrite(ledD,HIGH);
     digitalWrite(ledE,HIGH);
     delay(5);
     digitalWrite(Ana1,LOW);
     digitalWrite(Ana2,LOW);
     digitalWrite(Ana3,LOW);
     digitalWrite(Ana4,HIGH);
     affichenombre(tab[0]);
     delay(5);

    }
     digitalWrite(Ana1,LOW);
     digitalWrite(Ana2,LOW);

}

void affichenombre(int nombre)

{
  if (nombre != 1 && nombre !=4)
  digitalWrite(ledA,LOW);
  else digitalWrite(ledA,HIGH);

  if (nombre != 5 && nombre !=6)
  digitalWrite(ledB,LOW);
  else digitalWrite(ledB,HIGH);

  if (nombre != 2)
  digitalWrite(ledC,LOW);
  else digitalWrite(ledC,HIGH);

  if (nombre != 1 && nombre !=4 && nombre != 7)
  digitalWrite(ledD,LOW);
  else digitalWrite(ledD,HIGH);

  if (nombre != 1 && nombre != 3 && nombre != 4 && nombre != 5 && nombre != 7 && nombre !=9)
  digitalWrite(ledE,LOW);
  else digitalWrite(ledE,HIGH);

  if (nombre != 1 && nombre != 2 && nombre != 3 && nombre !=7)
  digitalWrite(ledF,LOW);
  else digitalWrite(ledF,HIGH);

  if (nombre != 0 && nombre != 1 && nombre !=7)
  digitalWrite(ledG,LOW);
  else digitalWrite(ledG,HIGH);

}

Personnellement, je le trouve très long à cause des fonctions. Comme j’aime bien avec des programmes propres, je vais mettre mes fonctions dans un autre fichier .ino !

Ajouter un fichier lié :

Capture1

On clique sur la petite flèche et sur « nouvel onglet » :

Capture2

On donne le nom de notre fonction, ici ça sera « affichenombre » (on ne met pas l’extension juste le nom de la fonction) et on y colle le code de notre fonction :

Capture3

Utilité :

Dans la plus part des programmes que j’écris et qui ont été présentés ici pour le moment, il n’y a aucune utilité à mettre les fonction dans un autre fichier, à part une meilleure visibilité dans le programme.

Cependant, quand on a besoin de récupérer une fonction en particulier dans un programme, on sait directement ou la trouver.