Retour sur le sujet a fin d'amélioration résultat obtention d'un signal débarrassé d'imperfections.
Non, concernant le code communiqué par Al1fch, qui fonctionne à merveille.
Mais,comme je m'y attendais, une conversation téléphonique génère elle aussi des impulsions transitoires de et autour des 440hz. D'où nécessité de filtrer autant en entrée qu'en sortie.
En premier lieu, j'ai récupéré un shield micro arduino letmeknow lm1281, sur lequel j'ai viré le micro electred, remplacé par le condensateur d'isolement d'entrée ligne téléphonique.
Le potentiomètre me permet d'ajuster la sensibilité d'entrée; a bas niveau audio la sortie est à zéro.
A réception d'une tonalité 440 hz issue d'un générateur ou ligne téléphone, la sortie du lmk 1281 génère un parfait signal carré de 5 volts, instantanément reconnu par le code Goertzel.
En dehors de ce signal, le " mute " du lmK 1281 agi sur faible signal audio, rien en sortie.( en fait un comparateur). Lorsque l'audio dépasse un certain seuil, effectivement quelques impulsions issues de la conversation arrivent à faire basculer le détecteur de la carte Nano.
C'est là qu'intervient une suite de filtres " numériques ", à base de temporisations et d'un compteur.
L' impulsion de sortie générée lors d'une détection 440hz est d'abord validée si elle dure au minimum 490 ms , sachant qu'une tonalité téléphonique en fait 500. Toute impulsion inférieure n'est pas prise en compte.
Ensuite, une tempo remet à zéro la sortie tonalité afin qu'un compteur puisse être opérationnel derrière.
Et enfin, un compteur positionné sur 5 tonalités active la sortie finale,une commande reset, en l’occurrence l'arrêt enregistrement dans mon cas.
j'avoue avoir été séduit par le résultat, ma femme m'ayant pris pour un fou, tant j'ai parlé dans le portable appelant mon fixe, sans que le reset ne s'active. Par contre, dès fin d'appel depuis le portable et dès les 5 tonalités, le rest s'enclenche bel et bien.
Des leds sur les différentes sorties m'ont permis de suivre l'évolution du signal, c'est pratique et permet de voir les différentes réactions.
Le code suivant donne un aperçu, notamment concernant les tempos et le compteur, sans le code GoertzeL ( mon code test tempo et compteur avant application avec Goertzel)
Si vous avez mieux, je suis preneur. Certainement qu'un code plus simple puisse se faire, notamment en utilisant mieux les variables, boutonA étant la simulation par bouton de la sortie impulsion 440hz de la carte Nano.
BoutonB celle de la sortie tonalité validée car supérieure aux 490ms imposées.
Pas encore à l'aise avec les variables, mon test final avec Goertzel, nécessite 2 transistors entre entrées-sorties en remplacement des boutons ci dessous.
Merci à Bricoleau pour la librairie simple bouton très pratique.
#include "simpleBouton.h"
simpleBouton boutonA(3); // simulation détection signal 440hz
simpleBouton boutonB_plus(2); // simulation sortie activée par une tonalité supérieure à 490ms
int compteur=0;
const int Btn = 9; // Sortie activée par une tonalité supérieure à 490ms
int tempoActive = 0;
unsigned long tempoDepart = 0;
void setup()
{
pinMode(boutonA,INPUT_PULLUP);
pinMode(Btn,OUTPUT);
pinMode(boutonB_plus,INPUT_PULLUP);
pinMode(7,OUTPUT);
}
void loop(){
//Lecture de la durée d'appui AVANT d'actualiser
uint32_t duree = boutonA.dureeEnfonce();
boutonA.actualiser();
boutonB_plus.actualiser();
if (duree >= 490)
{ digitalWrite(Btn,HIGH); // pas de DELAY - transformer tempo en millis // si plus de 490ms, sortie active
tempoActive = 1;
tempoDepart = millis();
}
if (tempoActive){
if((millis() - tempoDepart ) >= 500){ // sans cette tempo et la ligne suivante, le compteur ne peut fonctionnerb
digitalWrite(Btn,LOW);
}
if(boutonB_plus.vientDEtreEnfonce()) // en fait, si une tonalité > 490ms active le bouton simulé
{
compteur++;
if(compteur>=5) { // on compte 5 tonalités
digitalWrite(7,HIGH); // activation du RESET enregistrement - objet de ce code
delay(2000); // usage d'un delay pour alléger le code, ici millis ne s'impose pas vraiment
digitalWrite(7,LOW); // remise à zéro pour une prochaine utilisation
compteur=0; // remise à zéro compteur
}
}
}
}