Pages: 1 [2] 3 4 5   Go Down
Author Topic: Programme capteur d'humidité  (Read 3672 times)
0 Members and 1 Guest are viewing this topic.
Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3227
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci  smiley-wink
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ...
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mhh bah des valeurs entières je pense.
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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)
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
« Last Edit: May 04, 2013, 11:51:36 am by Xaras » Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Ça permet de faire des code de retour pour une fonction sans avoir à fixer de valeur précise.

Exemple :
Code:
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é
}
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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;
}
« Last Edit: May 05, 2013, 09:21:19 am by Xaras » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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'"
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est logique qu'il y ai une erreur puisse que tu ne déclare pas la fonction getKey() !

Voici un exemple :
Code:
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;
}
« Last Edit: May 05, 2013, 10:50:36 am by skywodd » Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Full Member
***
Karma: 0
Posts: 129
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

et on voit bien qu'il y a une erreur, c'est :
Code:
c = getKey();
que tu veux mettre si tu as déjà déclaré la variable c de type byte avant sinon :
Code:
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 !
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: May 05, 2013, 09:43:15 am by Xaras » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 129
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

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:
byte c, value = 0, selectOk = false;
Logged


France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
/*********************

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;
}

-
Logged

Pages: 1 [2] 3 4 5   Go Up
Jump to: