[résolu] changement d’état d'un INT

bonjour,

j'ai un petit problème qui pour vous serra surement une broutille facile à résoudre.

je cherche désespérément à passer un int de l'etat 0 a l'etat 1 (et accessoirement à remettre à 0) grâce a un clavier 4X4 . j'utilise un afficher 16X2 pour controler l'ensemble des données entrées

pour le moment c'est un test pour pouvoir l’intégrer après dans un autre programme.

j'ai beau retourner le truc dans tous les sens j'y arrive pas.

avec ce bout de code il ne se passe rien apres l'affichage "entrez valeur "

int test =0;

void setup()
{
  lcd.begin(16, 2);
  delay(1000);


  lcd.print("entrez valeur");
  char key = keypad.getKey();
  while (key == 1)
    {
       test = 1;
      lcd.print("valeur entree");
      lcd.setCursor(0, 1);
     lcd.print(test);
    }
  }

Merci a ceux qui répondrons..

les exemples des librairies sont souvent intéressant==> custom keypad

/* @file CustomKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Demonstrates changing the keypad size and key values.
|| #
*/
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'0','1','2','3'},
  {'4','5','6','7'},
  {'8','9','A','B'},
  {'C','D','E','F'}
};
byte rowPins[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7, 6, 5, 4}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey){
    Serial.println(customKey);
  }
}

Merci mais ça ne m'aide pas vraiment ,
Disons que si je met ma commande dans le loop ca fonctionne. Mais des lors que je la déplace rien ne se passe.

Ta boucle While ne sort jamais puisque tant que Test== 1 puis tu mets test = 1

Donc tu ne retournes jamais à la ligne "char key = keypad.getKey();" :wink:

Oups j'ai mal lu ^^

En fait dès que tu appuis tu passes Key à 1 et tu restes dans la boucle while sans en sortir.

Le getKey devrait e^tre dans ta boucel et si le resultat est différent de 1 alors tu en sors si besoin :wink:

Lol didou76.. (ca m'arrive aussi, je dirais rien....)

En fait ce que je veux c'est afficher sur l'écran une demande de commande, tant que cette commande en l'occurrence la valeur du clavier 1 n'est pas entree le programme attend ! ..

PS.Pour l'affichage je sais faire

teste ça

int test =0;
void setup()
{
  lcd.begin(16, 2);
  delay(1000);


  lcd.print("entrez valeur");
  char key = keypad.getKey();
  while (key != 1)                 //tant que key est différent de 1 alors on exécute la boucle 
    {                              // qui est entre accolades  
       char key = keypad.getKey(); // on lit la Key en permanence
    }
      test = 1;                   // on est sorti de al boucle
      lcd.setCursor(0, 1);
      lcd.print("valeur entree");
      lcd.print(test);            // pourquoi pas key?
    
  }

ça marche pas non plus,

bloqué a l'affichage" entrez valeur"
et rien j'ai beau appuyer sur toutes les touches ça donne rien

pour répondre a la question de l'affichage du pourquoi pas key, en fait jai besoin d'afficher quel est la valeur reel de test, et pas de la valeur de "key" au moment de l'appuis, ca me sert plus tard dans la lecture des valeurs rentrées via un menu.

le but de ce changement d'etat d'une int et de valider ou non une fonction:
si test = 1; on active (dans mon cas) l'envoie de sms
si test = 0; on envois pas de sms

j'aurais pus le faire en boolean mais il me semblais plus simple de le faire avec une int
( j'ai pas encore étudié le boolean donc ça reste un peut vague pour moi )

voila mon but alors tous les conseils lien ou autre sont les bienvenue.

un lien en MP ( je ne sais pas si je peux le mettre en direct)

bonjour,
tu peux faire ceci, si j'ai bien compris ton soucis

void loop(){
  lcd.print("entrez valeur");
  char key = keypad.getKey();
test = 0;
switch (key) {
    case 1:
    test = 1; // soit mettre la ligne et faire un if après
    envoi_sms(); // soit envoyer direct vers un void
    break;

    case 2 :
    test = 3;
    break;
}

} // fin loop

void envoi_sms(){
......;
}

ça ne fonctionne pas non plus j'ai "entrez valeur" qui défile en continue sur l'ecran.

mais l'idée est la

je n'ai besoin que de l'information d'etat de test soit 0 soit 1 je rajouterais dans la suite un if etat de test pour valider ou non l'envoi de sms.
ca ne renvoie pas directement a un void envoie_sms

le 1er code que tu nous a posté en #1, il est complet ?
je ne voie aucune init du clavier

non il est pas complet
de plus comme je lai dit au 1er post c'est un sketch test pour le moment une fois fonctionnel je l’intégrerais a mon programme définitif qui lui fait pas loin de 500 lignes

pour le sketch test le voici complet
comme vous pouvez le voir avec les branchement je suis avec une mega

je met le programme dans le setup car je veux qu'il s’exécute qu'une seul fois

#include <Keypad.h>
#include <LiquidCrystal.h>

int test = 0;

LiquidCrystal lcd(53, 51, 49, 47, 45, 43);

const byte ROWS = 4; 
const byte COLS = 4; 
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'Q'},
  {'4', '5', '6', 'H'},
  {'7', '8', '9', 'B'},
  {'0', 'G', 'D', 'E'}
};
byte rowPins[ROWS] = {52, 50, 48, 46};
byte colPins[COLS] = {44, 42, 40, 38};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );



