// Programme écrit pas Matthieu MONCEAUX. nov 2018 // Ouvre et ferme automatiquement la porte du poulailler en fonction de la lumière // On est obligé de mettre un capteur en position haute, car sinon, en cas de coupure de courant, on ne sait plus où on est. // // Schéma cablage (voir http://mmonceaux.free.fr/): // D2 = capteur magnétique ILS (position haute) entre masse et D2, + résistance de 10k au +5V (et cond 10nF en // à ILS pour éviter effet rebond) // D8 arduino ---> IN1 step // D9 arduino ---> IN2 step4 // D10 arduino ---> IN3 step // D11 arduino ---> IN4 step // Pour arduino Nano : alim sur pin27-"5v" = 5v (et pas sur "Vin"-pin30, 7v à 12v pour éviter de chauffer le régulateur de la carte nano) // Capteur LDR sur A0 avec : +5V <-> LDR <-> A0 <-> Résistance de 10K <-> masse // // 20180607 : je laisse tomber les fonctions sleep, qui permettraient de gagner 20mA sur la consommation... trop peu #include // charger en mémoire la routine de gestion du moteur pas à pas const int nombre_demi_tour = 15; //14 <---------- nombre de demi-tours nécessaires pour descendre suffisamment la trappe 14t=25cm int ldr; // lit la valeur du capteur LDR branché sur pin A0 int capteur_porte_haut; // = 0 si la porte est ouverte, et que le contact entre aimant et capteur magnétique est bon int essai_montee = 0; // nombre d'essai pour arriver au capteur porte haut ; afin d'arrêter le moteur s'il n'est pas possible d'arriver au niveau du capteur int porte_fermee; // variable pour mémoriser l'état de la porte : si fermee = 1 const int StepsPerRevolution = 1024; // Pour moteur 28BYJ-48 2048=1 tour, 1024=1/2 tour. Stepper myStepper(StepsPerRevolution, 8, 10, 9, 11); // initialise la bibliotheque stepper sur les broches D8 a D11 : pin1,pin2,pin3,pin4 // FONCTION DEMARREE SEULEMENT APRES RESET OU NOUVELLE MISE EN ALIMENTATION void setup() // Fonction setup qui s'enclenche seulement 1 fois après un reset (ou OFF/ON) de la carte Arduino { // Définition des entrées : pinMode(02, INPUT); // Broche D02 = capteur porte en haut pinMode(8, OUTPUT); // moteur pas à pas pinMode(10, OUTPUT); // moteur pas à pas pinMode(9, OUTPUT); // moteur pas à pas pinMode(11, OUTPUT); // moteur pas à pas myStepper.setSpeed(28); // reglage de la vitesse du moteur pas à pas (28BYJ-48) : 4 à 14 ou 28 en mode demi-tour Serial.begin(9600); // Ouverture du "moniteur série" pour affichage dans le logiciel Arduino sur PC // Affichage des états dans le moniteur série capteur_porte_haut = digitalRead(02); // lit la valeur du capteur magnétique de fin de course porte en haut Serial.print("Capteur Porte Haut (0=contact)= "); Serial.print(capteur_porte_haut); Serial.print(" "); Serial.print("Porte Fermee= "); Serial.print(porte_fermee); Serial.print(" "); Serial.print("Nombre Essai montee= "); Serial.print(essai_montee); Serial.print(" "); ldr = analogRead(A0); // lit la valeur du capteur LDR branché sur pin A01, moins il y a de la lumière, plus la valeur de LDR est grande Serial.print("LDR="); Serial.print(ldr); // affiche la valeur de ldr dans le moniteur série Serial.println(); delay(10); // stabilisation affichage // préparation de la porte : monter jusqu'au capteur haut : while ((capteur_porte_haut == 1) && (essai_montee < 40)) // Tant que la porte n'est pas en haut (haut=0) ou essai de montée <40 { myStepper.step(-StepsPerRevolution * 1); essai_montee = essai_montee + 1; // pour éviter au moteur de fonctionner sans arrêt si la corde est cassée // Affichage des états dans le moniteur série capteur_porte_haut = digitalRead(02); // lit la valeur du capteur magnétique de fin de course porte en haut Serial.print("Capteur Porte Haut (0=contact)= "); Serial.print(capteur_porte_haut); Serial.print(" "); Serial.print("Porte Fermee= "); Serial.print(porte_fermee); Serial.print(" "); Serial.print("Nombre Essai montee= "); Serial.print(essai_montee); Serial.print(" "); ldr = analogRead(A0); // lit la valeur du capteur LDR branché sur pin A01, moins il y a de la lumière, plus la valeur de LDR est grande Serial.print("LDR="); Serial.print(ldr); // affiche la valeur de ldr dans le moniteur série Serial.println(); delay(10); // stabilisation affichage porte_fermee = 0; eteindre(); } } //// FONCTION ETEINDRE : eteind reelement le moteur ; la fonction "mystepper" ne l'eteingnait pas bien et il continuait à chauffer sans tourner... void eteindre() { digitalWrite(8, LOW); digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(11, LOW); } void loop() // Fonction loop = programme principal du Arduino, boucle qui tourne sans arrêt { // Affichage des états dans le moniteur série capteur_porte_haut = digitalRead(02); // lit la valeur du capteur magnétique de fin de course porte en haut Serial.print("Capteur Porte Haut (0=contact)= "); Serial.print(capteur_porte_haut); Serial.print(" "); Serial.print("Porte Fermee= "); Serial.print(porte_fermee); Serial.print(" "); Serial.print("Nombre Essai montee= "); Serial.print(essai_montee); Serial.print(" "); ldr = analogRead(A0); // lit la valeur du capteur LDR branché sur pin A01, moins il y a de la lumière, plus la valeur de LDR est grande Serial.print("LDR="); Serial.print(ldr); // affiche la valeur de ldr dans le moniteur série Serial.println(); delay(10); // stabilisation affichage if (ldr < 200 && porte_fermee == 0) // alors c'est la nuit --> fermer porte { // Affichage des états dans le moniteur série capteur_porte_haut = digitalRead(02); // lit la valeur du capteur magnétique de fin de course porte en haut Serial.print("Capteur Porte Haut (0=contact)= "); Serial.print(capteur_porte_haut); Serial.print(" "); Serial.print("Porte Fermee= "); Serial.print(porte_fermee); Serial.print(" "); Serial.print("Nombre Essai montee= "); Serial.print(essai_montee); Serial.print(" "); ldr = analogRead(A0); // lit la valeur du capteur LDR branché sur pin A01, moins il y a de la lumière, plus la valeur de LDR est grande Serial.print("LDR="); Serial.print(ldr); // affiche la valeur de ldr dans le moniteur série Serial.println(); delay(10); // stabilisation affichage porte_fermee = 1; //porte fermée myStepper.step(StepsPerRevolution * nombre_demi_tour); // myStepper.step(-StepsPerRevolution*nombre_demi_tour); eteindre(); delay(2000); } if ((ldr > 450) && (porte_fermee == 1)) // alors c'est le jour --> ouvrir la porte { porte_fermee = 0; essai_montee = 0; while ((capteur_porte_haut == 1) && (essai_montee < 30)) // Tant que la porte n'est pas en haut (haut=0) ou essai de montée <30 { myStepper.step(-StepsPerRevolution * 1); essai_montee = essai_montee + 1; // pour éviter au moteur de fonctionner sans arrêt si la corde est cassée // Affichage des états dans le moniteur série capteur_porte_haut = digitalRead(02); // lit la valeur du capteur magnétique de fin de course porte en haut Serial.print("Capteur Porte Haut (0=contact)= "); Serial.print(capteur_porte_haut); Serial.print(" "); Serial.print("Porte Fermee= "); Serial.print(porte_fermee); Serial.print(" "); Serial.print("Nombre Essai montee= "); Serial.print(essai_montee); Serial.print(" "); ldr = analogRead(A0); // lit la valeur du capteur LDR branché sur pin A01, moins il y a de la lumière, plus la valeur de LDR est grande Serial.print("LDR="); Serial.print(ldr); // affiche la valeur de ldr dans le moniteur série Serial.println(); delay(10); // stabilisation affichage } delay(2000); eteindre(); // eteindre reelement le moteur ; une partie des bobines étaient encore alimentées et le moteur chauffait sans tourner } } // fin du programme général