Skip to main content

Arroseur automatique de plante


Informations

  • Sean RAMS
  • ramsean2001@gmail.com
  • Master informatique : SESI
  • 02/06/2023 - 20/06/2023
 

Contexte

Afin de préserver les plantes du fablab, je me vue attribuer la création d'arroseur automatique pour les diverse plante du fablab.

Objectifs

RĂ©aliser des arroseur automatique pour diverses plantes 

Matériel

  • Arduino uno
  • 3 led
  • Pompe
  • Cateure d'humiditĂ© sol

Machines utilisées

Aucune 

Construction

(Fichiers, photos, code, explications, paramètres d'usinage, photos, captures d'écran...)

Étape 1

----

Étape 2

----

Étape 3

----

 

Journal de bord

02/06 Premier pas dans le projet: 

int sensorPin = A0;
int sensorValue = 0;
int PinR = 7;
int PinV = 8;
int PinB = 4;


void setup() {
    Serial.begin(9600);
    pinMode(PinR,OUTPUT);
    pinMode(PinV,OUTPUT);
    pinMode(PinB,OUTPUT);
    }
void loop() {
    // read the value from the sensor:
    sensorValue = analogRead(sensorPin);
    Serial.print("Moisture = " );
    Serial.println(sensorValue);
    if (sensorValue < 300){
      digitalWrite(PinV,HIGH);    
      digitalWrite(PinR,LOW);
    }
    else {
      digitalWrite(PinR,HIGH);    
      digitalWrite(PinV,LOW);
    }
    delay(1000);
}

15/06 Test d'utilisation de la pompe.


int sensorPin = A0;
int sensorValue = 0;
int PinR = 7;
int PinV = 8;
int PinB = 4;
int pompe = 2;
int serial = 101;

void setup() {
    Serial.begin(9600);
    pinMode(PinR,OUTPUT);
    pinMode(PinV,OUTPUT);
    pinMode(PinB,OUTPUT);
    pinMode(pompe,OUTPUT);
    }
void loop() {
    // read the value from the sensor:
   /* sensorValue = analogRead(sensorPin);
    Serial.print("Moisture = " );
    Serial.println(sensorValue);
    if (sensorValue < 300){
      digitalWrite(PinV,HIGH);    
      digitalWrite(PinR,LOW);
    }
    else {
      digitalWrite(PinR,HIGH);    
      digitalWrite(PinV,LOW);
    }*/

    if (serial >'5' ){
      digitalWrite(pompe,HIGH);
    }else{
      digitalWrite(pompe,LOW);
    }
    if(Serial.available() > 0)  {
      serial= Serial.read();
    }
    Serial.println(serial);
    delay(1000);
}

L'idée est de combiner la pompe et le capteur pour alimenter la plante lorsque la terre est séche.

Code fonctionnel pour arroser une plante en fonction de l'humidité de sa terre.

int sensorPin = A0;
int sensorValue = 0;
int PinR = 7;
int PinV = 8;
int PinB = 4;
int pompe = 2;
void setup() {
    Serial.begin(9600);
    pinMode(PinR,OUTPUT);
    pinMode(PinV,OUTPUT);
    pinMode(PinB,OUTPUT);
    pinMode(pompe,OUTPUT);
    
     digitalWrite(pompe,LOW);
    }
void loop() {
    // read the value from the sensor:
    sensorValue = analogRead(sensorPin);
    Serial.print("Moisture = " );
    Serial.println(sensorValue);
    if (sensorValue > 300){
      
      digitalWrite(PinV,HIGH);    
      digitalWrite(PinR,LOW);
    }
    else {
      
      digitalWrite(PinR,HIGH);    
      digitalWrite(PinV,LOW);
      digitalWrite(pompe,HIGH);
      delay(3000);

    }
    
    digitalWrite(pompe,LOW);
    delay(3000);
}

DĂ©but de la programmation en tache distincte pour essayer d'utiliser plusieurs capteur/pompe sur une Arduino.

/*
int sensorPin = A0;
int sensorValue = 0;
int PinR = 7;
int PinV = 8;
int PinB = 4;
int pompe = 2;
*/

#define MAX_WAIT_FOR_TIMER 4

unsigned int waitFor(int timer, unsigned long period){
  static unsigned long waitForTimer[MAX_WAIT_FOR_TIMER];  // il y a autant de timers que de tâches périodiques
  unsigned long newTime = micros() / period;              // numéro de la période modulo 2^32 
  int delta = newTime - waitForTimer[timer];              // delta entre la période courante et celle enregistrée
  if ( delta < 0 ) delta = 1 + newTime;                   // en cas de dépassement du nombre de périodes possibles sur 2^32 
  if ( delta ) waitForTimer[timer] = newTime;             // enregistrement du nouveau numéro de période
  return delta;
}

enum {EMPTY, FULL};

struct mailbox_s {
  int state;
  int val;
};

struct mailbox_s mb = {.state = EMPTY};

//tache pour la lecteur d'un des capteurs.


