Code senseur tapotement

Bonjour à tous,
Je cherche à écrire un code arduino de manière à donner un 1 sur une patte configurée en sortie, ceci lorsqu'une patte configurée en entrée reçoit une tension dépassant un seuil donné selon une chronologie particulière. Il s'agit par exemple de réagir à un tapotement dont le premier top serait placé au départ, suivi d'une demi-seconde de silence, et se terminant par 3 tops devant avoir lieu dans la demi-seconde qui suit. Un reset aurait lieu si 4 tops successifs auraient lieu en une demi-seconde.
Quelqu'un aurait la gentillesse de bien vouloir m'aider ? Sans doute existe t-il aussi quelqu'un qui a créé un code sur une autre chronologie et dont je pourrais m'inspirer. Merci.

faites un google sur "arduino Secret Knock"

C'est bien cela que je cherchais. Grand merci.

Bonjour,
J'ai bien trouvé et mon code fonctionne très bien.
Cependant, en se basant sur l'intensité d'un son, il serait plus opportun de moyenner le premier dizième de seconde plutôt que de prendre le premier signal qui peut ne pas être représentatif. Je peux éventuellement placer dans ce fil le programme utilisé, mais je pense que cette demande doit être un classique. Pourriez-vous m'aiguiler vers une solution ou un lien abordant ce sujet ? Merci.

postez votre code et description du montage
c'est toujours bien de partir de quelque chose de concret

Voici le code. Pour le moment, cela reste au stade de l'essai sur le micro-contrôleur uniquement, avec des Serialprint à titre de contrôle.

const int knockSensor = P1_3;
const int thresholdHIGH = 150;
const int thresholdLOW = 100;
const int secretKnockLenght = 4;
const int secretKnock[ secretKnockLenght ] = {1,1,1,0};
int sensorReading = 0;
int secretCounter = 0;
void setup() 
{ 
pinMode (knockSensor, INPUT);
Serial.begin(9600);}
void loop() {
  sensorReading  = analogRead(knockSensor);
if (sensorReading <= thresholdLOW){
  if (secretKnock[ secretCounter ] ==1) {
    secretCounter++;
    Serial.println("correct");
    Serial.println(sensorReading);
  }else{
    secretCounter = 0;
    delay(10);
    Serial.println("fail");
    delay(100);
    Serial.println(sensorReading);
    delay(100);
  }
  delay(100);
} else if (sensorReading <= thresholdHIGH) {
  if (secretKnock[ secretCounter ] ==0) {
    secretCounter++;
    Serial.println("correctb");
    Serial.println(sensorReading);
  }else{
    secretCounter = 0;
    Serial.println("fail");
    delay(10);
    Serial.println(sensorReading);
     delay(100);
  }
  delay(200);
  if (secretCounter == (secretKnockLenght) ) {
     Serial.println("ok");
   delay(2000);              
   secretCounter = 0;
}}}

   

vous ne faites qu'une seule lecture; Prendre la moyenne va affaiblir le signal l'important c'est de détecter les "coups".
Par contre il y a plein de delay(), c'est plutôt ça le challenge qui rend la tempo très aléatoire

Attention, ici on teste et compare 4 intensités de sons brefs, peu importe le délai entre ces sons. Si les délais ne sont pas placés après chaque capture, le programme serait tellement rapide et capturerait plusieurs sons dans la première fraction de seconde. D'ailleurs, si je les enlève, mon moniteur affiche directement plusieurs données. D'où ma demande de moyenner, ou alors, un peu de façon analogue à la solution logicielle pour ne pas prendre en compte les rebonds lorsqu'on utilise des programmes avec des boutons-poussoirs, attendre une fraction de seconde très courte après le premier seuil d'intensité atteint, et prendre en compte la valeur lue alors. Merci pour vos éclaircissements.

votre spécification c'était

réagir à un tapotement dont le premier top serait placé au départ, suivi d'une demi-seconde de silence, et se terminant par 3 tops devant avoir lieu dans la demi-seconde qui suit

je n'ai pas l'impression que ce soit ce que teste le code

Ah oui, mille excuses, vous avez parfaitement raison. J'étais parti initialement sur cette première demande, et lorsque j'ai trouvé un autre exemple sur le net prenant plutôt 4 sons d'intensités différentes, sans contrainte de temps, le code affiché était tellement plus simple, que j'ai choisi de m'essayer sur la simplicité pour commencer. Encore pardon ! Evidemment, avec ma deuxième demande, s'il faut éliminer les faux positifs et les faux négatifs, peut-être que le code va devenir plus compliqué que le premier....

Puis-je en profiter pour vous demander aussi ceci,
lorsque je remplace tout en haut dans mon programme, les" const int" par des "#define", le compilateur du croquis échoue et m'indique ceci en bas de l'écran :
exit status 1
expected ')' before ';' token

recopie ci-dessous de la partie déclarative du programme...

[code]
const int knockSensor = P1_3;
#define thresholdHIGH 300;
#define thresholdLOW 200;
const int secretKnockLenght = 4;
const int secretKnock[ secretKnockLenght ] = {0,0,0,1};
int sensorReading = 0;
int secretCounter = 0;

(j'ai été un peu trop vite)...

Il s'agit alors de cette ligne ci-dessous dans le code présenté précédemment qui se met en grisé...
if (sensorReading <= thresholdLOW){

Il ne faut pas mettre de ; après les #define

Un define c’est comme si vous demandiez au compilateur de remplacer le mot clé partout où il se trouve par ce qui est dans la ligne de definition - donc si vous avez un point virgule il va se retrouver injecté dans le code

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.