[Conseil] Serre automatisé - Problème lancement fonction

Bonjour à tous,

Je suis en réalisation d’un boitier permettant de gérer une serre complète ( Système aquaponique dans la serre mais qui sera programmé plus tard ).

Jeune Noob dans le domaine de l’arduino j’aurais besoin de vos lumières.

Mon boitier se compose comme telle :

1 arduino Mega
1 LCD I2C 20x4
1 Horloge RT1302
1 DHT 11 ( Qui sera remplacer par un DHT22 quand il arrivera afin d’avoir également les T° négatives)
un Keypad 4x4

J’ai réussi à coder un petit bout de code, mais quand je veux mettre en route mon 1er mode ( appuie sur la touche 1 du keypad ) il faut que j’appuie une nouvelle fois sur la touche 1 pour lancer ma fonction qui ne se lance pas automatiquement. J’espere avoir été compris :o :confused:

Voici mon bout de code

#include <DHT.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 
#include <RTClib.h> 
#include <Key.h>
#include <Keypad.h>

#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif


#define DHTPIN 4 
#define DHTTYPE DHT11 
DHT dht(DHTPIN, DHTTYPE);

uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0}; 
RTC_DS1307 RTC;
LiquidCrystal_I2C lcd(0x27,20,4); // 

int intracteur = 26;
int extracteur = 23;
int brasseur = 25;
int lampe_1 = 24;
int lampe_2 = 22;

const byte LIGNES = 4;          
      const byte COLONNES = 4;    
     
      // déclaration des des broches ---
      const int L1=12;
      const int L2=11;
      const int L3=10;
      const int L4=9;
     
      const int C1=8;
      const int C2=7;
      const int C3=6;
      const int C4=5;
     
      //--- Définition des touches
      char touches[LIGNES][COLONNES] = {
            {'1','2','3','A'},
            {'4','5','6','B'},
            {'7','8','9','C'},
            {'*','0','#','D'}
      };
     
      // tableaux de lignes et colonnes
      byte BrochesLignes[LIGNES] = {L1, L2, L3, L4};
      byte BrochesColonnes[COLONNES] = {C1, C2, C3, C4};
     
      char touche; // variable de stockage valeur touche appuyée
      byte colonne, ligne;
      // --- Déclaration de l'afficheur
   
      Keypad clavier = Keypad( makeKeymap(touches), BrochesLignes, BrochesColonnes, LIGNES, COLONNES );
    

 bool runCro = false;    
    
      void setup()       {

     pinMode(extracteur,OUTPUT);
    pinMode(17, OUTPUT);         
  digitalWrite(17, HIGH); 

  dht.begin();
  Wire.begin();
  RTC.begin();
  delay(10);
  RTC.adjust(DateTime(__DATE__, __TIME__));
  delay(10);

   
     
        
     
      colonne=0;
      ligne=0;
            lcd.init();
            lcd.begin(20, 4);        
            delay(10);                
     
            // Test de l'afficheur
            lcd.backlight();
            lcd.setCursor(0,0);
            lcd.print("--------------------") ;
            lcd.setCursor(0,1);
            lcd.print("| Serre automatise |") ;
             lcd.setCursor(0,2);
            lcd.print("|    V1 par Roms   |") ;
            lcd.setCursor(0,3);
            lcd.print("--------------------") ;
            delay(5000);              
            lcd.clear();
            delay(10);     
            char touche = clavier.getKey();

         
   
        
      
      }  

 

      void loop()       {  



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

        
  
  


            DateTime now = RTC.now();
   
   lcd.setCursor(15,0);
  lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print(now.minute(), DEC);
     lcd.setCursor(0,2);
     lcd.print("Humidite :");
     lcd.print(h);
     lcd.print("%");
      lcd.setCursor(0,3);
      lcd.print("Temperature :");
      lcd.print(t);
      lcd.print(" C");
      if(touche != NO_KEY)
 {
  if( touche == 'A')
  {
    runCro = true;

  }
 }    
  if(runCro == true)
  {
   
   lcd.setCursor(0,0);
     lcd.print("Croissance :");     
  }     
       

  }      

void cro()
{
   int h = dht.readHumidity();
  int t = dht.readTemperature();

  if(t>23)
{
   digitalWrite(extracteur, HIGH);
}
if(t<22)
{
   digitalWrite(extracteur, LOW);
}
}

Merci d’avance de l’aide que vous pourrez m’apporter.

vous ne pensez pas que ce serait mieux de lire l'appui dans la loop() plutôt qu'une seule fois dans le setup() avec en plus une variable locale et pas la globale?

[s][color=red]char[/color][/s] touche = clavier.getKey();

Excusez moi, mais votre code est intrigant:
j'avais parié que l'appui sur la touche 1 que vous évoquez se traduirait par un test
if ('1' == touche)
ou
if (touche == '1')
ou
un switch ... case. et je n'ai rien vu de tel.
Cependant, vous testez bien l'égalité de touche à 'A' sans me choquer... mais nulle part à '1'

Peut être voue êtes vous trompé de version? (explique l'inconsistence entre la description et ce que le programme fait, en première lecture .... si j'ose dire....)
En passant, votre code sera plus confortable à lire (pour vous et tout le monde) une fois indenté -l'IDE d'arduino a un bouton pour ça, dans outils/tools - ... et comparer un boolean à true se simplifie (l'optimiseur le fait, mais je trouve la version simple plus facile à lire...)
Edité : lu la question de JML qui résoud une hénaurme partie de votre problème ... je ne détruis pas mon post, parce que, même une fois le clavier décodé au bon endroit, vous ne gèrerz pas la touche '1'...

Bonjour à tous,

Après avoir modifier mon code et mit le touche=clavier.getKey(); dans la loop ma fonction se lance et se désactive avec 1 seul appuie bouton.

Merci pour votre aide.

bravo :slight_smile:

le point de @dbrion06 est cependant tout à fait pertinent, il ne faut pas comparer avec 'A' mais avec '1'....

Peut être que monsieur Roms629 a changé d'avis (n'aurait besoin que d'un poussoir ou mettrait en place les boutons au fur et à mesure que de nouveaux besoins se manifestent).... ou que sa description est erronée.... mais si ça marche et active beaucoup de fonctions sophistiquées, c'est déjà merveilleux.