Problème de code arrosage automatique

Bonjour j'ai comme projet de fabriquer un arrosage automatique pour une serre

J'ai prévu d'utiliser

  • 3 capteurs d'humidité
  • une électrovanne avec un relais
  • un LCD 16x2
  • un module Bluetooth HC 06
  • ( un Arduino évidemment )

J'ai écris le code (SystemGarden.ino) mais l'écran bloque le code a cause du délai (l'arduino met 5s pour mettre a jour les variables) donc je l'ai modifié pour ne presque plus attendre (SystemGardenWhithoutDelay.ino) mais les variables se retrouvent inversée sur mon app crée avec AppInventor2 je ne trouve pas d’où vient le problème.

Même si mon projet est un peu complexe, je pense qu'il est réalisable.

Si quelqu'un peu m'aider ce serait bien (même si j'ai toutes mes vacances pour le terminer)

Merci d'avance

SystemGarden.ino (4.3 KB)

SystemGardenWithoutDelay.ino (5.03 KB)

Peut pas lire le code depuis ma tablette simplement... postez avec les Balises en 2 posts séparés

Votre image:

SystemGarden.ino

#include <SoftwareSerial.h>                         
SoftwareSerial HC06(0,1);
 
#include <LiquidCrystal.h>
LiquidCrystal Lcd(7, 6, 5, 4, 3, 2);
 
 
double version = 1.7 ;
double seuilhumid = 0.0 ;
double timer = 0.0 ;
double humidite = 0.0 ;
 
bool etat = false ;
 
String trame = "";
String bluetoothname = "SystemGarden";
String bluetoothcode = "1234";
 
// make custom character:
byte icon[8] = {
  0b01110,
  0b01000,
  0b00100,
  0b01110,
  0b01000,
  0b01000,
  0b01010,
  0b01110
};
 
void DigitalWrite(int pinNumber, boolean status)
{
  pinMode(pinNumber, OUTPUT);
  digitalWrite(pinNumber, status);
}
 
 
void Arrosage();
 
void setup()
{
  HC06.begin(9600);
   
  Lcd.begin(16,2);
  // create a new character
  Lcd.createChar(0, icon);
 
  seuilhumid = 50.0 ;
 
  timer = 10.0 ;
 
  humidite = 49.07 ;
     
  Lcd.setCursor(0, 0);
  Lcd.print("SystemGarden" );
  Lcd.print(" " );
  Lcd.print(version );
  Lcd.print("                ");
 
  Lcd.setCursor(0, 1);
  Lcd.print("-" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("--" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("---" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("----" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("-----" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("-------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("--------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("---------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("----------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("-----------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("------------" );
  Lcd.print("                ");
   
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("-------------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("--------------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("---------------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("----------------" );
  Lcd.print("                ");
 
  delay(2000);
 
 }
void loop()
{
  while (!HC06.available()) {
 Lcd.setCursor(0, 0);
 Lcd.print("Info           " );
 Lcd.write(byte(0));
 Lcd.print("                ");
  
 Lcd.setCursor(0, 1);
 Lcd.print("Humidite:" );
 Lcd.print(humidite);
 Lcd.print("%");
 Lcd.print("                ");
 delay(2000);
  
/* Lcd.setCursor(0, 1);
 Lcd.print("Bluetooth:" );
 Lcd.print(bluetoothname);
 Lcd.print("                ");
 delay(2000);
 
 Lcd.setCursor(0, 1);
 Lcd.print("Code BT:" );
 Lcd.print(bluetoothcode);
 Lcd.print("                ");
 delay(2000);
 */
 Lcd.setCursor(0, 1);
 Lcd.print("Timer:" );
 Lcd.print(timer);
 Lcd.print("sec");
 Lcd.print("                ");
 delay(2000);
 
 Lcd.setCursor(0, 1);
 Lcd.print("Seuil:" );
 Lcd.print(seuilhumid);
 Lcd.print("%");
 Lcd.print("                ");
 delay(2000);
 
 humidite = (analogRead(0)+analogRead(1)+analogRead(2)) / 3 ;
 
 if (( (humidite) < (seuilhumid) ))
  { 
    Arrosage(); 
     
    } HC06.print(timer);
  HC06.print("x");
  HC06.print(humidite);
  HC06.print("x");
  HC06.print(seuilhumid);
  HC06.print("x");
  HC06.print(etat);
    }
  
 
  //réception données blutooth
 
 
  while (HC06.available()) {
   
    trame = HC06.readStringUntil('x');
    timer = trame.toInt();
     
    trame = HC06.readStringUntil('x');
    seuilhumid = trame.toInt();
         
    trame = HC06.readStringUntil('f');
    etat = trame;
  }
 
 if (etat == true){
 
  DigitalWrite(13, HIGH);
  DigitalWrite(12, HIGH);
  Lcd.setCursor(0, 0);
  Lcd.print("Arrosage        ");
  Lcd.setCursor(0, 1);
  Lcd.print("Manuel          ");
   
  }else if (etat == false){
 
DigitalWrite(13, LOW);
DigitalWrite(12, LOW);
Lcd.clear()  ;
  }
}
 
 
 
 
      
    
void Arrosage()
{
   
  DigitalWrite(13, HIGH);
  Lcd.setCursor(0, 1);
  Lcd.print("Arrosage ");
  Lcd.print(timer);
  Lcd.print("s");
  delay (timer * 1000);
  DigitalWrite(13, LOW);
}

SystemGardenWithoutDelay.ino

#include <SoftwareSerial.h>                         
SoftwareSerial HC06(0,1);
 
#include <LiquidCrystal.h>
LiquidCrystal Lcd(7, 6, 5, 4, 3, 2);
 
 
double version = 2.3 ;
double seuilhumid = 0.0 ;
double timer = 0.0 ;
double humidite = 0.0 ;
double statelcd = 1 ;
 
bool etat = false ;
 
String trame = "";
String bluetoothname = "SystemGarden";
String bluetoothcode = "1234";
 
unsigned long previousMillis = 0;       // Derniere activation
 
 
const long interval = 2000;  //Intervalle
 
// make bluetooth character:
byte icon[8] = {
  0b00100,
  0b00110,
  0b10101,
  0b01110,
  0b01110,
  0b10101,
  0b00110,
  0b00100
};
 
void DigitalWrite(int pinNumber, boolean status)
{
  pinMode(pinNumber, OUTPUT);
  digitalWrite(pinNumber, status);
}
 
 
void Arrosage();
void Arrosagemanuel();
 
 
void setup() {
 
//SETUP CODE
HC06.begin(9600);
   
  Lcd.begin(16,2);
  // create a new character
  Lcd.createChar(0, icon);
 
  seuilhumid = 50.0 ;
 
  timer = 10.0 ;
 
  humidite = 49.07 ;
     
  Lcd.setCursor(0, 0);
  Lcd.print("SystemGarden" );
  Lcd.print(" " );
  Lcd.print(version );
  Lcd.print("                ");
 
  Lcd.setCursor(0, 1);
  Lcd.print("-" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("--" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("---" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("----" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("-----" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("-------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("--------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("---------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("----------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("-----------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("------------" );
  Lcd.print("                ");
   
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("-------------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("--------------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("---------------" );
  Lcd.print("                ");
 
  delay( 100 );
 
  Lcd.setCursor(0, 1);
  Lcd.print("----------------" );
  Lcd.print("                ");
 
  delay(2000);
   
 Serial.begin(9600) ;
 
}
 
void loop() {
 
  Serial.println(etat);
 Lcd.setCursor(0, 0);
 Lcd.print("Info           " );
 Lcd.write(byte(0));
 Lcd.print("                ");
  
 humidite = (analogRead(0)+analogRead(1)+analogRead(2)) / 3 ;
 
 if (( (humidite) < (seuilhumid) ))
  { 
    Arrosage(); 
     
    }
      
  HC06.print(timer);
  HC06.print("x");
  HC06.print(humidite);
  HC06.print("x");
  HC06.print(seuilhumid);
   
 
  //réception données blutooth
 
 
  while (HC06.available()) {
   
    trame = HC06.readStringUntil('x');
    timer = trame.toInt();
     
    trame = HC06.readStringUntil('x');
    seuilhumid = trame.toInt();
         
    trame = HC06.readStringUntil('f');
    etat = trame;
    delay(500);
     
    if (etat == true){
     
    Arrosagemanuel();
    }
    else if (etat == false){
       
    }
     
     if (etat == true){
 
  DigitalWrite(13, HIGH);
  DigitalWrite(12, HIGH);
  Lcd.setCursor(0, 0);
  Lcd.print("Arrosage        ");
  Lcd.setCursor(0, 1);
  Lcd.print("Manuel          ");
   
  }else if (etat == false){
 
DigitalWrite(13, LOW);
DigitalWrite(12, LOW);
Lcd.clear()  ;
  }
  }
 
 
  /* Vérifie si la différence entre l'heure actuelle
  et le dernier clignotement supérieure à
  l'intervalle */
   
  unsigned long currentMillis = millis();
 
  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;
 
    // if the LED is off turn it on and vice-versa:
    if (statelcd == 1) {
 
     Lcd.setCursor(0, 1);
 Lcd.print("Humidite:" );
 Lcd.print(humidite);
 Lcd.print("%");
 Lcd.print("                ");
 statelcd = 2;
    } else if (statelcd == 2) {
 Lcd.setCursor(0, 1);
 Lcd.print("Bluetooth:" );
 Lcd.print(bluetoothname);
 Lcd.print("                ");
 statelcd = 3;
       
    }else if (statelcd == 3) {
 Lcd.setCursor(0, 1);
 Lcd.print("Code BT:" );
 Lcd.print(bluetoothcode);
 Lcd.print("                ");
 statelcd = 4;
       
    }else if (statelcd == 4) {
 Lcd.setCursor(0, 1);
 Lcd.print("Timer:" );
 Lcd.print(timer);
 Lcd.print("sec");
 Lcd.print("                ");
 statelcd = 5;
       
    }else if (statelcd == 5) {
 Lcd.setCursor(0, 1);
 Lcd.print("Seuil:" );
 Lcd.print(seuilhumid);
 Lcd.print("%");
 Lcd.print("                ");
 statelcd = 1;
       
    }
  }
}
 
 
 
// Void Arrosage et Arrosage manuel
 
 
 
void Arrosagemanuel()
{
  if (etat == true){
 
DigitalWrite(13, HIGH);
  Lcd.setCursor(0, 0);
  Lcd.print("Arrosage        ");
  Lcd.setCursor(0, 1);
  Lcd.print("Manuel          ");
   
  }else if (etat == false){
 
DigitalWrite(13, LOW);
Lcd.clear()  ;
  }
}
      
    
void Arrosage()
{
   
  DigitalWrite(13, HIGH);
  Lcd.setCursor(0, 1);
  Lcd.print("Arrosage ");
  Lcd.print(timer);
  Lcd.print("s");
  delay (timer * 1000);
  DigitalWrite(13, LOW);
}

Pourquoi mettre un software serial sur le port hardware ??SoftwareSerial HC06(0,1);utilisez directement Serial (mais débranchez votre module BT lors de l’upload et assurez vous des adaptions de tensions éventuellement si votre module ne supporte pas 5V)

C’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

et bien gérer le port série (Vous pouvez jeter un oeil à mon petit tuto sur le sujet )

J-M-L:
utilisez directement Serial (mais débranchez votre module BT lors de l’upload et assurez vous des adaptions de tensions éventuellement si votre module ne supporte pas 5V)

Comme ça ?

#include <LiquidCrystal.h>
LiquidCrystal Lcd(7, 6, 5, 4, 3, 2);


double version = 2.3 ;
double seuilhumid = 0.0 ;
double timer = 0.0 ;
double humidite = 0.0 ;
double statelcd = 1 ;

bool etat = false ;

String trame = "";
String bluetoothname = "SystemGarden";
String bluetoothcode = "1234";

unsigned long previousMillis = 0;       // Derniere activation


const long interval = 2000;  //Intervalle

// make bluetooth character:
byte icon[8] = {
  0b00100,
  0b00110,
  0b10101,
  0b01110,
  0b01110,
  0b10101,
  0b00110,
  0b00100
};

void DigitalWrite(int pinNumber, boolean status)
{
  pinMode(pinNumber, OUTPUT);
  digitalWrite(pinNumber, status);
}


void Arrosage();
void Arrosagemanuel();


void setup() {

//SETUP CODE
Serial.begin(9600);
  
  Lcd.begin(16,2);
  // create a new character
  Lcd.createChar(0, icon);

  seuilhumid = 50.0 ;

  timer = 10.0 ;

  humidite = 49.07 ;
    
  Lcd.setCursor(0, 0);
  Lcd.print("SystemGarden" );
  Lcd.print(" " );
  Lcd.print(version );
  Lcd.print("                ");

  Lcd.setCursor(0, 1);
  Lcd.print("-" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("--" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("---" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("----" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("-----" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("------" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("-------" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("--------" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("---------" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("----------" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("-----------" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("------------" );
  Lcd.print("                ");
  
  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("-------------" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("--------------" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("---------------" );
  Lcd.print("                ");

  delay( 100 );

  Lcd.setCursor(0, 1);
  Lcd.print("----------------" );
  Lcd.print("                ");

  delay(2000);
  


}

void loop() {

 
 Lcd.setCursor(0, 0);
 Lcd.print("Info           " );
 Lcd.write(byte(0));
 Lcd.print("                ");
 
 humidite = (analogRead(0)+analogRead(1)+analogRead(2)) / 3 ;

 if (( (humidite) < (seuilhumid) ))
  {  
    Arrosage();  
    
    }
     
  Serial.print(timer);
  Serial.print("x");
  Serial.print(humidite);
  Serial.print("x");
  Serial.print(seuilhumid);
  

  //réception données blutooth


  while (Serial.available()) {
  
    trame = Serial.readStringUntil('x');
    timer = trame.toInt();
    
    trame = Serial.readStringUntil('x');
    seuilhumid = trame.toInt();
        
    trame = Serial.readStringUntil('f');
    etat = trame;
    delay(500);
    Arrosagemanuel();
  }


  /* Vérifie si la différence entre l'heure actuelle 
  et le dernier clignotement supérieure à 
  l'intervalle */
  
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (statelcd == 1) {

     Lcd.setCursor(0, 1);
 Lcd.print("Humidite:" );
 Lcd.print(humidite);
 Lcd.print("%");
 Lcd.print("                "); 
 statelcd = 2;
    } else if (statelcd == 2) {
 Lcd.setCursor(0, 1);
 Lcd.print("Bluetooth:" );
 Lcd.print(bluetoothname);
 Lcd.print("                "); 
 statelcd = 3;
      
    }else if (statelcd == 3) {
 Lcd.setCursor(0, 1);
 Lcd.print("Code BT:" );
 Lcd.print(bluetoothcode);
 Lcd.print("                "); 
 statelcd = 4;
      
    }else if (statelcd == 4) {
 Lcd.setCursor(0, 1);
 Lcd.print("Timer:" );
 Lcd.print(timer);
 Lcd.print("sec");
 Lcd.print("                "); 
 statelcd = 5;
      
    }else if (statelcd == 5) {
 Lcd.setCursor(0, 1);
 Lcd.print("Seuil:" );
 Lcd.print(seuilhumid);
 Lcd.print("%");
 Lcd.print("                "); 
 statelcd = 1;
      
    }
  }
}



// Void Arrosage et Arrosage manuel



void Arrosagemanuel()
{
  if (etat == true){

DigitalWrite(13, HIGH);
  Lcd.setCursor(0, 0);
  Lcd.print("Arrosage        ");
  Lcd.setCursor(0, 1);
  Lcd.print("Manuel          ");
  
  }else if (etat == false){

DigitalWrite(13, LOW);
Lcd.clear()  ;
  }
}
     
   
void Arrosage()
{
  
  DigitalWrite(13, HIGH);
  Lcd.setCursor(0, 1);
  Lcd.print("Arrosage ");
  Lcd.print(timer);
  Lcd.print("s");
  delay (timer * 1000);
  DigitalWrite(13, LOW); 
}

Oui pour Serial, mais balancer le texte

  Serial.print(timer);
  Serial.print("x");
  Serial.print(humidite);
  Serial.print("x");
  Serial.print(seuilhumid);

sans marqueur de début ou fin de ligne c’est chercher les problèmes...

Il y a des détails qui sont pour le moins inesthétiques:

void Arrosagemanuel()
{
  if (etat == true){
 
DigitalWrite(13, HIGH);
  Lcd.setCursor(0, 0);
  Lcd.print("Arrosage        ");
  Lcd.setCursor(0, 1);
  Lcd.print("Manuel          ");
  
  }else if (etat == false){
 
DigitalWrite(13, LOW);
Lcd.clear()  ;
  }
}

(et d'autres bouts de code du même acabit, un peu partout)
Ce serait plus simple (etat est un booleen, n'est pas parragée evec une routine d'interruption et aucune des fonctions ne le met à jour)

void Arrosagemanuel() {
  if (etat ) {  // etat est un boolean
    DigitalWrite(13, HIGH);
    Lcd.setCursor(0, 0);
    Lcd.print("Arrosage        ");
    Lcd.setCursor(0, 1);
    Lcd.print("Manuel          ");
  
  }else{
    DigitalWrite(13, LOW);
   Lcd.clear()  ;
  }
}

(ca ne fait pas de faute, mais rend la (re)lecture et la correction difficiles)

Re bonjour

J'ai modifié le code avec vos infos mais le programme ne fonctionne toujours pas

/*


  Circuit Capteurs:
 * Capteurs S pin     to analog pin 0
 * Capteurs S pin     to analog pin 1
 * Capteurs S pin     to analog pin 2

  Circuit Bleutooth:
 * TXD                to digital pin 0 (RX)
 * RXD                to digital pin 1 (TX)

  Circuit Electrovanne et LED temoin:
 * LED temoin         to digital pin 9
 * Relais             to digital pin 8

  Circuit LCD:
 * LCD RS pin         to digital pin 7
 * LCD Enable pin     to digital pin 6
 * LCD D4 pin         to digital pin 5
 * LCD D5 pin         to digital pin 4
 * LCD D6 pin         to digital pin 3
 * LCD D7 pin         to digital pin 2
 * LCD R/W pin        to ground
 * LCD VSS pin        to ground
 * LCD VCC pin        to 5V
 * LCD VO pin (pin 3) to potentiometre

*/

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

double version = 2.3 ;
double seuilhumid = 50.0 ;
double timer = 10.0 ;
double humidite ;
double humid1 ;
double humid2 ;
double humid3 ;
double statelcd = 1;

bool etat = false ;

String trame;
String btname = "SystemGarden";
String btcode = "1234";

unsigned long lastMillis = 0;       // Derniere activation


const long intervalLCD = 2000;  //Intervalle

unsigned long lastMillisBT = 0;       // Derniere activation


const long intervalBT = 1000;  //Intervalle

// Make bluetooth character:
byte icon[8] = {
  0b00100,
  0b00110,
  0b10101,
  0b01110,
  0b01110,
  0b10101,
  0b00110,
  0b00100
};

void DigitalWrite(int pinNumber, boolean status)
{
  pinMode(pinNumber, OUTPUT);
  digitalWrite(pinNumber, status);
}


void Arrosage();
void Arrosagemanuel();



void setup() {



 // Set up Bluetooth module
  Serial.begin(9600);
  
 // Set up the LCD's number of columns and rows:
  lcd.begin(16, 2);

 // Create Bluetooth logo
  lcd.createChar(0, icon);
  lcd.setCursor(0, 0);
  
  lcd.print("SystemGarden " );
  lcd.print(version);
 
  delay( 2000 );
  
seuilhumid = 50.0 ;
timer = 10.0 ;
}

void loop() {

 // Lecture des capteurs
  humid1 = analogRead(0);
  humid2 = analogRead(1);
  humid3 = analogRead(2);
  
 // Moyenne des capteurs d'humidité 
 // humidite = (humid1+humid2+humid3) / 3 ; 
humidite = 60;
 // Verification du seuil
   if (( (humidite) < (seuilhumid) ))
  {  
      Arrosage();  
    
    }else {
      
      Arrosagemanuel();
      
          }
    
  
 //Réception données Blutooth
  if (Serial.available()) {
  
    trame = Serial.readStringUntil('x');
    timer = trame.toInt();
    
    trame = Serial.readStringUntil('x');
    seuilhumid = trame.toInt();
        
    trame = Serial.readStringUntil('f');
    etat = trame;  
    
    trame = "" ;
    
    }

 /* Vérifie si la différence entre l'heure actuelle 
 et le dernier clignotement est supérieure à l'intervalle */

  if (millis() - lastMillis >= intervalLCD) {
    
    lastMillis = millis() ;

 lcd.setCursor(0, 0);
 lcd.print("Info           " );
 lcd.write(byte(0));
    if (statelcd == 1) {

 lcd.setCursor(0, 1);
 lcd.print("Humidite:" );
 lcd.print(humidite);
 lcd.print("%");
 lcd.print("                "); 
 statelcd = 2;
    
    }/* else if (statelcd == 2) {
 lcd.setCursor(0, 1);
 lcd.print("BT:" );
 lcd.print(btname);
 lcd.print("                "); 
 statelcd = 3;
      
    }else if (statelcd == 2) {
 lcd.setCursor(0, 1);
 lcd.print("Code BT:" );
 lcd.print(btcode);
 lcd.print("                "); 
 statelcd = 3;
      
    }*/else if (statelcd == 2) {
 lcd.setCursor(0, 1);
 lcd.print("Timer:" );
 lcd.print(timer);
 lcd.print("sec");
 lcd.print("                "); 
 statelcd = 3;
      
    }else if (statelcd == 3) {
 lcd.setCursor(0, 1);
 lcd.print("Seuil:" );
 lcd.print(seuilhumid);
 lcd.print("%");
 lcd.print("                "); 
 statelcd = 1;
      
    }
  }


//________________________________________________________________//

  if (millis() - lastMillisBT >= intervalBT) {
    
    lastMillisBT = millis() ;
  
  // Envoi des données Blutooth
 
   //Serial.print("a"); 
   Serial.print(timer);
   Serial.print(","); 
   Serial.print(humidite);
   Serial.print(",");
   Serial.print(seuilhumid);
   Serial.print(",");
   //Serial.print("z");
  }
}


// Void Arrosage et Arrosage manuel

void Arrosagemanuel()
{
  if (etat){
     Arrosage();
  }
}
     
   
void Arrosage()
{
  
  DigitalWrite(8, HIGH);
  DigitalWrite(9, HIGH);
  
  lcd.clear()  ;
  lcd.setCursor(0, 1);
  lcd.print("Arrosage ");
  lcd.print(timer);
  lcd.print("s");
  
  delay (timer * 1000);
  
  DigitalWrite(9, LOW); 
  DigitalWrite(8, LOW);
  lcd.clear()  ;
}

Je ne vois pas d'où vient le problème même si je pense qu'il y en a plusieurs.

J'ai lu en diagonal (parce que les String m'énervent, il vaut mieux gérer ce que vous envoyez et recevez vous même avec la technique du tuto que j'ai mentionné plus haut) et clairement ce truc là ne va pas fonctionner

    trame = Serial.readStringUntil('f');
    etat = trame;

trame est une String, si vous voulez un booléen dans etat, il faut faire une comparaison