help servomoteur telecomande rf433

salut a tous mon projet au début fonctionne j ai réaliser une boite d envol pour la fauconnerie et le code fonctionne pour les intéresses voici le code

#include <RCSwitch.h>
#define code  1400660// code decrypter avec receive demo
#include <Servo.h>
Servo myservo;
int pos = 0;//position servo//

const int ledPin =  13;
RCSwitch mySwitch = RCSwitch();

void setup() {
    Serial.begin(9600);
    mySwitch.enableReceive(0);//recepteur pin 2
    pinMode(ledPin, OUTPUT);// 
   myservo.attach(9);//servo pin 9
 myservo.write(0); //initialise le servo en position repos zero
  delay(20); // pour stabilisation 
}

void loop() {
  if (mySwitch.available()) {

    int value = mySwitch.getReceivedValue();

    while (!Serial) ;

    switch (value) {
        case code:
              digitalWrite(ledPin, HIGH);  // led ON
    myservo.write(125);       // va en butée inverse     
    delay(2000);  // stabilisation 200 ms
    digitalWrite(ledPin, LOW);  // led OFF
    myservo.write(0); // retour en zero
    delay(20); // pour stabilisation 
            break;
 }

    mySwitch.resetAvailable();
  }
}

maintenant je souhaite pouvoir enregistrer le code directement sur le terrain et non sans pc en passant par eeprom

j arrive bien a décode et enregistrer le code
mais impossible de faire une commande a la réception du code enregistrer

#include <EEPROM.h> 



#include <Servo.h>
Servo myservo;
int pos = 125;

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

int temps_defini =3000;  

int boutonPin  = 8;
unsigned long debut_appui;
boolean variable = false;
int etat_bouton;
int dernier_etat_bouton = LOW;

void EEPROMWritelong(int address, long value)
      {
      //Decomposition from a long to 4 bytes by using bitshift.
      //One = Most significant -> Four = Least significant byte
      byte four = (value & 0xFF);
      byte three = ((value >> 8) & 0xFF);
      byte two = ((value >> 16) & 0xFF);
      byte one = ((value >> 24) & 0xFF);

      //Write the 4 bytes into the eeprom memory.
      EEPROM.write(address, four);
      EEPROM.write(address + 1, three);
      EEPROM.write(address + 2, two);
      EEPROM.write(address + 3, one);
      }

//This function will return a 4 byte (32bit) long from the eeprom
//at the specified address to address + 3.
long EEPROMReadlong(long address)
      {
      //Read the 4 bytes from the eeprom memory.
      long four = EEPROM.read(address);
      long three = EEPROM.read(address + 1);
      long two = EEPROM.read(address + 2);
      long one = EEPROM.read(address + 3);

      //Return the recomposed long by using bitshift.
      return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
      }
      
void setup() {
 pinMode(boutonPin, INPUT);
 mySwitch.enableReceive(0);//receteur pin 2 
  Serial.begin(9600);
   myservo.attach(9);
 myservo.write(125); //initialise le servo en position repos zero
  delay(20); // pour stabilisatio
}

void loop() {
  etat_bouton = digitalRead(boutonPin);            
   mySwitch.available();

     if (etat_bouton == HIGH && dernier_etat_bouton == LOW){      
   debut_appui = millis();                                      
   variable = true;                                           
   }
   
   
   if ( variable == true && etat_bouton ==HIGH &&  dernier_etat_bouton == HIGH){  //LOW HIGH  
                                                                                  
     if ((millis() - debut_appui) >= temps_defini){                                             
   
        int value = mySwitch.getReceivedValue();
    if (value == 0) {
       } else {
      Serial.print( mySwitch.getReceivedValue());
    long address=0;
      EEPROMWritelong(address,  mySwitch.getReceivedValue() );
      
      address+=4;
    delay (3000);
    mySwitch.resetAvailable();
        }                                                       
 }     
   }     


if (mySwitch.available()) {

    int value = mySwitch.getReceivedValue();
  
    while (!Serial) ;

    switch  (value = (EEPROMReadlong(0))) {

       Serial.print("allume ");
  Serial.println(EEPROMReadlong(0));        
    myservo.write(125);       // va en butée inverse     
    delay(2000);  // stabilisation 250 ms    digitalWrite(ledPin, LOW);  // led OFF
    myservo.write(0); // retour en zero
    delay(20); // pour stabilisation 
            break;


 }  
 mySwitch.resetAvailable();
 
}
dernier_etat_bouton = etat_bouton;  

}

