Bon comme promis voici un petit bout de code rédigé de manière " Simple " pour le moment ( qui pourra être optimisé pour gagner du temps sur l'arduino si besoin, c'est juste que la manière simple c'est plus facile pour le comprendre au début)
après réflexion finalement j'ai même pas utilisé l'interruption hardware disponible pour la lecture ... et j'ai tout mis directement dans le loop, sauf la fonction qui calcule le temps en microseconde de déphasage à appliquer en fonction du temps en microseconde entre les deux précédents changement sur l'entré ...
Le code :
#define INPUTPIN 2
#define OUTPUTPIN 3
#define DELAISPULSE 500 // 500us
bool nouveauPulse = false;
bool pulseEnCours = false;
uint32_t tempsProchainPulse = 0;
bool oldEtat = LOW;
uint32_t oldTemps = 0;
void setup()
{
pinMode(INPUTPIN, INPUT);
pinMode(OUTPUTPIN, OUTPUT);
}
void loop()
{
uint32_t temps = micros();
if ( !nouveauPulse ) {
bool etat = digitalRead(INPUTPIN);
if( etat != oldEtat ) {
uint32_t delaisInterChange = temps - oldTemps;
tempsProchainPulse = temps + decalagePulse(delaisInterChange);
oldEtat = etat;
oldTemps = temps;
nouveauPulse = true;
}
}
else {
if ( temps >= tempsProchainPulse ) {
if (!pulseEnCours) {
digitalWrite(OUTPUTPIN, HIGH);
pulseEnCours = true;
}
else if ( temps >= tempsProchainPulse + DELAISPULSE) {
digitalWrite(OUTPUTPIN, LOW);
nouveauPulse = false;
pulseEnCours = false;
}
}
}
}
uint32_t decalagePulse (uint32_t delaisInterChange) {
if ( delaisInterChange < XX )
return XXXX ;
else if ( delaisInterChange < XX )
return XXXX ;
else if ( delaisInterChange < XX )
return XXXX ;
}
Il reste à modifier la fonction " decalagePulse " en remplaçant les XX par des valeurs en microsecondes correspondant à la fréquence de l'entrée du cas que tu veux gérer, et à remplacer les XXXX par le déphasage de sortie que tu veux faire en microseconde dans le cas traité.
Tu dois mettre les valeurs XX par ordre croissant, et tu peux mettre autant de if else en plus que tu veux pour traiter autant de cas que nécessaire.
Par contre attention ce code ne fonctionne que pendant environ 71 minutes et 35 seconds après l'allumage de l'arduino... Car la gestion de l'overflow sur micros() et les differentes variables de temps ne sont pas encore traités. Une fois que ce code sera bien compris et validé comme répondant à ton besoin on pourra l'optimisé d'une part pour éviter d'utiliser les fonctions arduino et gagner un peu de temps, et le complexifier d'autre part pour traiter le cas d'overflow.
@turboSeb si tu as des questions hésites pas à les poser, ou à me dire si j'ai mal interprété ce que tu souhaitais.
Et les autres n'hésitez pas à critiquer / faire des remarques sur ce que je propose là. Si vous avez mieux ou plus simple, ou tout simplement différent n'hésitez pas à proposer.
Ah et j'oubliais ... Si jamais tu as besoin de quoi que ce soit hésite pas à faire un tour sur la boutique =)
On propose entre autre les arduino nano =)
@+