struct CaptHum{
  int timer;
  unsigned long period;
  int pin;  
}

void setup_hum( struct CaptHum * ctx,struct mailbox_s * mb, int timer, unsigned long period, byte pin){
  ctx->timer = timer;
  ctx->period = period;
  ctx->pin = pin;
  pinMode(ctx->pin,INPUT);
}

void loop_lum( struct CaptLum * ctx,struct mailbox_s * mb) {
  if (!waitFor(ctx->timer, ctx->period)) return;          // sort s'il y a moins d'une période écoulée
  if (mb->state != EMPTY) return;  
  mb->val = analogRead(ctx->pin);
  mb->state=FULL;      
}  

//Tache d'activation de l'arosage

struct Active{
  int timer;
  unsigned long period;
  int pinpompe;
  int pinledR;
  int pinledV;  
}

void setup_active( struct CaptHum * ctx,struct mailbox_s * mb, int timer, unsigned long period, byte pin){
  ctx->timer = timer;
  ctx->period = period;
  ctx->pin = pin;
  pinMode(ctx->pin,INPUT);
}

void loop_active( struct CaptLum * ctx,struct mailbox_s * mb) {
  if (!waitFor(ctx->timer, ctx->period)) return;          // sort s'il y a moins d'une période écoulée
  if (mb->state != EMPTY) return;  
  mb->val = analogRead(ctx->pin);
  mb->state=FULL;      
}  

//tache qui desactive la pompe

struct Desactive{
  int timer;
  unsigned long period;
  int pinpompe;
  int pinledR;
  int pinledV;  
}

void setup_active( struct CaptHum * ctx,struct mailbox_s * mb, int timer, unsigned long period, byte pin){
  ctx->timer = timer;
  ctx->period = period;
  ctx->pin = pin;
  pinMode(ctx->pin,INPUT);
}

void loop_active( struct CaptLum * ctx,struct mailbox_s * mb) {
  if (!waitFor(ctx->timer, ctx->period)) return;          // sort s'il y a moins d'une période écoulée
  if (mb->state != EMPTY) return;  
  mb->val = analogRead(ctx->pin);
  mb->state=FULL;      
} 


void setup() {
    /*
    Serial.begin(9600);
    pinMode(PinR,OUTPUT);
    pinMode(PinV,OUTPUT);
    pinMode(PinB,OUTPUT);
    pinMode(pompe,OUTPUT);
    digitalWrite(pompe,LOW);    
    */
    }
void loop() {
    /*
    // read the value from the sensor:
    sensorValue = analogRead(sensorPin);
    Serial.print("Moisture = " );
    Serial.println(sensorValue);
    if (sensorValue > 300){
      
      digitalWrite(PinV,HIGH);    
      digitalWrite(PinR,LOW);
    }
    else {
      
      digitalWrite(PinR,HIGH);    
      digitalWrite(PinV,LOW);
      digitalWrite(pompe,HIGH);
      delay(3000);

    }
    
    digitalWrite(pompe,LOW);
    delay(3000);
    */
}

16/06 : Code pouvant utiliser plusieurs capteur et pompe sur un seul arduino (pour seulement deux dans ce code)

/*
int sensorPin = A0;
int sensorValue = 0;
int sensorPin2 = A1;
int sensorValue2 = 0;
int PinR = 7;
int PinV = 8;
int PinB = 4;
int pompe = 2;
*/

#define MAX_WAIT_FOR_TIMER 4

unsigned int waitFor(int timer, unsigned long period){
  static unsigned long waitForTimer[MAX_WAIT_FOR_TIMER];  // il y a autant de timers que de tâches périodiques
  unsigned long newTime = millis() / period;              // numéro de la période modulo 2^32 
  int delta = newTime - waitForTimer[timer];              // delta entre la période courante et celle enregistrée
  if ( delta < 0 ) delta = 1 + newTime;                   // en cas de dépassement du nombre de périodes possibles sur 2^32 
  if ( delta ) waitForTimer[timer] = newTime;             // enregistrement du nouveau numéro de période
  return delta;
}

enum {EMPTY, FULL};

struct mailbox_capteur {
  int state;
  int val;
};

struct mailbox_timer {
  int state;
  unsigned long time_stop;
};

//tache pour la lecteur d'un des capteurs.


struct CaptHum{
  int timer;
  unsigned long period;
  int pin;  
};

void setup_hum( struct CaptHum * ctx,struct mailbox_capteur * mb_cap, int timer, unsigned long period, int pin){
  
  //Initialisation des timer et period pour le waitfor permetant d'organiser les taches.
  ctx->timer = timer;
  ctx->period = period;
 
  ctx->pin = pin;
}

void loop_hum( struct CaptHum * ctx,struct mailbox_capteur * mb_cap, struct mailbox_timer *mb_time ) {

  if (mb_cap->state != EMPTY) return;
  if (mb_time->state != EMPTY) return;
  if (!waitFor(ctx->timer, ctx->period)) return;          // sort s'il y a moins d'une période écoulée
    
  
  mb_cap->val = analogRead(ctx->pin);

  Serial.print(String("Moisture ")+String(ctx->timer)+String(" = ") );
  Serial.println(mb_cap->val);

  mb_cap->state=FULL;      
}  

