Programme capteur d'humidité

Oui, j'ai en effet rajouté la ligne. Cependant, il m'affiche toujours les chiffres un après l'autre.

Xaras:
Oui, j'ai en effet rajouté la ligne. Cependant, il m'affiche toujours les chiffres un après l'autre.

Fait voir ton code complet :wink:

Sinon il affiche les chiffres quand tu gardes le bouton appuyé ou quand tu fait rien ?

Oui il affiche les boutons.

/*********************

Example code for the Adafruit RGB Character LCD Shield and Library

This code displays text on the shield, and also reads the buttons on the keypad.
When a button is pressed, the backlight changes color.

**********************/

// include the library code:
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>

// The shield uses the I2C SCL and SDA pins. On classic Arduinos
// this is Analog 4 and 5 so you can't use those for analogRead() anymore
// However, you can connect other I2C sensors to the I2C bus and share
// the I2C bus.
Adafruit_RGBLCDShield spf = Adafruit_RGBLCDShield();

// These #defines make it easy to set the backlight color
#define RED 0x1
#define YELLOW 0x3
#define GREEN 0x2
#define TEAL 0x6
#define BLUE 0x4
#define VIOLET 0x5
#define WHITE 0x7

void setup() {
  // Debugging output
  Serial.begin(9600);
  // set up the LCD's number of columns and rows: 
  spf.begin(16, 2);

  // Print a message to the LCD. We track how long it takes since
  // this library has been optimized a bit and we're proud of it :)
  int time = millis();
  spf.print("Vous voici dans");
  delay(500);
  spf.clear();
  spf.print("le programme");
  delay(500);
  spf.clear();
  spf.print("Wetkeeper");
  delay(500);
  spf.clear();
  spf.print("Veuillez");
  delay(500);
  spf.clear();
  spf.print("saisir la");
  delay(500);
  spf.clear();
  spf.print("valeur du");
  delay(500);
  spf.clear();
  spf.print("capteur");
  delay(500);
  spf.clear();
  spf.print("humidite");
  delay(500);
  spf.clear();
  time = millis() - time;
  Serial.print("Took "); Serial.print(time); Serial.println(" ms");
  spf.setBacklight(WHITE);
}

uint8_t i=0;
void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  spf.setCursor(1, 0);

 
 Serial.println(choixEntier());
}

const int VALUE_MIN = 10;
const int VALUE_MAX = 60;

enum {
  BP_NONE, 
  BP_PLUS, 
  BP_MINUS,
  BP_SELECT
};

byte getKey() {
  byte buttons = spf.readButtons();

  if (buttons) {
    if (buttons & BUTTON_UP); {
      return BP_PLUS;
    }
    if (buttons & BUTTON_DOWN); {
      return BP_MINUS;
    }
    if (buttons & BUTTON_SELECT); {
      return BP_SELECT;
    }
  }
  
  return BP_NONE;
}

byte choixEntier() {

   /* 
    * c = bouton appuyé
    * value = valeur choisie
    * selectOk = booléen True quand l'utilisateur click OK
    */
  byte c, value = 0, selectOk = false;


  /* Affiche un message */
  spf.print(F("Valeur ?"));

  /* Boucle de traitement */
  do {

    /* Lit le bouton actuellement pressé */
    byte c = getKey();
  

    /* Vérifie qu'un est bien pressé */
    if(c == BP_NONE)
      continue; /* Si non, repars dans la boucle */

    /* Si oui, gère le bouton en question */
    switch(c) {
    case BP_PLUS: /* Incrémente la valeur avec un test du maximum à ne pas dépasser */
      selectOk = false;
      if(++value == VALUE_MAX)
        --value;
      break;

    case BP_MINUS: /* Décrémente la valeur, avec un minimum à ne pas dépasser */
      selectOk = false;
      if(value > VALUE_MIN)
        --value;
      break;

    case BP_SELECT: /* Bouton OK */
      selectOk = true;
      break;
    }

    /* Affiche la valeur actuelle */
    spf.print(value);
while(getKey() != BP_NONE);
  } while(!selectOk); /* Boucle tant que l'utilisateur n'as pas clické OK */

  /* Retourne la valeur choisie */
  return value;
}

Je comprend pas ça devrait pourtant marcher ...
Fait un petit code de test dans ton loop pour tester le retour de getKey() en fonction de ce que tu appuis :wink:

J'ai testé, ça ne marche toujours pas ...

bonjour,
tu as testé ce code? https://github.com/adafruit/Adafruit-RGB-LCD-Shield-Library/blob/master/examples/HelloWorld/HelloWorld.pde

Ouai c'est le premier que j'ai testé.

