Étape 4: Détection de hauteur généralisée
Fondamentalement ce que j’ai fait choisir une tension que j’ai toujours su que serait dans les limites de ma vague (2, 5V). Puis je regardais chaque fois que la vague ont franchi ce niveau avec une pente ascendante, nous appellerons ces « événements de seuil ». Si cela est arrivé plusieurs fois en un seul cycle, j’ai choisi l’événement seuil avec la plus grande pente comme le début de mon cycle. Semblable à la dernière étape, j’ai utilisé une variable appelée « temps » (incrémenté à un taux de 38,5 kHz) pour mesurer le temps entre les événements de seuil et stockées il s’agit d’un tableau appelé minuterie []. J’ai aussi enregistré la pente à chacun de ces événements de seuil dans un tableau appelé pente []. Puis j’ai comparé les éléments de la minuterie [] et [] pente pour savoir où il y avait un match. Une fois qu’une correspondance a été trouvée, j’ai ajouté les éléments de minuterie [] pour déterminer la durée du cycle et envoyé cette valeur à une variable globale appelée « période ». Puis dans la fonction loop() principale (toutes les étapes que je viens de décrire se produisent dans la routine d’interruption ADC) j’ai utilisé la valeur de période pour calculer la fréquence et l’imprimer. Je dois aussi ajouter que j’ai mis une variable dans le code appelé « noMatch » qui m’a aidé à décider qu’il avait été trop longtemps puisque j’ai eu un bon match et que je devrais juste réenregistrer les éléments de minuterie [] et [] pente.
Lorsque vous écrivez ceci, j’ai pensé à un grand nombre de scénarios possibles qui pourraient briser l’algorithme. La vague la plus délicate dans mon esprit est un quel seuil de passes la 2.5V plusieurs fois dans un cycle à pentes similaires et échelonnées tout au long du cycle de la même façon. Je vous avez une vague comme ça, vous devriez garder slopeTol très faible (0-3) et vous pourriez trouver que timerTol abaissement (à 5 peut-être) aide à suivre la vague correctement. En outre, si vous voulez mesurer les ondes avec des pentes très raides (comme les vagues d’impulsion) définissez la valeur de slopeTol jusqu'à 100 ou même tout le chemin jusqu'à 256 de les suivre mieux.
Généralement, ce morceau de code semble très bien gérer beaucoup de formes, vous pouvez voir quelques-unes de mes résultats dans les images ci-dessus. Le signal entrant est indiqué en jaune et l’événement de seuil qui effectue le suivi de l’Arduino est indiquée par une impulsion d’axe 12 (bleu).
J’ai aussi ajouté un peu de code pour arrêter de calculer et d’imprimer des données de fréquence lorsque l’amplitude de l’onde est inférieur à un certain niveau. (S’il y a peu ou pas de signal alors le code qui précède parfois crache un tas d’ordures). C’est ici :