Problème commande servomoteur avec télécomande IR

Bonjour,

Avant tout, merci pour vos futures réponses !

Je suis actuellement en train de réaliser un projet mais j’ai un problème dans mon programme Arduino.
L’objectif de celui-ci est de réaliser une serrure contrôlée par un servomoteur et une télécommande IR.
Quand j’appuie sur une touche définie je dois pouvoir fermer la serrure et sur une autre touche l’ouvrir.

J’ai récupéré les correspondances décimales de chaque touche.

Malheureusement après chaque téléversement j’ai 2 problèmes :

warning: overflow in implicit constant conversion [-Woverflow]
warning: case label value exceeds maximum value for type

Voici le programme :

#include <IRremote.h>
#include <Servo.h>  //inclu Servo.h 

           //Déclaration du servos Tilt
Servo Tilt;

int RECV_PIN = 11;   //Pin 11 reception données IR
IRrecv irrecv(RECV_PIN);
decode_results results;

char TOP;
int Led = 13;     //LED
int valT;   //Valeurs envoyée aux servomoteurs
int Pos;          // Positions haut, bas, droite, gauche, stop
 
void setup()
{
      //assigne pin 10 pour le signal de sortie destiné à commander le servo
  Tilt.attach(10);
 
  Serial.begin(9600);
  irrecv.enableIRIn(); // Démarrage du récepteur
  pinMode(Led, OUTPUT);
  Pos = 0;
  valT = 90;
  Serial.println (" Servo moteur serrure");
  Serial.println ("Reception des valeurs Y");
  Serial.println (" ");
}

void loop() {
  if (irrecv.decode(&results)) {  // Si un signal est reçu...
    irrecv.resume(); // En attente de la prochaine valeur
    TOP = (results.value);
    
  switch (TOP)
     {
  //Haut Bouton 1
  case 16724175: 
     Pos = 1;
  break; 
  
  // Bas Bouton 2
  case 16718055: 
     Pos = 2;  
  break; 

 
  //Retour position prédéfinie (90). Touche "0" 
   case 16738455:
     Pos = 0;     
   break; 

  //A allumé CH+
     case 16769565:   
        digitalWrite(Led, HIGH);
        Serial.println ("Allume");            
  break; 
  
  //E eteint CH- 
     case 16753245:
        digitalWrite(Led, LOW);
        Serial.println ("Eteint");            
  break; 
        }
  //}
 
  switch (Pos)
  {
  case 1: //Haut
     if (valT < 170)  (valT = valT ++) ;
     break; 
  
  case 2: //Bas
     if (valT > 10) (valT = valT --) ;  
     break; 
 
    case 0: //Retour position prédéfinie (90)
 
  if (valT != 90)  {
    if (valT < 90) {
    valT ++ ;
  }
    if (valT > 90) {
    valT -- ;
  }
  } 
 } 

    
  Serial.print ("   Y: ");
  Serial.println (valT);
 
                        //Donne au servo Tilt la valeur en degrés à atteindre
  Tilt.write(valT); 

}
}

Bien cordialement,
Gaëtan

un idée?

[color=red] char[/color]  TOP;
...
    TOP = ([color=red]results.value[/color]);
