Bonjour,
Je m'excuse tout d'abord si ce que je dis semble brouillon, j'ai des bases très faibles en programmation et ne connais sans doute pas les conventions.
Je suis étudiant en 2eme année de licence de physique, et nous avions un projet d'électronique a rendre pour la fin de l'année, mais le COVID et les fermetures d'établissements ont un peu bousculé l'organisation.
Nous avons choisi avec mon binôme de créer un système de serrure, qui ne s'ouvre que si un certain rythme à été tapé avec nos mains, et ce projet avait été validé par les enseignants, malheureusement la communication avec eux s'est faite difficile pendant ces quelques mois, et sans réponse depuis bientôt un mois, je tente ma chance ici.
int Rythme = 13 ; //Led qui servira de Métronome
int Clap = 2 ; //Entrée du Microphone qui détecte les claquements de mains/doigts
int Faux = 12 ; //Led qui affichera si une erreur à été faite
int Fermeture = 3;
float temps_debut, temps_ecoule; //Temps qui serviront a calculer le rythme
bool ouvert = false;
int phase = 0; //variable pour savoir a quel moment du rythme nous sommes
void setup() {
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(Clap),arrivee_signal,RISING); //Un AmpliOp sera utilisé, on attend alors une élévation de 0 à 5V
attachInterrupt(digitalPinToInterrupt(Fermeture), Fermer, RISING); //C'est un simple bouton poussoir, élévation de 0 à 5V encore
pinMode(Rythme, OUTPUT);
pinMode(Clap, INPUT);
pinMode(Faux, OUTPUT);
}
void arrivee_signal() {
if (phase = 0) { //premier clap, alors prendre le temps de debut
temps_debut=millis();
phase = 1; //passer a la phase suivante
}
else {
temps_ecoule = millis()-temps_debut ; //calculer le temps ecoulé depuis les dernier clap
if (phase = 1) { //détecte a quelle phase nous sommes
if (temps_ecoule > 500 and temps_ecoule < 600) { //verifie que le temps écoulé soit le bon, avec un certain interval
phase =+1; //passer a la phase suivante
temps_debut = millis(); //reinitialiser le temps de référence
}
else {
digitalWrite(Faux, HIGH); //si une erreur a été faite, allumer la LED d'erreur
delay(1000);
digitalWrite(Faux, LOW); //laisser la Led allumée une seconde
phase = 0;
}
}
else {
if (phase = 2) {
if (temps_ecoule > 500 and temps_ecoule < 600) {
phase =+1;
temps_debut = millis();
}
else {
digitalWrite(Faux, HIGH);
delay(1000);
digitalWrite(Faux, LOW);
phase = 0;
}
}
}
}
}
void Fermer() {
if (ouvert = true ){
//Fermer la serrure
}
else {
for (int i=0; i<=10; i++) //La serrure est déja fermée, le montrer en faisant clignoter la LED d'erreur
digitalWrite(Faux, HIGH);
delay(80);
digitalWrite(Faux, LOW);
delay(80);
}
}
void loop() {
if (phase=3){
digitalWrite(Rythme, HIGH);
//ici ouvrir la serrure
ouvert = true;
}
}
Nous avons été conseillé d'utiliser des interruptions pour détecter les clappements, ce qui semble effectivement être la solution, mais après avoir envoyé une première version du code, certaines erreurs ont été relevées qui ont entrainées des questions auxquelles nous n'avons pas eu de réponses:
-Il n'est apparemment pas une bonne idée de traiter l'interruption dans le sous programme de l'interruption, car cela empêche une autre interruption, mais alors comment détecter qu'une interruption a eu lieu dans le programme principal?
-Après la fin du traitement du sous programme d'interruption, ou "reprend" le programme ? Ou il en etait, ou revient il au debut de la boucle loop?
-Nous aimerions avoir une Led qui clignotte afin de servir de métronome pour taper le rythme, est il possible de la faire clignoter avec le même programme?
-Nous utilisons une serrure solénoide qui demande trop d'intensité pour arduino, quel critères faut il regarder pour choisir un relais?
Une difficulté supplémentaire ici est que nous n'avons pas accès au matériel, tout est purement théorique donc et e projet ne sera jamais réalisé, ce qui n'aide pas a découvrir les choses par nous même comme il était initialement prévu. Je vous remercie d'avance pour avoir lu jusque ici, en espérant que vous ayez des réponses a nos questions.