Incrémenter une valeur par un appui sur un bouton (résolu)

Bonjour à tous.

je suis débutant en programmation et encore plus en électronique, donc navré pour le pavé de code indigeste et le manque de précisions à venir :cold_sweat:

Plateforme = Arduino UNO R3
Projet = Contrôle de température et de taux d'humidité avec sonde DHT22 et affichage sur lcd, possibilité de controler la température cible (avec action sur relais 220V)
Comportement souhaité = lors de l'appui sur un bouton, la température cible doit s'incrémenter de 1

Code =

#include <dht.h>
#include <LiquidCrystal.h>

#define DHT22_PIN 13
float cibletemp = 20;
float ciblehumi = 60;
float maxtemp = 30;
float mintemp = 10;

int boutonplus=8;
int etat_plus=0;
int prev_etat_plus=0;

dht DHT;

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

void setup() {
  
 pinMode(boutonplus,INPUT);
  
  // Set up DHT22 Sensor
 Serial.begin(115200);
 Serial.println("DHT TEST PROGRAM ");
 Serial.print("LIBRARY VERSION: ");
 Serial.println(DHT_LIB_VERSION);
 Serial.println();
 Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
  
  // set up the LCD's number of columns and rows
  lcd.begin(16, 2); 

  
}



void loop()
{
   
 // Modification temp
 int val=digitalRead(boutonplus);
 
 if((val==HIGH) && (prev_etat_plus==LOW)){
   etat_plus= 1 - etat_plus;
   delay(10);
 }
 
 prev_etat_plus=val;
 
 if(etat_plus==0){
 cibletemp = cibletemp+1; 
 } else {
 cibletemp = cibletemp;
 }
 
 if(cibletemp < 10){
   cibletemp = 10;
 }
 if(cibletemp > 30){
   cibletemp = 10;
 }
  // lecture données sonde temp et humi, sortie sur serial
  Serial.print("DHT22, \t");
  int chk = DHT.read22(DHT22_PIN);
  switch (chk)
  {
    case DHTLIB_OK:  
                Serial.print("OK,\t");
                break;
    case DHTLIB_ERROR_CHECKSUM:
                Serial.print("Checksum error,\t");
                break;
    case DHTLIB_ERROR_TIMEOUT:
                Serial.print("Time out error,\t");
                break;
    default:
                Serial.print("Unknown error,\t");
                break;
  }
  // DISPLAY DATA
 // Serial.print(DHT.humidity, 1);
 // Serial.print(",\t");
 // Serial.println(DHT.temperature, 1);
 // delay(1000);

  // Print a message to the LCD. à améliorer pour prendre compacter tout ça

  lcd.setCursor(0, 0);
  lcd.print("T=");
  lcd.print(DHT.temperature, 1);
  lcd.print("c Cible");
  lcd.print(cibletemp);
  lcd.setCursor(0, 1);
  lcd.print("H=");
  lcd.print(DHT.humidity, 1);
  lcd.print("% Cible");
  lcd.print(ciblehumi);
// Délai nécessaire pour la sonde de temp/humi
  delay(2000);
  
}

Donc voila, après avoir lu pas mal de topics, j'ai réussi à faire en sorte que lors d'un appui sur le bouton la valeur cibletemp s'incrémente de +1 par cycle jusqu'à un autre appui sur le même bouton... Seulement je préfèrerais un incrément par pression et si j'ai bien compris il vas me falloir utiliser les interruptions car je dois faire patienter le code 2 secondes mini pour relire la sonde (à confirmer, la sonde est absente pour le moment)...

Si vous aviez quelques pistes, je vous en serais reconnaissant :wink:

Bon déjà ça n'a pas de rapport mais j'ai bien rigolé sur cette ligne

 } else {
 cibletemp = cibletemp;
 }

xD

Je suis sur de comprendre ton problème : tu veux que la température s'incrémente tant que tu restes appuyé sur le bouton c'est ça ?

ok il faut avouer que le else je l'ai rempli .... pour rien :grin:

ce que je souhaite c'est Appui sur le bouton = +1 pour cibletemp peu importe la durée d'appui (pas 20 minutes non plus hein)

Il faut tester l'appui pour faire plus un.
Faire une pause d'une dizaine de ms pour masquer les rebonds.
Attendre le relâcher du bouton avant de continuer.

ha oui en effet .... tellement logique que je m'étais perdu XD

Merci pour l'info, je vais tâcher de voir cela ce soir... et coller un résolu si ok :wink:

EDIT = et une couche de Dirty Code, une ]:smiley:

#include <dht.h>
#include <LiquidCrystal.h>

#define DHT22_PIN 13

float cibletemp = 20;
float ciblehumi = 60;
float maxtemp = 30;
float mintemp = 10;
int boutonPlus = 8;
int etat = 0;

dht DHT;

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

void setup() {
  
  pinMode(boutonPlus, INPUT);
  

  
  // Set up DHT22 Sensor
 Serial.begin(115200);
 Serial.println("DHT TEST PROGRAM ");
 Serial.print("LIBRARY VERSION: ");
 Serial.println(DHT_LIB_VERSION);
 Serial.println();
 Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
  
  // set up the LCD's number of columns and rows
  lcd.begin(16, 2); 
}

