Algorithme pour FIFO en arduino

En faite je reçois des données,

Ensuite je dois attendre une tempo (qui sera définit au moment de la mise en œuvre) disons par exemple 20ms.

Et changer la PWM sur une sortie en fonction de cette entrée.

char result[10];


//Données entrée :       
//Je récupère mon entrée avec dans une variable val_pwm=atoi(result)
//En fonction de la valeur de result je configure une valeur en val_PWM.

val_pwm = map(atoi(result),8000,0,0,255);

//En fonction de la valeur de result je configure une valeur en val_PWM.
analogWrite(pin_pwm, val_pwm);

Se ne sais pas comment m'y prendre pour ajouté la tempo.
Maintenant je dois ajouter un décalage, une tempo entre l'entrée result et la commande val_pwm. Bien sur le programme doit continuer de lire l'entrée en permanence et le programme ajuster la sortie avec juste un décalage.

j'ai lu qu'il fallait utiliser une fifo avec des pointeurs ou tableaux, ou ailleurs la fonction millis() mais j'ai du mal a définir algo, notamment la boucle et aussi la gestion des déplacements.

si quelqu'un peux m'aider, merci d'avance.

On dit "algorithme" :slight_smile:

Il faudrait apporter des prévisions sur les timings et ce qu'il se passe réellement

Généralement on utilise un buffer circulaire dimensionné pour absorber des pics en entrée mais il faut absolument que de temps en temps les choses se ralentissent sinon vous perdrez des données

ca se traduit comment en algo ou code arduino ?

Un algorithme, c'est une description textuel d'un enchaînement d'actions élémentaires pour réaliser une tâche. Il n''est pas nécessaire d'avoir la moindre connaissance en programmation pour écrire un algorithme.
Tu peux le faire.
Le passage au codage lui demande de connaître le langage de programmation.

j'ai bien compris, pour coder il faut l'algo. Je suis débutant en arduino mais est des bases (scolaire de 10 ans) en C++.

En faite je n'arrive pas a implémenter les buffers circulaires dans mon bout de programme.
J'ai trouver une librairie CircularBuffer.h , mais comment l'ajouter a mon prog ??

Bonjour,

Il faut que tu inclues le CircularBuffer.h dans ton projet (le plus simple c'est de copier dans le répertoire de on .ino)

Ensuite tu ajoutes le #include, puis tu définis ton buffer. La classe CircularBuffer est définie avec un template donc c'est une définition un peu particulère.

Par exemple:

#include "CircularBuffer.h"

CircularBuffer<int,10> fifo;

ensuite tu utilises push et pop

  fifo.push(val);
  val=fifo.pop();

Ca ne résout quand même pas complètement le retardement de la mesure.

Bonjour, et merci pour ton aide :slight_smile:

j'ajoute les définitions en haut avec les miennes

#ifndef CIRCULARBUFFER_h
#define CIRCULARBUFFER_h
#include <inttypes.h>
template <typename T, uint16_t Size>

Puis je met la classe

class CircularBuffer { ..... avec tous ce qu'elle contient ...}

sous mon void loop()

mais je ne comprend pas tout à fais ces deux lignes :

 fifo.push(val);

ca doit faire appel à void push(T value) { ..}
donc pour moi c fifo.push(val_pwm);

ici val correspond a la valeur de val en entré de fifo ?

fifo. , c'est une variable, une fonction, c'est quoi ?

ensuite pour la tempo, en faite plus il y a des valeurs dans le buffer plus la pile (queue) et long et donc plus de temps à sortir ...

 val=fifo.pop();

ici val correspond a la valeur de val en sortie de fifo ?

encore merci

Tu ne mets pas la la définition de la class CircularBuffer dans loop.

Tu télécharges le fichier CircularBuffer.h et tu le mets dans ton projet e le copiant dans le répertoire de ton fichier .ino
Ensuite tu fais un #include de ce fichier et tu définis ta file d'attente que j'ai appelé fifo, mais que tu peux nommer comme tu veux.

ok, merci pour #include ...

Donc au début je déclare juste fifo

CircularBuffer<int,10> fifo;

Oui, ça déclare une file d'attente d'entiers de 10 éléments.

encore merci, désolé si j'abuse de ta gentillesse mais concernant les deux lignes :

 fifo.push(val);     // val en entrée de pile ?
 val=fifo.pop();    // val en sortie de pile ?

c'est ca ?

push() c'est pour mettre une valeur dans la file d'attente (buffer circulaire)
et pop() pour la sortir.

Pour faire ce que tu veux faire il faut que le temps de retard soit un multiple de la période ou tu reçoit tes données.
Par exemple si tu reçois des données toutes les 10ms et que tu veux un retard de 20ms:
pour les 2 première données reçues tu les mets dans la file avec push()
ensuite à chaque donnée reçue tu la mets en file d'attente avec push() et tu dépiles une donnée avec pop() pour faire le traitement.