Problème dans mon code

bonjour

voila je cherche à refabriquer une télécommande IR non conventionnel (ne travaillant pas sur les standards RC5 RC6 Nec etc.)

je ne connais pas du tout le langage de programmation mais j'ai réussi grace à des recherches sur le net à créer le code ci-dessous

il marche en partie se compile et se téléverse dans ma carte UNO

cependant je n'arrive pas à faire fonctionner les fonctions IF ( ...)

je précise que la lecture des boutons se fait bien et que la partie de génération de trames fonctionne aussi ce qui ne fonctionne pas c'est la "sélection" de la trame que je veux envoyer en fonction du bouton appuyé

info : l'appui sur un bouton génère un état bas sur l'entrée du UNO

si une âme charitable peut me filer un petit coup de pouce

int pinBoutonUnlock;
int pinBoutonLock;
#define Duty_Cycle 40 //in percent (10->50), usually 33 or 50
//TIP for true 50% use a value of 56, because of rounding errors
//TIP for true 40% use a value of 48, because of rounding errors
//TIP for true 33% use a value of 40, because of rounding errors

#define Carrier_Frequency 28200 //usually one of 38000, 40000, 36000, 56000, 33000, 30000

#define PERIOD (1000000+Carrier_Frequency/2)/Carrier_Frequency
#define HIGHTIME PERIOD*Duty_Cycle/100
#define LOWTIME PERIOD - HIGHTIME
#define txPinIR 8 //IR carrier output


unsigned long sigTime = 0; //use in mark & space functions to keep track of time

unsigned int Unlock[] = {8630, 2930, 950, 6830, 950, 10680, 950, 2930, 950, 10680, 950, 2930, 950, 10680, 950, 2930, 950, 10680, 950, 2930, 950, 6830, 950, 6830, 950, 6830, 950, 6830, 950, 6830, 950, 6830, 950, 10680, 950, 2930, 950, 6830, 950, 10680, 950, 6830, 950, 6830, 950, 16140, 8630, 2930, 950, 6830, 950, 10680, 950, 2930, 950, 10680, 950, 2930, 950, 10680, 950, 2930, 950, 10680, 950, 2930, 950, 6830, 950, 6830, 950, 6830, 950, 6830, 950, 6830, 950, 6830, 950, 10680, 950, 2930, 950, 6830, 950, 10680, 950, 6830, 950, 6830, 950, 16140}; //AnalysIR Batch Export (IRremote) - RAW
unsigned int Lock[] = {8630, 6830, 950, 6830, 950, 2930, 950, 10740, 950, 2930, 950, 10740, 950, 2930, 950, 10740, 950, 2940, 950, 10740, 950, 6830, 950, 6830, 950, 6830, 950, 6830, 950, 6830, 950, 6830, 950, 2930, 950, 10740, 950, 6830, 950, 2930, 950, 6830, 950, 6830, 950, 16140, 8630, 6830, 950, 6830, 950, 2930, 950, 10740, 950, 2930, 950, 10740, 950, 2930, 950, 10740, 950, 2940, 950, 10740, 950, 6830, 950, 6830, 950, 6830, 950, 6830, 950, 6830, 950, 6830, 950, 2930, 950, 10740, 950, 6830, 950, 2930, 950, 6830, 950, 6830, 950, 16140}; //AnalysIR Batch Export (IRremote) - RAW

void setup() {
 
Serial.begin(9600);
 pinBoutonUnlock=12;
 pinBoutonLock=10;
 pinMode(pinBoutonUnlock,INPUT);
 pinMode(pinBoutonLock,INPUT);
 pinMode(txPinIR,OUTPUT);


}

void loop() {

    boolean etatBoutonUnlock=digitalRead(pinBoutonUnlock);
    boolean etatBoutonLock=digitalRead(pinBoutonLock);
    Serial.println(etatBoutonUnlock);
    Serial.println(etatBoutonLock);
    
if (pinBoutonUnlock == LOW) {

sigTime = micros(); //keeps rolling track of signal time to avoid impact of loop & code execution delays
for (int i = 0; i < sizeof(Unlock) / sizeof(Unlock[0]); i++) {
    mark(Unlock[i++]);
    if (i < sizeof(Unlock) / sizeof(Unlock[0])) space(Unlock[i]);
  }

}

if (pinBoutonLock == LOW) { 

sigTime = micros(); //keeps rolling track of signal time to avoid impact of loop & code execution delays
for (int i = 0; i < sizeof(Lock) / sizeof(Lock[0]); i++) {
    mark(Unlock[i++]);
    if (i < sizeof(Lock) / sizeof(Lock[0])) space(Lock[i]);
  }
 
 }
 

delay(1000);
}