Xaras:
Ouai c'est le premier que j'ai testé.

et????????

Bah cette partie ne permet que d'afficher des messages sur l'écran et en appuyant sur les bouttons. Elle ne permet pas de faire ce que je veux non?

la question n'est pas là, est ce que ca fonctionne correctement?
si oui, on envisage une erreur de code.

Oui ça cela fonctionne correctement il affiche bien les messages.

Je ne vois vraiment pas où est l'erreur ... il m'affiche les chiffres un après l'autre et je n'arrive pas à le modifier.

Plus de réponses ? ...

Si tu utilise la dernière version de l'IDE, c'est peu être ça, essai de repasser en 1.0.4, étant donné que la 1.0.5 est sorti très récement, peu etre que la lib n'est pas encore compatible

J'ai bien la 1.0.4 et ça ne marche pas ...

J'ai refait pleins de test mais sans résultats ... J'ai revu le programme à skywodd mais je me demande si ça change quelque chose le fait qu'il a utilisé une autre librairie (LCD Cyrstal). Sinon personne n'a d'autres idées ?
De plus, même quand je reste appuyé sur le bouton down il m'incrémente les valeurs.

J'ai fait ce petit test juste pour l'incrémentation, et j'ai remarqué qu'il incrémente aléatoirement. De plus, je ne comprends toujours pourquoi quand j'appuie sur le bouton select il m'incrémente encore la valeur ...

uint8_t i=0;
void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  spf.setCursor(1, 0);

 
 Serial.print(choixEntier());
}

const int VALUE_MIN = 10;
const int VALUE_MAX = 60;

enum {
  BP_NONE, 
  BP_PLUS, 
  BP_MINUS,
  BP_SELECT
};

byte getKey() {
  byte buttons = spf.readButtons();

  if (buttons) {
    if (buttons & BUTTON_UP); {
      return BP_PLUS;
    }
    if (buttons & BUTTON_DOWN); {
      return BP_MINUS;
    }
    
    if (buttons & BUTTON_SELECT); {
      return BP_SELECT;
    }
  }
  
  return BP_NONE;
}

byte choixEntier() {

   /* 
    * c = bouton appuyé
    * value = valeur choisie
    * selectOk = booléen True quand l'utilisateur click OK
    */
  byte c, value = 0, selectOk = false;


  /* Affiche un message */
  spf.print(F("Valeur ?"));

  /* Boucle de traitement */
  do {

    /* Lit le bouton actuellement pressé */
    byte c = getKey();
  

    /* Vérifie qu'un est bien pressé */
    if(c == BP_NONE)
      continue; /* Si non, repars dans la boucle */

    /* Si oui, gère le bouton en question */
    switch(c) {
    case BP_PLUS: /* Incrémente la valeur avec un test du maximum à ne pas dépasser */
     if(++value == VALUE_MAX);
        selectOk = false;
       spf.clear();
        spf.print(value);
      break;

    switch(c) {
    case BP_SELECT: /* Bouton OK */
      selectOk = true;
      break;
    }

    /* Affiche la valeur actuelle */
    spf.print(value);
while(getKey() != BP_NONE);
    }} while(!selectOk); /* Boucle tant que l'utilisateur n'as pas clické OK */

  /* Retourne la valeur choisie */
  return value;

}

met le dans un vrai editeur de c++ et regarde tes accolades, je trouve ça bizarre

do {

    /* Lit le bouton actuellement pressé */
    byte c = getKey();
  

    /* Vérifie qu'un est bien pressé */
    if(c == BP_NONE)
      continue; /* Si non, repars dans la boucle */

    /* Si oui, gère le bouton en question */
    switch(c) {
    case BP_PLUS: /* Incrémente la valeur avec un test du maximum à ne pas dépasser */
     if(++value == VALUE_MAX);
        selectOk = false;
       spf.clear();
        spf.print(value);
      break;

    switch(c) {
    case BP_SELECT: /* Bouton OK */
      selectOk = true;
      break;
    }

    /* Affiche la valeur actuelle */
    spf.print(value);
while(getKey() != BP_NONE);
    }} while(!selectOk); /* Boucle tant que l'utilisateur n'as pas clické OK */

Tout ceci, il y a un switch qui n'est jamais effectué, le deuxième et il n'y a qu'un test, essai ce code :

uint8_t i=0;
void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  spf.setCursor(1, 0);

 
 Serial.print(choixEntier());
}

#define VALUE_MIN 10
#define VALUE_MAX 60 //Tant qu'a y etre autant liberer de la mémoire

enum {
  BP_NONE, 
  BP_PLUS, 
  BP_MINUS,
  BP_SELECT
};

