Go Down

Topic: Programme capteur d'humidité (Read 4891 times) previous topic - next topic

Jean-François

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Xaras

Pas de réponse pour ma question ? ....

skywodd

Je t'ai donné un début de réponse mais je pense que tu devrais d'abord réfléchir à comment tu veut entrer tes valeurs.
Déjà il faudrait que tu réfléchisse à quelles valeurs, quels formats (entier, flottant, ...), etc ...
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Xaras

Mhh bah des valeurs entières je pense.

skywodd


Mhh bah des valeurs entières je pense.

Dans ce cas tu peut utiliser mon algo pour ton application.
Il te faut trois boutons (+, -, ok) et un affichage.

Voila l'algo simplifier à adapter suivant tes besoins :
Code: [Select]
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 */
  Serial.println(F("Valeur ?"));

  /* Boucle de traitement */
  do {

    /* Lit le bouton actuellement pressé */
    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 */
    Serial.println(value);

  } while(!selectOk); /* Boucle tant que l'utilisateur n'as pas clické OK */

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


Il te reste à faire :
- une fonction getKey() qui retourne BP_NONE (pas de bouton appuyé), BP_PLUS, BP_MINUS ou BP_SELECT (-> enum)
- remplacer l'affichage sur le port série par un affichage sur ton écran
- définir VALUE_MIN et VALUE_MAX (-> const)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Xaras

#20
May 04, 2013, 06:01 pm Last Edit: May 04, 2013, 06:51 pm by Xaras Reason: 1
Merci tout d'abord pour votre réponse. Cependant pouvez-vous être plus précis pour cette phease " une fonction getKey() qui retourne BP_NONE (pas de bouton appuyé), BP_PLUS, BP_MINUS ou BP_SELECT (-> enum)".
De plus, je n'arrive pas à déclarer ces valeurs dans mon programme...

skywodd


Merci tout d'abord pour votre réponse. Cependant pouvez-vous être plus précis pour cette phease " une fonction getKey() qui retourne BP_NONE (pas de bouton appuyé), BP_PLUS, BP_MINUS ou BP_SELECT (-> enum)".
De plus, je n'arrive pas à déclarer ces valeurs dans mon programme...

Un "enum" est une énumération de valeurs, regarde en haut de mon programme pour un exemple d'utilisation ;)
Ça permet de faire des code de retour pour une fonction sans avoir à fixer de valeur précise.

Exemple :
Code: [Select]
enum {
  BP_NONE,
  BP_PLUS,
  BP_MINUS,
  BP_SELECT
};