void mark(unsigned int mLen) { //uses sigTime as end parameter
  sigTime+= mLen; //mark ends at new sigTime
  unsigned long now = micros();
  unsigned long dur = sigTime - now; //allows for rolling time adjustment due to code execution delays
  if (dur == 0) return;
  while ((micros() - now) < dur) { //just wait here until time is up
    digitalWrite(txPinIR, HIGH);
    delayMicroseconds(HIGHTIME - 5);
    digitalWrite(txPinIR, LOW);
    delayMicroseconds(LOWTIME - 6);
  }
}

void space(unsigned int sLen) { //uses sigTime as end parameter
  sigTime+= sLen; //space ends at new sigTime
  unsigned long now = micros();
  unsigned long dur = sigTime - now; //allows for rolling time adjustment due to code execution delays
  if (dur == 0) return;
  while ((micros() - now) < dur) ; //just wait here until time is up
}

Vos define avec des calculs entiers ne vont pas faire ce que vous voulez

pouvez vous m'en dire plus cela ne m'aide pas beaucoup

je rappel que je ne connais pas la programmation

Sur votre UNO imprimez PERIOD tel que défini#define PERIOD (1000000+Carrier_Frequency/2)/Carrier_Frequency, comparez avec vos attentes.

En C ou C++ par défaut les calculs se font en int et donc sur 16 bits sur votre UNO, donc entre -32768 et 32767

effectivement je n'ai pas une frequence bien précise à 33kHz mais cela ne me dérange pas

je vise une frequence de 33.33kHz et en sorti de pin j'obtien 33.36~33.42 cela est simplement une porteuse

lorsque je génère une trame sur la sortie j'ai bien ce que je desire sur ma frequence porteuse mesuré avec mon oscilo

ce qui ne vas pas c'est je je n'arive pas à générer

  • la trame 1 si j'appuis sur le bouton 1
  • la trame 2 si j'appuis sur le bouton 2

c'est bon j'ai russis mon code fonctionne

le problème venais des variables dans les fonctions If ()
elle fesais référence au numéro de pin et non à leurs etat haut ou bas

J’ai de TRÈS gros doutes sur le calcul de vos valeurs dans les #define mais si ça fonctionne pour vous tout va bien... mais par acquis de conscience regardez ce code:

#define Duty_Cycle 40 //in percent (10->50), usually 33 or 50
#define Carrier_Frequency 28200 //usually one of 38000, 40000, 36000, 56000, 33000, 30000
#define PERIOD (1000000+Carrier_Frequency/2)/Carrier_Frequency
#define HIGHTIME PERIOD*Duty_Cycle/100
#define LOWTIME PERIOD - HIGHTIME

void setup() {
  Serial.begin(115200);
  Serial.print(F("PERIOD = ")); Serial.println(PERIOD);
  Serial.print(F("HIGHTIME = ")); Serial.println(HIGHTIME);
  Serial.print(F("LOWTIME = ")); Serial.println(LOWTIME);
}

void loop() {}

le moniteur série (à 115200 bauds) va vous dire

[color=purple]PERIOD = 35
HIGHTIME = 14
LOWTIME = 21
[/color]

maintenant considérez ce code

const double Duty_Cycle = 40; //in percent (10->50), usually 33 or 50
const double Carrier_Frequency =  28200; //usually one of 38000, 40000, 36000, 56000, 33000, 30000
const double PERIOD = (1000000.0 + Carrier_Frequency / 2.0) / Carrier_Frequency;
const double HIGHTIME = PERIOD * Duty_Cycle / 1000;
const double LOWTIME =  PERIOD - HIGHTIME;

void setup() {
  Serial.begin(115200);
  Serial.print(F("PERIOD = ")); Serial.println(PERIOD);
  Serial.print(F("HIGHTIME = ")); Serial.println(HIGHTIME);
  Serial.print(F("LOWTIME = ")); Serial.println(LOWTIME);
}

void loop() {}

le moniteur série (à 115200 bauds) va vous dire

[color=red]PERIOD = 35.96
HIGHTIME = 1.44
LOWTIME = 34.52
[/color]

vous voyez pourquoi je dis que c'est pas clair ? (le second calcul est mathématiquement plus précis, sans effets de bords de calcul entiers)