Bonjour,
j'ai réalisé un projet assez semblable cette semaine avec un verrou à ouvrir ou fermer et deux interrupteurs. Mon projet est basé sur Rasp Pi Pico.
L'ouverture/fermeture du verrou est commandée par carte magnétique. Selon lequel des interrupteur est fermé, l'action ouvrir ou fermer est choisie et s'exécute jusqu'à ce que l'autre interrupteur soit activé.
Le temps du mouvement, une DEL tri-color indique l'état de la situation: jaune pendant le mouvement, rouge à la fin du mouvement de fermeture, vert à la fin du mouvement d'ouverture.
Le mouvement est assuré par un step-moteur.
Je n'ai pas le temps de lire toute la discussion, toutes les modifications au programme que tu as fait., mais si ça peut t'aider, voici mon code.
#include <Stepper.h>
#include <SPI.h>
#include <MFRC522.h>
//En vue de fonctionner sous Respberry PICO
/*----- Variables, Pins -----*/
//#define STEPS 4 // Number of steps per revolution of Internal shaft
int delai = 60000; //La DEL restera allumée pendant une minute après la fin du mouvement, affichant alors rouge ou vert alors que durant le mouvement elle affichera jaune
int pas = 25; // 1 tour = 2048
int sens = 1;
int vitesse = 500; //Max 500
String libre = "oui";
bool tourne = false;
bool initOUV = false;
bool initFER = false;
int rendu = 0;
int pinSW1 = 26; //GPIO00 = pin 31 -> Interrupteur fermé lorsque la porte est ouverte => DEL vert
int pinSW2 = 27; //GPIO01 = pin 32 -> Interrupteur fermé lorsque la porte est fermée => DEL rouge
int pinMO1 = 2; //GPIOO2 = pin 4 -> Mouvement du moteur, contrôleur 1
int pinMO2 = 3; //GPIOO3 = pin 5 -> Mouvement du moteur, contrôleur 2
int pinMO3 = 4; //GPIOO4 = pin 6 -> Mouvement du moteur, contrôleur 3
int pinMO4 = 5; //GPIOO5 = pin 7 -> Mouvement du moteur, contrôleur 4
int pinDER = 13; //GPIO13 = pin 17 -> Rouge de la DEL; ... nous n'utiliserons pas le bleu de la DEL tri-colore, car les couleurs souhaitées sont rouge, jaune et vert, néanmoins, le bleu sera connecté à GPIO16 ... au cas où!
int pinDEV = 14; //GPIO14 = pin 19 -> Vert de la DEL; ... nous n'utiliserons pas le bleu de la DEL tri-colore, car les couleurs souhaitées sont rouge, jaune et vert, néanmoins, le bleu sera connecté à GPIO16 ... au cas où!
int pinDEB = 15; //GPIO15 = pin 20 -> Bleu de la DEL; ... nous n'utiliserons pas le bleu de la DEL tri-colore
byte RST_PIN = 21; // Configurable, see typical pin layout above
byte SS_1_PIN = 17; // Configurable, take a unused pin, only HIGH/LOW required, must be different to SS 2
//Création des principaux objets
Stepper moteur(32, pinMO1, pinMO3, pinMO2, pinMO4);
/*
Voici comment connecter le module moteur
PINcarte Defn PICO GPIO
A1 GND ------>>>>>>>>>> AliM GND
A2 5V ------>>>>>>>>>> Alim GND
B1 IN1 4 GPIO2
B2 IN2 5 GPIO3
B3 IN3 6 GPIO4
B4 IN4 7 GPIO5
*/
MFRC522 cartes; // Create MFRC522 instance.
/*
Voici comment connecter les fils du lecteur de cartes magnétiques
PINcarte Defn PICO GPIO
1 3.3V ------>>>>>>>>>> Alim 3.3 volts
2 RST 27 GPIO21
3 GND ------>>>>>>>>>> Alim GND
4 RQ ----- >>>>>>>>>> Libre (non-connecté)
5 MISO 21 GPIO16
6 MOSI 25 GPIO19
7 SCK 24 GPIO18
8 SDA 22 GPIO17
*/
void setup() {
Serial.begin(115200);
Serial.println("");
delay(550);
Serial.println("Bonjour les testeurs");
SPI.begin(); // Init SPI bus
Serial.println("SPI est démarré.");
cartes.PCD_Init(SS_1_PIN, RST_PIN); // Init each MFRC522 card
cartes.PCD_DumpVersionToSerial();
pinMode(pinSW1, INPUT); //Interrupteur fermé lorsque la porte est ouverte => DEL vert
pinMode(pinSW2, INPUT); //Interrupteur fermé lorsque la porte est fermée => DEL rouge
pinMode(pinMO1, OUTPUT); //Moteur 1
pinMode(pinMO2, OUTPUT); //Moteur 2
pinMode(pinMO3, OUTPUT); //Moteur 3
pinMode(pinMO4, OUTPUT); //Moteur 4
pinMode(pinDER, OUTPUT); //rouge de la DEL
pinMode(pinDEV, OUTPUT); //vert de la DEL
pinMode(pinDEB, OUTPUT); //bleu de la DEL
digitalWrite(pinMO1, LOW);
digitalWrite(pinMO2, LOW);
digitalWrite(pinMO3, LOW);
digitalWrite(pinMO4, LOW);
digitalWrite(pinDER, LOW);
digitalWrite(pinDEV, LOW);
digitalWrite(pinDEB, LOW);
Serial.println("Voici que tout est défini. Il ne reste qu`à jouer de la porte.");
} // fin de setup()
void loop() {
if (++rendu > 100) { rendu = 0; Serial.println("Nous voici en début de boucle."); }
digitalWrite(pinDER, LOW);
digitalWrite(pinDEV, LOW);
digitalWrite(pinDEB, LOW);
if ( !cartes.PICC_IsNewCardPresent() || !cartes.PICC_ReadCardSerial() ) {
delay(50);
return;
}
Serial.println("Nous voici en analyse de carte.");
digitalWrite(pinDER, LOW);
digitalWrite(pinDEV, LOW);
digitalWrite(pinDEB, HIGH);
if (!carteValide(cartes.uid.uidByte, cartes.uid.size)) { return; }
Serial.println("La carte a été jugée valide.");
if (libre != "oui") { return; }
delay(1000);
Serial.println("Le système est disponible.");
libre = "ouvrons";
sens = 1;
if (digitalRead(pinSW2) == LOW) {
sens = -1;
libre = "fermons";
}
digitalWrite(pinDER, HIGH);
digitalWrite(pinDEV, HIGH);
digitalWrite(pinDEB, LOW);
while (libre == "ouvrons" || libre == "fermons") {
Serial.print ("Libre = ");
Serial.print (libre);
Serial.print (" avec 1 = ");
Serial.print ((digitalRead(pinSW1)==HIGH) ? "HIGH" : "LOW");
Serial.print (" et 2 = ");
Serial.println((digitalRead(pinSW2)==HIGH) ? "HIGH" : "LOW");
moteur.setSpeed(vitesse);
moteur.step(sens * pas);
if ((digitalRead(pinSW2) == LOW && libre == "ouvrons") || (digitalRead(pinSW1) == LOW && libre == "fermons")) {libre = "oui"; }
delay(10);
}
if (digitalRead(pinSW1) == HIGH) {
digitalWrite(pinDER, LOW);
digitalWrite(pinDEV, HIGH);
digitalWrite(pinDEB, LOW);
delay(1500);
}
if (digitalRead(pinSW2) == HIGH) {
digitalWrite(pinDER, HIGH);
digitalWrite(pinDEV, LOW);
digitalWrite(pinDEB, LOW);
delay(1500);
}
digitalWrite(pinMO1, LOW);
digitalWrite(pinMO2, LOW);
digitalWrite(pinMO3, LOW);
digitalWrite(pinMO4, LOW);
libre = "oui";
} //Fin de loop()
bool carteValide(byte *buffer, byte bufferSize) {
String pat = "";
for (byte i = 0; i < bufferSize; i++) {
pat = pat + String(buffer[i] < 0x10 ? " 0" : " ");
pat = pat + String(buffer[i], HEX);
}
pat.toUpperCase();
pat.trim();
return (pat=="89 A3 F0 97") ? true : false;
}
Ce code compte quelques traces du développement comme des retour Serial.print qui ne servent à rien d'autre que savoir où on en est ou encore des variables définies qui ne servent plus.