avais vous une idée?
merci!

c'est quoi le     while (!Serial) ; qui traine au milieu du code?

 else {
        Serial.print( mySwitch.getReceivedValue());
        long address = 0;
        EEPROMWritelong(address,  mySwitch.getReceivedValue() );

        address += 4;
        delay (3000);
        mySwitch.resetAvailable();
      }

je ne suis pas sûr de bien comprendre ce que vous faites, mais vous avez vu que address est remis à zéro à chaque fois que la boucle tourne bien que vous fassiez address += 4; parce que c'est une variable locale non static ce qui fait que vous stockez toujours à l'adresse zero vos infos

merci j-m-l
si j ai bie compris les tuto eeprom

mon code de télécommande fait 32 bit du cou j a besoin e 4 cas (1 cae = 8byts)

mon but est de commander un servo avec une télécommande type portail

mais de pouvoir changer de télécommande quand je le veut de ce fait j ai besoin de l enregistrer et de le comparer au code reçus

J ai réussie dit mi ce que tu en pense

comment on passe en résolue svp

#include <EEPROM.h> 




#include <Servo.h>
Servo myservo;
int pos = 125;

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();


int temps_defini =3000;  

int boutonPin  = 8;
unsigned long debut_appui;
boolean variable = false;
int etat_bouton;
int dernier_etat_bouton = LOW;

void EEPROMWritelong(int address, long value)
      {
      //Decomposition from a long to 4 bytes by using bitshift.
      //One = Most significant -> Four = Least significant byte
      byte four = (value & 0xFF);
      byte three = ((value >> 8) & 0xFF);
      byte two = ((value >> 16) & 0xFF);
      byte one = ((value >> 24) & 0xFF);

      //Write the 4 bytes into the eeprom memory.
      EEPROM.write(address, four);
      EEPROM.write(address + 1, three);
      EEPROM.write(address + 2, two);
      EEPROM.write(address + 3, one);
      }

//This function will return a 4 byte (32bit) long from the eeprom
//at the specified address to address + 3.
long EEPROMReadlong(long address)
      {
      //Read the 4 bytes from the eeprom memory.
      long four = EEPROM.read(address);
      long three = EEPROM.read(address + 1);
      long two = EEPROM.read(address + 2);
      long one = EEPROM.read(address + 3);

      //Return the recomposed long by using bitshift.
      return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
    
 
      }
      
      
void setup() {
 pinMode(boutonPin, INPUT);
 mySwitch.enableReceive(0);//receteur pin 2 
  Serial.begin(9600);
   myservo.attach(9);
 myservo.write(0); //initialise le servo en position repos zero
  delay(20); // pour stabilisatio
  
}

void loop() {
 
  etat_bouton = digitalRead(boutonPin);            
   mySwitch.available();

     if (etat_bouton == HIGH && dernier_etat_bouton == LOW){      
   debut_appui = millis();                                      
   variable = true;                                           
   }
   
   
   if ( variable == true && etat_bouton ==HIGH &&  dernier_etat_bouton == HIGH){  //LOW HIGH  
                                                                                  
     if ((millis() - debut_appui) >= temps_defini){                                             
   
        int value = mySwitch.getReceivedValue();
    if (value == 0) {
       } else {
      Serial.print( mySwitch.getReceivedValue());
    long address=0;
      EEPROMWritelong(address,  mySwitch.getReceivedValue() );
      
      address+=4;
    delay (3000);
    mySwitch.resetAvailable();
        }                                                       
 }     
   }     

   if (mySwitch.available()) {

   if ( mySwitch.getReceivedValue()==EEPROMReadlong(0)){

 
  

   
 

 Serial.print(EEPROMReadlong(0));  
  myservo.write(0);       // va en butée inverse     
    delay(2000);  // stabilisation 250 ms    digitalWrite(ledPin, LOW);  // led OFF
    myservo.write(125); // retour en zero
    delay(200); // pour stabilisation 
    
       
            
 }
 
   

  mySwitch.resetAvailable();
 } 
  
dernier_etat_bouton = etat_bouton;  
 
}

