Telecomande Ifrarouge sans Bibliothèque

const int ir = 12;
int demibit1;
int demibit2;
int codeentier[13];
int i=1;
void setup() 
{
  pinMode(ir, INPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
    demibit1 = digitalRead(ir);
    
    delay(0.889);
    demibit2 = digitalRead(ir);
    
     if (demibit1==LOW && demibit2==HIGH)
    
    {
       
      for (int compteur =1; compteur<14; compteur++)
        {
          codeentier[i]= decoderdebit();
          i=i+1;
        }
      for (int i = 1; i =13 ; i++)
        {
          Serial.println(codeentier[i]);
        }
    }

}

int decoderdebit()
  {
    demibit1 = digitalRead(ir);
    delay(0.889);
    demibit2 = digitalRead(ir);
    if (demibit1==HIGH && demibit2==LOW)
    {
      return 0;    
    }
    
    else if (demibit1==LOW && demibit2==HIGH)
    {
     return 1; 
    }
  }

Bonsoir à tous je vous explique mou projet : je veux réaliser moi-même une télécommande infrarouge avec le arduino et un TSOP48 (sur la pin 12). Je sais par ailleurs qu’il existe une librairie IR remote mais je ne veux pas l’utilisé puisque sa ôterais a mon projet tout son aspect pédagogique)
Voilà le code que j’ai fait pour le moment. Mais dans le moniteur série il ne m’affiche que des 1 et je ne comprends pas trop pourquoi.
(je vous explique l'esprit du code : le protocole IR utilisé est le RC5 c'est un codage qui se fait sur le code Manchester (biphasé) , il récupère le 1er bit qui indique le début de la transmission puis les 13 bits sont stokés dans le tableau

codeentier

enfin la fonction decoderdebit permet de savoir si il s’agit d'un 1 ou un 0 logique)
Si l’un d’entre vous serait d’où vient le problème je serais très reconnaissant.
Merci

sofian123:
... je vous explique mou projet : je veux réaliser moi-même une télécommande infrarouge avec le arduino et un TSOP48 (sur la pin 12).
... Mais dans le moniteur série il ne m’affiche que des 1 et je ne comprends pas trop pourquoi.
...
(je vous explique l'esprit du code : le protocole IR utilisé est le RC5 c

bonsoir
Des TSOP48 , il y en a "des foultitudes" ... 8)
sur ton TSOP48XXXYYYZZZ :grin:
c'est quoi le marquage exact après TSOP48 ?

Il faut à minima que ton TSOP48 soit compatible avec la porteuse de ta télécommande

ha oui désoler j'ai oublié d'indiquer la fréquence c'est un TSOP4838

delay(0.889);

Déjà, ça c'est pas bon.
delay() attend un unsigned long comme paramètre.

Pour des temps inférieurs à la milliseconde il faut utiliser delayMicroseconds() qui lui attend un unsigned int en paramètre.

Merci pour votre réponse, j'ai donc remplacé delay(0.889) par delayMicroseconds(889);
cependnt le resultat est toujours le même on dirait que la condition
if (demibit1==LOW && demibit2==HIGH)
n'est jamais remplie, c'est ça que je ne comprends pas.

si vous avez une petite idée de la source du problème ça m’aiderai beaucoup
Merci

sofian123:
Merci pour votre réponse, j'ai donc remplacé delay(0.889) par delayMicroseconds(889);
cependnt le resultat est toujours le même on dirait que la condition

if (demibit1==LOW && demibit2==HIGH)

n'est jamais remplie, c'est ça que je ne comprends pas.

si vous avez une petite idée de la source du problème ça m’aiderai beaucoup
Merci

bonjour
déjà a tu validé le fait que ton capteur reçoit les emissions de ta telco ?
test avec le petit prog dessous (connecte la sortie data de ton TSOP sur le pin 2 de ton uno)

enum PinAssignments {
  encoderPinA = 2,

};

unsigned long Tparc=0; //  temps de parcours du secteur
unsigned long Tact=0; // Test pour  micros() en entrée 
unsigned long ParcMax=3000000; // delai max en µs pour parcourir un secteur, si > arret theorique 
unsigned long Tparct[256] ; // tableau de long stockant les valeurs micros() à chaque interruption
byte Eparc; // etat du 1er creneau

byte Iparc=0; // indice pour parcourir Tparct

boolean Sint=false; // passé par l'interruption oui/non
void setup() {

  pinMode(encoderPinA, INPUT);

  attachInterrupt(0, doEncoderA, CHANGE); // // encoder pin on interrupt 0 (pin 2)

  Serial.begin(115200);
}

void loop(){
  Eparc=digitalRead(encoderPinA); // recup de l'etat pin à l'init
  if (Sint==true)
  {

    Serial.print(">"); // pour test d'entre/sortie de secteur ,indique passage par int0 

    Sint=false;
    
  }

  if (micros()-Tact > ParcMax) { // tempo en µsecondes pour test si pas eu d'interruption 

    Tact=micros();
    Serial.println();
    Serial.print("-- passe tempo --> ETATS=");  
    
    Serial.print(Iparc-1);
    Serial.print(" ");
    
    Serial.print(millis());
    Serial.print("=millis ");
    Serial.print("Etat init=");
    Serial.print(Eparc);
    Serial.print(" ");
    for (byte i=1; i < Iparc; i++){
      
  
      Tparc=Tparct[i]-Tparct[i-1];
      
      
      Serial.print(Tparc); 
      Serial.print(","); // delimiteur pour log tableur

    } 

    Serial.println();

    Iparc=0;
  }

}

// Interrupt on A changing state
void doEncoderA(){

  Tparct[Iparc]=micros(); // plus rapide 
    
  Iparc ++;
  Sint=true;
}

Merci beaucoup de votre réponse rapide,

alors oui je viens de tester si la réception est correcte, j'ai pas tout compris au code mais voila un exemple de ce qu'il me retourne:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-- passe tempo --> ETATS=45 63000=millis Etat init=1 884,800,1696,772,888,800,884,1640,1692,776,888,800,888,800,884,1636,884,804,1696,776,884,87544,888,800,1700,776,880,804,884,1636,1696,776,884,804,884,800,888,1632,888,800,1700,776,880,87540,132,

-- passe tempo --> ETATS=-1 65999=millis Etat init=1

le premier état étant en appuyant sur un bouton et le deuxième (-1) est l’état sans que j’appuie sur la tele ( c'est d’ailleurs la valeur que mon programme me renvoie en permanence )

déjà tu travaille avec du digitalread, du serial à 9600
pour gerer du timing avec precision , il va falloir tres surement que passe par de l'interruption
(ce que fait mon prog) pour determinber la durée des etats

étant novice dans le monde arduino je ne connais pas encore les interruptions mais je vais essayer de voir comment celles-ci fonctionnent. cependant afin de ma facilité la compréhension de tout ca pouvez vous me dire à quoi correspondent les valeurs de tout les états.

Pouvez vous également me dire globalement comment vous voyez la structure de mon programme avec des interruptions.

Merci d'avance

sofian123:
étant novice dans le monde arduino je ne connais pas encore les interruptions mais je vais essayer de voir comment celles-ci fonctionnent. cependant afin de ma facilité la compréhension de tout ca pouvez vous me dire à quoi correspondent les valeurs de tout les états.

Pouvez vous également me dire globalement comment vous voyez la structure de mon programme avec des interruptions.

Merci d'avance

pour faire court :
les valeurs correpondent au nombre de µs des etats haut et bas lors d'un stimuli sur le recepteur.
ça devrait déjà te permettre de voir si ça correspond à du timing RC5.
pour la structure , la priorité doit etre donnée à la reception des trames.

je viens de tester avec la librairie IR , et c'est bien du RC5.
cependant lorsque que j'appuie deux fois sur le mm bouton de la télécommande votre programme ne me donne pas la mm succession pour la durée des états. il est donc impossible de ce baser sur la durée des stimuli pour dire "si on appuie sur ce bouton de la telco alors tu fais ca" nn?

Bonjour,

C'est normal qu'en RC5 deux appuis successifs ne donnent pas la même trame. En RC5 il y a un bit appelé toggle bit et qui change d'état à chaque appui sur une touche. Ca sert à traiter les répétitions de touche.

oui je suis d'accord mais c'est seulement le 1er bit qui change après le reste de la trame doit être identique (adressage et commande) mais là ce n'est pas le cas

s'il vous plait je me demandé comment je peux programmer la réception du code IR si les durées des stimuli ne sont pas caractéristiques à une touche?
n'y a t-il pas un moyen de faire comme dans mon idée de base ie de créer une fonction qui détecte les 0 et 1 logiques?

Cordialement
sofian

Up??