void loop()
{   
 // Modification temp

etat = digitalRead(boutonPlus);
if (etat == HIGH){
    cibletemp = cibletemp+1;
  } 
 
 if(cibletemp < 10){
   cibletemp = 10;
 }
 
 if(cibletemp > 30){
   cibletemp = 10;
 }
 
  // READ DATA
  Serial.print("DHT22, \t");
  int chk = DHT.read22(DHT22_PIN);
  switch (chk)
  {
    case DHTLIB_OK:  
                Serial.print("OK,\t");
                break;
    case DHTLIB_ERROR_CHECKSUM:
                Serial.print("Checksum error,\t");
                break;
    case DHTLIB_ERROR_TIMEOUT:
                Serial.print("Time out error,\t");
                break;
    default:
                Serial.print("Unknown error,\t");
                break;
  }
  // DISPLAY DATA
 // Serial.print(DHT.humidity, 1);
 // Serial.print(",\t");
 // Serial.println(DHT.temperature, 1);
 // delay(1000);

  // Print a message to the LCD.

  lcd.setCursor(0, 0);
  lcd.print("T=");
  lcd.print(DHT.temperature, 1);
  lcd.print("c Cible");
  lcd.print(cibletemp);
  lcd.setCursor(0, 1);
  lcd.print("H=");
  lcd.print(DHT.humidity, 1);
  lcd.print("% Cible");
  lcd.print(ciblehumi);
  delay(2000);
  
}

La méthode me semble un poil sauvage mais étant donné que je ne boucle que toutes les 2 secondes ça vas

au final c'est une incrémentation tant que le bouton est pressé, pas tout à fait ce que je voulais à la base mais au final plus pratique

Merci de m'avoir mis sur la piste, ça fait plaisir

j'ai adapté mon code pour utiliser les interruptions

#include "dht.h"

 
#define DHT22_PIN 9
 
dht DHT;

int humi = 0;
int temp = 0;

int cibleTemp = 20;
int cibleHumi = 60;
 
const int boutonTemp = 2;
const int boutonHumi = 3;

int memoire_boutonTemp = HIGH;
int memoire_boutonHumi = HIGH;

int etat_bouton;



const int relaisT = 7;
const int relaisH = 8; 
 
 
void setup(){
    Serial.begin(9600);
    delay(1000);
 attachInterrupt(0, TempPlus, LOW);
 attachInterrupt(1, HumiPlus, LOW);
  pinMode(boutonTemp, INPUT);
  pinMode(boutonHumi, INPUT);
  pinMode(relaisT, OUTPUT); 
  pinMode(relaisH, OUTPUT);  

}

void TempPlus(){    
       //lecture de l'état du bouton d'incrémentation
   etat_bouton = digitalRead(boutonTemp);
 
   //Si le bouton a un état différent que celui enregistré ET que cet état est "appuyé"
   if((etat_bouton != memoire_boutonTemp) && (etat_bouton == LOW))
   {
     cibleTemp = cibleTemp+1; //on incrémente la variable qui indique combien de LED devrons s'allumer
   }
 
   memoire_boutonTemp = etat_bouton; //on enregistre l'état du bouton pour le tour suivant
 
}

void HumiPlus(){    
       //lecture de l'état du bouton d'incrémentation
   etat_bouton = digitalRead(boutonHumi);
 
   //Si le bouton a un état différent que celui enregistré ET que cet état est "appuyé"
   if((etat_bouton != memoire_boutonHumi) && (etat_bouton == LOW))
   {
     cibleHumi = cibleHumi+5; //on incrémente la variable qui indique combien de LED devrons s'allumer
   }
 
   memoire_boutonHumi = etat_bouton; //on enregistre l'état du bouton pour le tour suivant

 
}

void loop(){
  int chk = DHT.read22(DHT22_PIN);
  
    humi = DHT.humidity, 1;
    temp = DHT.temperature, 1;
 
        Serial.print("Humidite :");
        Serial.print(humi);
        Serial.print(" %\t");
        Serial.print("Temperature :");
        Serial.print(temp);
        Serial.println(" *C");
        Serial.print("Cible Humidite :");
        Serial.print(cibleHumi);
        Serial.print(" %\t");
        Serial.print("Cible Temperature :");
        Serial.print(cibleTemp);
        Serial.println(" *C");
    
if (temp < cibleTemp-1){
digitalWrite(relaisT, HIGH);
  } 
  
if (temp > cibleTemp+1){
digitalWrite(relaisT, LOW);
  } 
  
  
if (humi > cibleHumi){
digitalWrite(relaisH, HIGH);
  } 
  
if (humi < cibleHumi){
digitalWrite(relaisH, LOW);
  } 

 if(cibleTemp < 5){
   cibleTemp = 5;
 }
 
 if(cibleTemp > 30){
   cibleTemp = 5;
 }
 

  if(cibleHumi < 20){
   cibleHumi = 20;
 }
 
 if(cibleHumi > 90){
   cibleHumi = 20;
 }    
    
    delay(1000);

   
}