byte getKey() {
  byte buttons = spf.readButtons();

  if (buttons) {
    if (buttons & BUTTON_UP); {
      return BP_PLUS;
    }
    if (buttons & BUTTON_DOWN); {
      return BP_MINUS;
    }
    
    if (buttons & BUTTON_SELECT); {
      return BP_SELECT;
    }
  }
  
  return BP_NONE;
}

byte choixEntier() {
    /* 
    * c = bouton appuyé
    * value = valeur choisie
    * selectOk = booléen True quand l'utilisateur click OK
    */
	
	byte c, value = 0, selectOk = false;


	/* Affiche un message */
	spf.print(F("Valeur ?"));

	/* Boucle de traitement */
	while(!selectOk) { // Boucle tant que l'utilisateur n'as pas clické OK
		while(getKey() != BP_NONE); //C'est ici qu'on attend que l'utilisateur ait cliqué sur un bouton
		/* Lit le bouton actuellement pressé */
		byte c = getKey();

		/* Si oui, gère le bouton en question */
		switch(c) {
			case BP_NONE: //Vérifie qu'un est bien pressé, on sait jamais
				continue;
			case BP_PLUS: /* Incrémente la valeur avec un test du maximum à ne pas dépasser */
				if(value++ >= VALUE_MAX);
					selectOk = false; //??? si la valeur est superieure alors on continu la boucle ?
				spf.clear();
				spf.print(value);
				break;
			case BP_SELECT: /* Bouton OK */
				selectOk = true;
				break;
		}

		/* Affiche la valeur actuelle */
		spf.print(value);
	}

  /* Retourne la valeur choisie */
  return value;

}

Le forum n'est pas très bien pour afficher le code, uint8_t i=0;void loop() { // set the cursor to column 0, line 1 // (note - Pastebin.com

Tout d'abord je vous remercie encore pour votre aide. J'ai testé le programme, et il m'incrémente des valeurs à partir de 11. Si l'incrémentation ne continue pas à marcher j'ai une autre solution que je vous proposerai.
Le principe c'est que le capteur prend juste 3 valeurs qui correspondent à 3 boutons et en fonction des boutons qu'il appuie il lui envoie une valeur qu'il peut sélectionner. Après cette valeur retourne dans l'arduino qui fera clignoter une LED en fonction de la valeur du capteur. J'ai bloqué sur quelques passages, si vous pouvez corriger (comme le void setup au niveau de la commande de la LED). Et je ne vois pas comment trouver la solution à un problème plus important: je n'ai pas réussit à trouver comment en fonction du if il me renvoit la valeur du capteur que je peux sélectionner et qui retournera directement dans la partie commande de la LED.

void setup() {
  // Debugging output
  Serial.begin(9600);
  // set up the LCD's number of columns and rows: 
  spf.begin(16, 2);

  // Print a message to the LCD. We track how long it takes since
  // this library has been optimized a bit and we're proud of it :)
  int time = millis();
  spf.print("Veuillez");
  delay(500);
  spf.clear();
  spf.print("saisir la");
  delay(500);
  spf.clear();
  spf.print("valeur du ");
  delay(500);
  spf.clear();
  spf.print("capteur");
  delay(500);
  spf.clear();
  time = millis() - time;
  Serial.print("Took "); Serial.print(time); Serial.println(" ms");
  spf.setBacklight(WHITE);
}

uint8_t i=0;
void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  spf.setCursor(1, 0);

  uint8_t buttons = spf.readButtons();
  int Valeurcapteur; 
  

  if (buttons) {
    spf.clear();
    spf.setCursor(0,0);
    if (buttons & BUTTON_UP) {
      spf.print("humidité: 6");
      int Valeurarrosage = 6; 
      spf.setBacklight(RED);
    }
    if (buttons & BUTTON_DOWN) {
      spf.print("humidité:8");
      int Valeurarrosage = 24; 
      spf.setBacklight(YELLOW);
    }
    if (buttons & BUTTON_LEFT) {
      spf.print("humidité:10");
      int Valeurarrosage = 160; 
      spf.setBacklight(YELLOW);
    }
    if (buttons & BUTTON_RIGHT) {
     
      spf.setBacklight(YELLOW);
    }
    if (buttons & BUTTON_SELECT) {
      spf.print("int Valeurarrosage");
      spf.setBacklight(VIOLET);
    }
  }
}
int led = 13;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

Je n'ai pas compris ce que tu voulais faire mais je viens de penser à un truc pour le code précédent, il n'y a aucun délai ou aucune vérification que l'utilisateur reste appuyé sur le bouton, quand tu reste appuyé, ça donne quoi ?