Bonjour, je travaille sur un programme de serrure électronique avec une puce RFID et un servomoteur. Pour cela j'utilise différents boutons pour allumer/éteindre le système, ouvrir la porte, activer/éteindre le son. Le problème vient du fait que dans ma fonction ouverture, durant l'affectation de la variable son, la variable se met sur une des deux valeurs mais juste après la variable (de la ligne 34 et la ligne 36 la valeur change par exemple), la valeur passe à 0 pour je ne sais quelle raison. Pourriez-vous m'aider ?
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
char st[20];
int buzzer = 8; // pin du buzzer
int bouton = 5; // bouton ouverture de la porte de l'intérieur
int leo = 7; //pin bouton changement de carte
int o; // variable bouton changement de carte
int onoffson = 2; // bouton pour choisir si il y a du son/lumières
int son;
#include <Servo.h>
Servo MS1;
int PDS1 = 10; // pin servomoteur
void ouverture(){ //ouverture de la porte
digitalWrite(3, HIGH);
bool etat_son = digitalRead(onoffson); // on regarde l'état du bouton qui décide si le son est présent
if(!etat_son){
int son = 2;
}
else{
int son = 1;
}
if(son == 1){
tone(buzzer, 987.8, 150); // bip bip bip biiiiiip
delay(155);
tone(buzzer, 987.8, 150);
delay(155);
tone(buzzer, 987.8, 150);
delay(155);
tone(buzzer, 987.8, 1000);
delay(1005);
}
for(PDS1 = 10; PDS1 <= 110; PDS1++) //ouverture de la porte (servomoteur)
{
MS1.write(PDS1);
delay(15);
}
delay(1000);
for(PDS1 = 110; PDS1 >= 10; PDS1--) //fermeture de la porte
{
MS1.write(PDS1);
delay(15);
}
digitalWrite(3, LOW);
}
void setup() {
SPI.begin();
mfrc522.PCD_Init();
MS1.attach(6);
MS1.write(PDS1);
pinMode(bouton, INPUT_PULLUP);
pinMode(leo, INPUT_PULLUP);
pinMode(onoffson, INPUT_PULLUP);
pinMode(3, OUTPUT); // led bleu
pinMode(4, OUTPUT); // led rouge
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
void loop() {
bool etat_leo = digitalRead(leo); // on regarde quelle(s) carte(s) est/sont autorisée(s)
if(!etat_leo){
o = 2;
}
else{
o = 1;
}
bool etat_bouton = digitalRead(bouton); // on regarde si le bouton d'ouverture de la porte et appuyé
if(!etat_bouton)
{
ouverture(); // on ouvre la porte
}
if ( ! mfrc522.PICC_IsNewCardPresent()) // on regarde si la puce capte une carte
{
return;
}
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
String tag = "";
byte caractere;
for (byte i = 0; i<mfrc522.uid.size; i++) // on enregistre l'UID de la carte
{
tag.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
tag.concat(String(mfrc522.uid.uidByte[i], HEX));
}
tag.toUpperCase();
if(tag.substring(1) == "D0 8C 1E 1A") // si la carte est ok on ouvre
{
ouverture();
}
else if(o == 2){
if(tag.substring(1) == "82 18 63 0E"){ // si la carte est connue et qu'elle est autorisée on ouvre
ouverture();
}
}
else{ // sinon la carte est inconnue donc on bip
digitalWrite(4, HIGH);
bool etat_son = digitalRead(onoffson); // on regarde si le son est activé
if(!etat_son){
int son = 2;
}
else{
int son = 1;
}
if(son == 1){
for (int a = 1; a<4; a++){ // bip qui passe par différentes valeurs
for(int i = 700; i <= 7000; i++)
{
tone(buzzer, i, 50);
}
for (int i = 7000; i >= 700; i--)
{
tone(buzzer, i, 50);
}
}
}
digitalWrite(4, LOW);
}
delay(100);
}
> tu as une variable globale son déclarée en ligne 13 (en principe elle doit être initialisée à 0).
Une variable non initialisée à une valeur indéfinie.
En configurant convenablement les avertissements du compilateur, celui-ci indique les problèmes soulevés par joel76: variable non utilisée et variable non initialisée. Le minimum vital est de compiler avec -Wall -Wextra et de réduire au maximum les variables globales.
Dans tous les cas, cette variable son ne sert à rien et peut-être remplacé par if (etat_sont).
Idem pour o qui n'est en fait qu'un bool basé sur etat_leo. Au passage un code cette forme:
if(!etat_leo){
o = 2;
}
else{
o = 1;
}
peut s'écrire:
o = etat_leo ? 1 : 2;
Toute la transformation bizarre en chaîne de caractère pour faire une comparaison peut être remplacé par
if (mfrc522.uid.size == 5) {
// si la carte est ok on ouvre
if (mfrc522.uid.uidByte[1] == 0xD0
&& mfrc522.uid.uidByte[2] == 0x8C
&& mfrc522.uid.uidByte[3] == 0x1E
&& mfrc522.uid.uidByte[4] == 0x1A
) {
ouverture();
}
else if(o == 2){
// si la carte est connue et qu'elle est autorisée on ouvre
if (mfrc522.uid.uidByte[1] == 0x82
&& mfrc522.uid.uidByte[2] == 0x18
&& mfrc522.uid.uidByte[3] == 0x63
&& mfrc522.uid.uidByte[4] == 0x0E
) {
ouverture();
}
}
}
On peut aussi faire une fonction qui récupère un tag pour simplifier les comparaisons
Après avoir fait les modifications ça a fonctionné mercii. (désolé pour le temps de la réponse j'ai eu un problème et j'ai dû ressouder pas mal des composants du projet avant de pouvoir tester le nouveau code)
Et en effet je ne suis pas très doué en programmation hardware vu que je n'ai pas vu de cours à ce sujet juste lu quelques fiches et regardé quelques vidéos.
en fait c'est plutôt arduino donc je ne savais pas où le mettre dsl du coup je le mettrai en C++ la prochaine
Variable qui change de valeur sans raison
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le crayon la gomme et le papier sont les meilleurs outils du programmeur !
Le crayon la gomme et le papier sont les meilleurs outils du programmeur !