byte getKey() {
  // Ta fonction magique qui test les boutons de ta carte et suivant les boutons retourne une des valeurs de l'enum
  // exemple : return BP_NONE; // Aucun bouton appuyé
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Xaras

#22
May 05, 2013, 04:15 pm Last Edit: May 05, 2013, 04:21 pm by Xaras Reason: 1
Merci pour votre réponse, donc j'ai changé l'affichage, déclarées les valeurs min et max. Cependant, il m'affiche une erreur pour la fonction getKey().

Code: [Select]
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(0, 1);
 // print the number of seconds since reset:
 spf.print(millis()/1000);


 uint8_t buttons = spf.readButtons();

 if (buttons) {
   spf.clear();
   spf.setCursor(0,0);
   if (buttons & BUTTON_UP) {
     spf.print("+ ");
     spf.setBacklight(RED);
   }
   if (buttons & BUTTON_DOWN) {
     spf.print("- ");
     spf.setBacklight(YELLOW);
   }
   if (buttons & BUTTON_LEFT) {
     spf.print("LEFT ");
     spf.setBacklight(GREEN);
   }
   if (buttons & BUTTON_RIGHT) {
     spf.print("RIGHT ");
     spf.setBacklight(TEAL);
   }
   if (buttons & BUTTON_SELECT) {
     spf.print("OK ");
     spf.setBacklight(VIOLET);
   }
 }
}
byte choixEntier() {

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

 enum {
 BP_NONE,
 BP_PLUS,
 BP_MINUS,
 BP_SELECT
};

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

 /* Boucle de traitement */
 do {

   /* Lit le bouton actuellement pressé */
   c = byte 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 */
   Serial.print(value);

 } while(!selectOk); /* Boucle tant que l'utilisateur n'as pas clické OK */

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

Xaras

L'erreur est celle-ci:
"Bienvenue_dans_le_programme_Wetkeeper.ino: In function 'byte choixEntier()':
Bienvenue_dans_le_programme_Wetkeeper:111: error: expected primary-expression before 'getKey'
Bienvenue_dans_le_programme_Wetkeeper:111: error: expected `;' before 'getKey'"

skywodd

#24
May 05, 2013, 04:23 pm Last Edit: May 05, 2013, 05:50 pm by skywodd Reason: 1
C'est logique qu'il y ai une erreur puisse que tu ne déclare pas la fonction getKey() !

Voici un exemple :
Code: [Select]
const int VALUE_MIN = 10;
const int VALUE_MAX = 60;

enum {
 BP_NONE,
 BP_PLUS,
 BP_MINUS,
 BP_SELECT
};

void loop() {
 // set the cursor to column 0, line 1
 // (note: line 1 is the second row, since counting begins with 0):
 spf.setCursor(0, 1);
 // print the number of seconds since reset:
 spf.print(millis()/1000);

Serial.println(choixEntier());
}

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 */
 Serial.println(F("Valeur ?"));

 /* Boucle de traitement */
 do {

   /* Lit le bouton actuellement pressé */
   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 */
   Serial.println(value);

 } while(!selectOk); /* Boucle tant que l'utilisateur n'as pas clické OK */

 /* Retourne la valeur choisie */
 return value;
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Viproz

L'erreur te dis de regarder cette ligne :
Code: [Select]
c = byte getKey();

et on voit bien qu'il y a une erreur, c'est :
Code: [Select]
c = getKey();
que tu veux mettre si tu as déjà déclaré la variable c de type byte avant sinon :
Code: [Select]
byte c = getKey();

PS : pratique la fonction qui alerte qu'un message a été posé pendant le temps de l'écriture, mais là il y a donc deux erreurs !
http://stilldrinking.org/programming-sucks

Xaras

#26
May 05, 2013, 04:30 pm Last Edit: May 05, 2013, 04:43 pm by Xaras Reason: 1
Désolé ^^ je pensais qu'en fait une fonction ça ne se déclarait pas. J'avais en tête l'exemple de la fonction void. Excusez-moi je suis encore novice :p
Vibroz désolé mais je n'ai pas trop compris votre troisième ligne de code mais également votre PS... Si vous pouvez-être plus précis merci

Viproz


Désolé ^^ je pensais qu'en fait une fonction ça ne se déclarait pas. J'avais en tête l'exemple de la fonction void. Excusez-moi je suis encore novice :p
Vibroz désolé mais je n'ai pas trop compris votre troisième ligne de code mais également votre PS... Si vous pouvez-être plus précis merci


Le Post Script je parlais du message de skywodd ;)

Sinon même les fonctions ne retournant rien (void) ont besoin d'être déclarés

Pour être utilisé, une variable doit être déclarée (contrairement à certains langages basiques), et je n'avais pas vu que ta variable était déjà déclarée un peu plus haut dans la fonction :
Code: [Select]
byte c, value = 0, selectOk = false;
http://stilldrinking.org/programming-sucks

skywodd

Oups j'avais pas vu le "byte" mal placé, désolé.

En langage C c'est simple : tout doit être déclaré, fonction, enum, struct, variable, type, TOUT.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Xaras

A prioris en compilant le programme il ne m'affiche pas d'erreur. Cependant, une fois le programme téléversé il ne marche pas, en relisant le programme j'ai essayé de comprendre pourquoi ... D'ailleurs pourquoi il n'affiche pas le message "Valeur ?" Et une foie le programme téléversé, il m'affiche la valeur 4 puis aucun boutons ne veut à prioris marcher.
Merci pour vos aides précédentes.

Code: [Select]
/*********************

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(0, 1);
  // print the number of seconds since reset:
  spf.print(millis()/1000);

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 */
  Serial.println(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 */
    Serial.println(value);

  } while(!selectOk); /* Boucle tant que l'utilisateur n'as pas clické OK */

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


-

Go Up