...
    switch ([color=red]TOP[/color])
    {
      //Haut Bouton 1
      case [color=red]16724175[/color]:

le mieux c'est quand même de donner exactement (copier tout) les messages d'erreur...

Pour mémoire

/------------------------------------------------------------------------------
// Results returned from the decoder
//
class decode_results
{
	public:
		decode_type_t          decode_type;  // UNKNOWN, NEC, SONY, RC5, ...
		unsigned int           address;      // Used by Panasonic & Sharp [16-bits]
		unsigned long          value;        // Decoded value [max 32-bits]
		int                    bits;         // Number of bits in decoded value
		volatile unsigned int  *rawbuf;      // Raw intervals in 50uS ticks
		int                    rawlen;       // Number of records in rawbuf
		int                    overflow;     // true iff IR raw code too long
};

Merci pour votre réponse.

J'ai mis : int TOP

La LED réagit maintenant quand j’éteins et quand j'allume :slight_smile:

Je tiens à préciser que je suis un novice dans le domaine et que j'ai très peu de notions de programmation.

Voici le message d'erreur :

C:\Users\gaeta\Desktop\Nouveau dossier\Test1\Test1.ino: In function 'void loop()':

C:\Users\gaeta\Desktop\Nouveau dossier\Test1\Test1.ino:40:3: warning: overflow in implicit constant conversion [-Woverflow]

   case 16724175: 

   ^

C:\Users\gaeta\Desktop\Nouveau dossier\Test1\Test1.ino:45:3: warning: overflow in implicit constant conversion [-Woverflow]

   case 16718055: 

   ^

C:\Users\gaeta\Desktop\Nouveau dossier\Test1\Test1.ino:51:4: warning: overflow in implicit constant conversion [-Woverflow]

    case 16738455:

    ^

C:\Users\gaeta\Desktop\Nouveau dossier\Test1\Test1.ino:56:6: warning: overflow in implicit constant conversion [-Woverflow]

      case 16769565:   

      ^

C:\Users\gaeta\Desktop\Nouveau dossier\Test1\Test1.ino:62:6: warning: overflow in implicit constant conversion [-Woverflow]

      case 16753245:

      ^


Le croquis utilise 7 948 octets (24%) de l'espace de stockage de programmes. Le maximum est de 32 256 octets.
Les variables globales utilisent 524 octets (25%) de mémoire dynamique, ce qui laisse 1 524 octets pour les variables locales. Le maximum est de 2 048 octets.

Merci.
Cordialement,
Gaëtan

mais regardez dans la classe ce que value est:

class decode_results
{
	public:
		decode_type_t          decode_type;  // UNKNOWN, NEC, SONY, RC5, ...
		unsigned int           address;      // Used by Panasonic & Sharp [16-bits]
[color=red]		unsigned long          value;        // Decoded value [max 32-bits][/color]
		int                    bits;         // Number of bits in decoded value
		volatile unsigned int  *rawbuf;      // Raw intervals in 50uS ticks
		int                    rawlen;       // Number of records in rawbuf
		int                    overflow;     // true iff IR raw code too long
};

donc quand vous faites TOP = (results.value);, que pensez vous qu'il soit judicieux de prendre comme type pour TOP ??

(et sinon il sert à quoi TOP? switch (results.value) ce n'est pas si mal....

sinon le irrecv.resume(); // En attente de la prochaine valeur il faut le mettre une fois que vous avez tout traité, à la fin

Si j'ai bien compris les informations "Décimales" sont supérieures à 32 bits. Comment est ce que je peux faire ?

voir ici les types de variables

Si vous avez des bonbons à ranger dans une boite est-ce que vous prenez une boîte à bonbon ou une boîte à bijoux ?

Merci. J’ai commenté avant que vous éditiez votre post J-M-L.
Le programme fonctionne maintenant.

Le voici, si ça peut intéresser quelqu’un … :

#include <IRremote.h>
#include <Servo.h>  //inclu Servo.h 

           //Déclaration du servos Tilt
Servo Tilt;

int RECV_PIN = 11;   //Pin 11 reception données IR
IRrecv irrecv(RECV_PIN);
decode_results results;


int Led = 13;     //LED
int valT;   //Valeurs envoyée aux servomoteurs
int Pos;          // Positions droite, gauche, reset


void setup()
{
      //assigne pin 10 pour le signal de sortie destiné à commander le servo
  Tilt.attach(10);
 
  Serial.begin(9600);
  irrecv.enableIRIn(); // Démarrage du récepteur
  
  pinMode(Led, OUTPUT);
 
 
  
  Pos = 90;
  }

void loop() {
  if (irrecv.decode(&results)) {  // Si un signal est reçu...
    
  switch (results.value)
     {
  //Haut Bouton 1
  case 16724175:
   Pos = 180;
   Tilt.write(Pos);
   Serial.println("Bouton 1");
  
  break; 
  
  // Bas Bouton 2
  case 16718055: 
     Pos = 5;
     Tilt.write(Pos);
        Serial.println("Bouton 2");

  
  break; 

   //Retour position prédéfinie (90 90). Touche "0" 
  case 16738455:
   Pos = 90;
   Tilt.write(Pos);
     Serial.println("Bouton 0 = Reset");

         
   break; 

  //A allumé CH+
    case 16769565:  
        digitalWrite(Led, HIGH);
        Pos = 90;
        Tilt.write(Pos);  
        Serial.println ("Allume");
  Serial.println (" Servo moteur serrure");
  Serial.println ("Reception des valeurs Y");
  Serial.println (" "); 
    
  break; 
  
  //E eteint CH- 
     case 16753245:
        digitalWrite(Led, LOW);
        Serial.println ("Eteint"); 
        Pos = 90;
        Tilt.write(Pos);
     
  break; 
        }
  //}
 
       
Serial.print (" Y: ");
  Serial.println (Pos);
                        //Donne au servo Pan la valeur en degrés à atteindre
  Tilt.write(Pos); 
   irrecv.resume(); // En attente de la prochaine valeur

}}

J’aimerai rajouter un option dans ce programme. C’est à dire, que je peux ouvrir le système que si j’appuie sur les touches 7 puis 8 puis 9 ou les 3 simultanées.

Touche 7 : 16728765
Touche 8 : 16730805
Touche 9 : 16732845

J’ai essayé case 16728765 && 16730805 && 16732845 mais ça ne fonctionne pas …

Je viens de voir que la fonction case ne permet pas de faire ce genre de chose.
Pas contre la fonction if oui donc j'ai essayé ça mais ça ne marche toujours pas :

if (results.value==((16724175)&&(16743045))){
Pos = 180;
Tilt.write(Pos);
Serial.println("Bouton 1");
}

.....

Personne pour m'aider ? C'est tout bête j'en suis sûr mais je ne trouve pas la solution ...

Allons réfléchissez outre le fait que votre syntaxe est fausse, - si results.value est égal à (16724175) comment voulez vous qu’il soit en même temps égal à (16743045)?? Une variable ne peut prendre qu’une seule valeur à un instant T

La télécommande n’envoie qu’une seule touche à la fois sous forme de signal IR. Elle ne vous dit pas si 2 boutons sont appuyés en même temps.

Merci pour votre réponse. C'est vrai, c'est logique ...
Mais est il possible de faire une sorte de combinaison de chiffres. Genre, si j'appuie sur la touche 7 puis 8 puis 9 alors le servo bouge ?

Oui bien sûr pour cela il faut que votre code mémorise la suite de touches pour prendre des décisions, donc pas juste un code qui fait "touche appuyée" --> "action directe"

donc un peu de boulot de programmation avec une machine à état par exemple