//Tache d'activation de l'arosage

struct Active{
  int pinpompe;
  int pinledR;
  int pinledV;
  int seuil;
  int time_active;  
};

void setup_active( struct Active * ctx, int pinpompe, int pinledR, int pinledV, int seuil, unsigned long time_active){
  
  //Initialisation des pin de la pompe, des led rouge et vert pour une tache active 
  ctx->pinpompe = pinpompe;
  ctx->pinledR = pinledR;
  ctx->pinledR = pinledR;
  
  //Setup des différente pin utiliser.
  pinMode(ctx->pinpompe,OUTPUT);
  pinMode(ctx->pinledR,OUTPUT);
  pinMode(ctx->pinledV,OUTPUT);
  
  //Initialisation des variable pour activer la pompe et sa durée
  ctx->seuil = seuil;
  ctx->time_active = time_active;

  //DĂ©sactive la pompe dans son setup
  digitalWrite(ctx->pinledR,LOW);    
  digitalWrite(ctx->pinledV,HIGH); 
  digitalWrite(ctx->pinpompe,LOW);
}

void loop_active( struct Active * ctx, struct mailbox_capteur * mb_cap, struct mailbox_timer * mb_time) {
  //Test des différentes condiction avant d'activer la pompe  
  if (mb_cap->state != FULL) return;
  if (mb_cap->val <= ctx->seuil ) {
    //Alumage de la led rouge et de la pompe (+ Ă©tient la led vert) pour signaler que la plante est arroser 
    digitalWrite(ctx->pinledR,HIGH);    
    digitalWrite(ctx->pinledV,LOW);
    digitalWrite(ctx->pinpompe,HIGH);  
    
    //Initialise la mailbox pour Ă©tiendre la pompe    
    mb_time->time_stop =  millis() + ctx->time_active;
    mb_time->state=FULL;
    Serial.println(String("Pompe active ")+ctx->pinpompe);
  }
  mb_cap->state = EMPTY;       
}  

//tache qui desactive la pompe

struct Desactive{
  int pinpompe;
  int pinledR;
  int pinledV; 
};

void setup_desactive( struct Desactive * ctx, int pinpompe, int pinledR, int pinledV){

  ctx->pinpompe = pinpompe;
  ctx->pinledR = pinledR;
  ctx->pinledV = pinledV;
  
  pinMode(ctx->pinpompe,OUTPUT);
  pinMode(ctx->pinledR,OUTPUT);
  pinMode(ctx->pinledV,OUTPUT);

  
  digitalWrite(ctx->pinledR,LOW);    
  digitalWrite(ctx->pinledV,HIGH); 
  digitalWrite(ctx->pinpompe,LOW);
}

void loop_desactive( struct Desactive * ctx, struct mailbox_timer * mb_time) {
  Serial.println(String("mb time desa = ")+mb_time->state+" "+mb_time->time_stop);
  Serial.println(String("millis = ")+millis());
  if (mb_time->state != FULL) return;  
  if( millis()>= mb_time->time_stop){
    digitalWrite(ctx->pinledR,LOW);    
    digitalWrite(ctx->pinledV,HIGH); 
    digitalWrite(ctx->pinpompe,LOW);
    Serial.println("Pompe desactive "+ctx->pinpompe);
    mb_time->state = EMPTY;  
  }      
} 

// Declaration des tache et des mailbox

//mail box
struct mailbox_capteur mb_cap0 = {.state = EMPTY};
struct mailbox_timer mb_time0 = {.state = EMPTY};

struct mailbox_capteur mb_cap1 = {.state = EMPTY};
struct mailbox_timer mb_time1 = {.state = EMPTY};

//tache
struct CaptHum Hum0;
struct Active acti0;
struct Desactive desa0;

struct CaptHum Hum1;
struct Active acti1;
struct Desactive desa1;

void setup() {
  Serial.begin(9600);

  setup_hum(&Hum0, &mb_cap0, 0, 1000, A0);  
  setup_active(&acti0, 2, 7, 8, 400, 2000);
  setup_desactive(&desa0, 2, 7, 8);
  
  setup_hum(&Hum1, &mb_cap0, 0, 1000, A1);  
  setup_active(&acti1, 12, 13, 22, 400, 2000);
  setup_desactive(&desa1, 12, 13, 22);
}
void loop() {
  loop_hum(&Hum0, &mb_cap0, &mb_time0);  
  loop_active(&acti0, &mb_cap0, &mb_time0);
  loop_desactive(&desa0, &mb_time0);

  
  loop_hum(&Hum1, &mb_cap1, &mb_time1);  
  loop_active(&acti1, &mb_cap1, &mb_time1);
  loop_desactive(&desa1, &mb_time1);
}