void setup() {
  
  lcd.begin(16, 2);
  delay(1000);
   lcd.print("entrez valeur");
  
  char key = keypad.getKey();
test = 0;
switch (key) {
    case 1:
    test = 1; // soit mettre la ligne et faire un if après
    //envoi_sms(); // soit envoyer direct vers un void... pas besoin dans mon cas 
                   // puisqu'il me faut l'info de test seulement 
    lcd.setCursor(0,1);
    lcd.print(test);
    break;

    case 2 :
    test = 3;
    lcd.setCursor(0,1);
    lcd.print(test);
    break;
}
 }

 void loop(){
 

} // fin loop

tu peux tester

#include <Keypad.h>
#include <LiquidCrystal.h>

int test = 0;

LiquidCrystal lcd(53, 51, 49, 47, 45, 43);

const byte ROWS = 4; 
const byte COLS = 4; 
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'Q'},
  {'4', '5', '6', 'H'},
  {'7', '8', '9', 'B'},
  {'0', 'G', 'D', 'E'}
};
byte rowPins[ROWS] = {52, 50, 48, 46};
byte colPins[COLS] = {44, 42, 40, 38};

Keypad clavier = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );



void setup() {
  
  lcd.begin(16, 2);
  delay(1000);
   lcd.print("entrez valeur");
  
  char key = clavier.getKey();
test = 0;
switch (key) {
    case 1:
    test = 1; // soit mettre la ligne et faire un if après
    //envoi_sms(); // soit envoyer direct vers un void... pas besoin dans mon cas 
                   // puisqu'il me faut l'info de test seulement 
    lcd.setCursor(0,1);
    lcd.print(test);
    break;

    case 2 :
    test = 3;
    lcd.setCursor(0,1);
    lcd.print(test);
    break;
}
 }

 void loop(){
 

} // fin loop

déjà avant de faire ce genre de chose, il faut savoir si le clavier renvoie bien ce que tu lui demande
il y a un exemple dans la lib
donne nous le résultat si ca fonctionne ou non avec l'exemple démo

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

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

void loop(){
  char key = keypad.getKey();

  if (key != NO_KEY){
    Serial.println(key);
  }
}

infobarquee:
déjà avant de faire ce genre de chose, il faut savoir si le clavier renvoie bien ce que tu lui demande
il y a un exemple dans la lib
donne nous le résultat si ca fonctionne ou non avec l'exemple démo

Le clavier fonctionne très bien je n'ai aucun soucis de ce côté la,
D'ailleurs Si tu relis mon post #2 j'ai marqué que ça fonctionne dans le loop mais pas si je le met ailleur comme dans le setup

si je fait ça:

void loop(){
 
  char key = keypad.getKey();
    if(key!=NO_KEY){
    lcd.setCursor(0, 0);
    lcd.print(key);
    }
    if (key == '1'){
       test = 1; 
      lcd.setCursor(0,1);
      lcd.print(test);
     }
     if(key == '0'){
      test = 0;
     lcd.setCursor(0, 1);
    lcd.print(test);
   }
  
  if (key== 'Q'){
   lcd.clear();
}
}

j'ai bien sur la ligne 1 la valeur de la touche entrée qui est remplacée pas la touche suivante appuyé
et sur la deuxième ligne la valeur de test qui passe de 0 a 1 en fonction de l'appuis sur 0 ou 1 au clavier
pour moi ce code fonctionne comme il le faut sauf qu'il ne fonctionne que dans le loop j'arrive pas par exemple en mettant ce bout de code dans un void EtatTest() a le faire fonctionner !

donc, si tu fais le code suivant, ca ne marche pas

void loop()
{
  saisie();
}

void saisie()
{
  char key = keypad.getKey();
  if (key != NO_KEY)
  {
    lcd.setCursor(0, 0);
    lcd.print(key);
  }
  if (key == '1')
  {
    test = 1;
    lcd.setCursor(0, 1);
    lcd.print(test);
  }
  if (key == '0')
  {
    test = 0;
    lcd.setCursor(0, 1);
    lcd.print(test);
  }

  if (key == 'Q')
  {
    lcd.clear();
  }
}

Si ça marche tant que saisie() est dans le loop, si je le met ailleur ca marche plus, et mon besoin est justement qu'il ne soit pas dans le loop.

Bonjour,
Là, il y a un problème. Ton Arduino, après le setup() tourne en rond en permanence dans le loop().

Icare --> tu peux préciser ? Je comprend pas