Quelques commentaires qui se veulent constructifs, pas une critique, sur votre code/post:


c'est mieux de mettre les images directement dans le forum pour faciliter la lecture, voici donc votre image


int boutonPin  = 8;

il y a peu de pins dispo donc pourquoi utiliser un espace de stockage pour la variable qui peut en représenter plusieurs dizaines de milliers, elle ne sera jamais négative et la valeur ne va pas changer (est constante) donc généralement pour les pins on utilise un [url=http://www.cplusplus.com/reference/cstdint/]uint8_t[/url] qui est un nombre non signé sur 8 bits, donc une valeur entre 0 et 255. c'est ce qui prend le moins d'espace mémoire et est facilement géré sous forme de variable. comme la valeur ne changera pas on peut dire au compilateur que c'est une constante et donc on écrira

const uint8_t boutonPin  = 8;

ce faisant vous avez gagnez 1 octet au moins (pas de petites économies) et en plus comme vous avez dit au compilateur que la valeur était constante, donc ne changera pas au cours du programme, partout ou vous faites un pinMode(), digitalRead() ou digitalWrite() au lieu d'aller chercher la valeur de la pin en mémoire, le compilateur mettra directement la valeur et donc vous avez un code plus efficace qui n'occupe aucune mémoire. --> code plus rapide, 2 octets de RAM sauvegardés :slight_smile:

il en va de même pour int temps_defini = 3000; si vous dites au compilateur que cette valeur est une constante, vous permettez des optimisations - et comme c'est un temps je suppose qu'il ne sera pas négatif donc par exemple:const unsigned int temps_defini = 3000;

discussion similaire pour etat_bouton ou dernier_etat_bouton, vous allez mettre seulement HIGH ou LOW dans ces variables, donc un uint8_t est suffisant.


à quoi sert address += 4;?
en fait à quoi sert la variable locale address? comme vous écrivez toujours à l'endroit 0 de l'EEPROM, autant avoir en début de programme:const int address = 0; qui sera remplacée par le compilateur directement par sa valeur dans vos appels à l'écriture en EEPROM.


      if (value == 0) {
      } else {...}

à quoi ça sert d'avoir les premières accolades vides. si vous ne voulez rien faire quand la value vaut 0 autant écrire      if (value != 0) {...}


  mySwitch.enableReceive(0);//receteur pin 2

c'est bien d'avoir mis un commentaire, si vous voulez du code portable vers d'autres arduinos vous pourriez plutôt utiliser la fonction qui trouve le No de l'interruption associée à une pin: [

digitalPinToInterrupt(pin)

](https://www.arduino.cc/en/Reference/AttachInterrupt)

const uint8_t irRecepteurPin = 2; // ISR 0 attachée à la pin 2
...
mySwitch.enableReceive(digitalPinToInterrupt(irRecepteurPin));

boolean variable = false;est-ce que le nom de votre variable est pertinent ici? on ne sait pas trop ce que cette variable appelée variable représente. quand vous utilisez etat_bouton ou dernier_etat_bouton on voit tout de suite à quoi ça sert. --> trouver un meilleur nom.


votre fonction EEPROMWritelong() n'est pas nécessaire, vous pouvez utiliser directement la fonction [

EEPROM.put(address, data)

](https://www.arduino.cc/en/Reference/EEPROMPut) qui détermine toute seule la taille des data (donc pas de pb pour passer un long par exemple - qui a mon avis devrait être unsigned long d'ailleurs) en plus elle a l'avantage d'utiliser la fonction [url=https://www.arduino.cc/en/Reference/EEPROMUpdate]EEPROM.update()[/url] pour chaque byte plutôt que write() comme vous le faites, ce qui permet de moins user votre EEPROM qui ne peut être écrite qu'environ 100,000 fois.

de la même manière au lieu d'avoir votre fonction EEPROMReadlong(), utilisez directement [

EEPROM.get(address, data)

](https://www.arduino.cc/en/Reference/EEPROMGet)


Pensez à faire un ctrl-T dans l'IDE arduino avant de poster du code (ou même pour vous). ça "indente" correctement les lignes et c'est d'une grande aide pour voir si les parenthèses ou accolades se ferment au bon endroit.