Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Porte coulissante automatique pour le garage

Composants et fournitures

Arduino Nano R3
× 1
Planche à pain (générique)
Pour tenir l'Arduino Nano et l'écran Oled
× 1
Affichage Oled Adafruit
Pour afficher l'état du capteur, le compteur de temps et les actions.
× 1
Module relais (générique)
Module 4 relais. Je n'en ai utilisé que trois.
× 1
SparkFun Breadboard Alimentation 5V/3.3V
J'ai utilisé une alimentation miniature 5V à partir de 220V
× 1
Interrupteur à bouton-poussoir SparkFun 12mm
Pour le bouton de réinitialisation (effacer l'alarme de dysfonctionnement)
× 1

À propos de ce projet

Contexte

Bon, l'histoire a commencé un jour en arrivant chez moi et j'ai réalisé que la télécommande de la porte coulissante ne fonctionnait pas. "Les piles !" Je pensais, mais non, ce n'était pas la raison. J'ai enquêté un peu et quelle surprise lorsque j'ai retiré le capot du moteur de la porte :un petit lézard s'est littéralement carbonisé dans un tout petit espace entre la carte électronique et le support en plastique (d'ailleurs, je ne vais pas télécharger d'images de cette scène horrible). Je suppose que le petit reptile a touché les fastons 220V et a produit un court-circuit. Le résultat fut sa mort et tout le circuit fut brûlé.

J'ai retiré du tableau certains composants que je pouvais conserver pour les utiliser dans mes projets, mais vous pouvez voir sur cette photo comment cela s'est terminé.

À ce moment précis, j'ai décidé que cela pourrait être l'excuse parfaite pour faire un projet Arduino et une reconstruction complète de l'unité de contrôle.

ATTENTION

Pour ce projet vous aurez affaire à des composants branchés en 220V directement (ou 110V). Tenez compte du fait que cela peut être dangereux si vous n'êtes pas très habile avec ce genre d'installations. S'il vous plaît, soyez prudent et procédez avec prudence. Effectuez toujours une simulation avant de vous connecter au circuit moteur réel.

Composants et circuits

Le projet est divisé en quelques parties, mais ce que je présente ici est le circuit Arduino qui contrôle la rotation du moteur et le voyant lumineux, et prend en compte l'état des capteurs de fin de course et d'une cellule photoélectrique de sécurité.

Au début, on pouvait penser qu'il est facile à construire et à programmer, mais je peux vous assurer que j'ai dû surmonter beaucoup de difficultés qui ont rendu ce projet si passionnant.

D'autres composants importants pour l'ensemble du projet sont :

  • Moteur électrique 220 V et guides et mécanismes physiques :ceux-ci n'ont pas été affectés par l'action du lézard.
  • Récepteur radio à distance pour émettre la commande "Ouvrir" :j'ai utilisé une unité commerciale prête à l'emploi qui comprenait les télécommandes et le récepteur.
  • Relais 220 V pour prendre en charge le courant élevé utilisé par le moteur.
  • Unité de commande principale fabriquée avec Arduino Nano et d'autres accessoires compatibles tels que l'affichage OLED et le module de relais. C'est ce que je vous montre dans ce portail.

J'ai également ajouté quelques améliorations et plusieurs actions automatisées qui n'étaient pas incluses dans l'unité de contrôle d'origine commerciale.

Brochages pour ce projet

Les informations suivantes résument les broches des composants et comment les connecter :

Comme vous pouvez le voir, pour ce projet, j'ai utilisé un écran OLED directement attaché à la carte. Dans des conditions normales de fonctionnement, cet affichage est situé à l'intérieur du capot de protection du mécanisme et de l'électronique. Donc, vous ne pouvez pas le voir. En fait, cet affichage est destiné à être utilisé uniquement pour vérifier l'état des composants pendant que vous ajustez les paramètres et faites un réglage fin du code (réglage du temps max par exemple).

Les informations fournies par cet écran auraient également pu être envoyées au port série et vérifiées à partir d'un ordinateur portable avec le logiciel Arduino IDE, mais je trouve que ce petit écran est un moyen sympa de faire fonctionner l'unité sans avoir besoin d'utiliser un ordinateur portable ou d'autres appareil.

Les informations affichées dans l'OLED sont les suivantes :

  • Phase du code en cours d'exécution (Ouverture de la porte, fermeture de la porte, attente de la commande "Open", boucle principale, ...)
  • Temps écoulé pour les actions principales (Ouverture, attente avant fermeture et fermeture)
  • Statut de la cellule photoélectrique (actif lorsque quelqu'un ou quelque chose se trouve dans le chemin de fermeture)
  • État du capteur de limite FERMÉ (actif lorsque la porte est complètement fermée)
  • État du capteur de limite OUVERTE (actif lorsque la porte est complètement ouverte)
  • Signal de commande OUVERT (actif lorsque la télécommande est enfoncée et que le module radio active un relais)

Remarque :l'écran OLED que j'utilise mesure 0,96 pouces et a une résolution de 128 x 64 pixels. Cet écran peut utiliser I2C ou SPI pour communiquer avec le dispositif de contrôle (Arduino Nano dans ce cas) et j'utilise SPI (Serial Peripheral Interface).

Organigrammes

Les organigrammes suivants résument le code du logiciel de manière lisible :

Code

  • Version du code du logiciel en anglais
  • Code
Version du code du logiciel anglaisC/C++
Ici vous avez le code avec tous les commentaires traduits en anglais. Il comprend une courte liste de vocabulaire afin de comprendre la signification des variables et des étiquettes.
/****************************** ******************************************* Automatisme pour porte coulissante motorisée**** ******************************************************** ***************//* Les commentaires sont traduits en anglais, mais afin de vous aider à comprendre le nom des variables et des libellés, vous disposez ici d'un vocabulaire rapide "catalan-anglais" :Boucle principale =Boucle principale Sequencia Obertura =Séquence d'ouverture Sequencia Tancament =Séquence de fermeture Obrir =Ouvert; Obert =Ouvert Tancar =Fermer; Tancat =Fermé Bombeta =Ampoule Llum =Lumière Porta =Portail / porte Avaria =Défaillance Temps =Temps Recorregut =Déplacement de la porte*/// Bibliothèques pour écran Oled#include #include #include #include // Nous définissons les broches à utiliser par le circuit de contrôleint FOTOCELULA =2;int BOMBETA =5; //Relais 1int TANCAT =7;int OBERT =3;int MOTOR_OBRIR =6; //Relais 2int MOTOR_TANCAR =12; //Relay 3int OBRIR =4;// On définit les broches à utiliser par l'écran Oled#define OLED_MOSI 11#define OLED_CLK 13#define OLED_DC 9#define OLED_CS 10#define OLED_RESET 8Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_RESET, , OLED_CS);// On définit des variables globales unsigned long TEMPS_PORTA_OBERTA =20000;unsigned long TEMPS_MAXIM_RECORREGUT =15000; // Plus tard, nous redéfinirons cet intervalle valueint =1000; // L'intervalle est le temps d'attente TEMPS_DISPLAY =1; // Temps d'affichage en secondes DURADA =300; // Cicle pour ampoule non signé longtemps précédentMillis =0; // Suit le temps écoulé depuis le dernier événement déclenché unsigned long currentMillis =millis();unsigned long TEMPS_LLUM =1000; // temps en millisecondes pour l'ampoule statusboolean LLUM =false; // lumière ON ou OFFboolean AVARIA =false; //temps de trajet de la porte dépassé sans détection de la configuration de switchvoid limite () { // Éteindre le moteur et la lumière digitalWrite(MOTOR_OBRIR, HIGH); digitalWrite(MOTOR_TANCAR, HAUT); digitalWrite(BOMBETA, HAUT); // On initialise les broches pour l'automatisme pinMode(FOTOCELULA, INPUT_PULLUP); pinMode(TANCAT, INPUT_PULLUP); pinMode(OBERT, INPUT_PULLUP); pinMode(OBRIR, INPUT_PULLUP); pinMode(BOMBETA, SORTIE); pinMode(MOTOR_OBRIR, SORTIE); pinMode(MOTOR_TANCAR, SORTIE); // Affichage de l'initialisation Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC); display.display(); // Afficher le délai initial du logo Adafruit (1000); display.clearDisplay(); display.display(); // Nous préparons la taille du texte pour l'affichage (pas important car plus tard il est redéfini dynamiquement) display.setTextSize(1); display.setTextColor(WHITE);}void loop() {BUCLE_PRINCIPAL:delay(2000); précédentMillis =millis(); while (digitalRead(OBRIR) ==HIGH) { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("BUCLE PRINCIPAL ..."); display.setTextSize(1); display.setCursor(0, 20); display.print("Fotocel.lula:"); display.println(digitalRead(FOTOCELULA)); display.print("Capteur TANCAT:"); display.println(digitalRead(TANCAT)); display.print("Capteur OBERT:"); display.println(digitalRead(OBERT)); display.print("Ordre OBRIR:"); display.println(!digitalRead(OBRIR)); display.display(); if (AVARIA et (millis() - previousMillis <60000)) { digitalWrite(BOMBETA, LOW); } else (digitalWrite(BOMBETA, HIGH)); } ; // Nous attendons jusqu'à ce que la commande Open soit émise et pendant ce temps l'affichage est en train de se rafraîchir en indiquant l'état des capteurs goto SEQUENCIA_OBERTURA;SEQUENCIA_OBERTURA:interval =28000; // Temps maximum d'ouverture de la porte (s'il est dépassé, cela indiquera un échec) previousMillis =millis(); digitalWrite(MOTOR_OBRIR, LOW); digitalWrite(BOMBETA, LOW); delay(1000);A:if (digitalRead(OBERT) ==HIGH) { goto PORTA_OBERTA; } ; if (digitalRead(OBRIR) ==LOW) { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("Ordre espérant par tancar"); // "Ordre d'attente pour fermer" display.setTextSize(1); display.setCursor(0, 20); display.print("Fotocel.lula:"); display.println(digitalRead(FOTOCELULA)); display.print("Capteur TANCAT:"); display.println(digitalRead(TANCAT)); display.print("Capteur OBERT:"); display.println(digitalRead(OBERT)); display.print("Ordre OBRIR:"); display.println(!digitalRead(OBRIR)); display.display(); digitalWrite(MOTOR_OBRIR, HAUT); digitalWrite(BOMBETA, HAUT); retard(1000); while (digitalRead(OBRIR) ==HIGH) {} ; //Ne rien faire jusqu'à ce que la commande OPEN soit émise goto SEQUENCIA_TANCAMENT; } ; //--Contrôle du temps et rafraîchissement de l'affichage--------------- currentMillis =millis(); TEMPS_DISPLAY =(currentMillis - previousMillis) / 1000 ; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("Obrint porta"); display.setTextSize(2); display.setCursor(90, 0); display.println(TEMPS_DISPLAY); display.setTextSize(1); display.setCursor(0, 20); display.print("Fotocel.lula:"); display.println(digitalRead(FOTOCELULA)); display.print("Capteur TANCAT:"); display.println(digitalRead(TANCAT)); display.print("Capteur OBERT:"); display.println(digitalRead(OBERT)); display.print("Ordre OBRIR:"); display.println(!digitalRead(OBRIR)); display.display(); if ((currentMillis - previousMillis)>=intervalle) { digitalWrite(MOTOR_OBRIR, HIGH); AVIÈRE =vrai; // aller à PORTA_OBERTA; } ; //--lumière Clignotant Contrôle de la fréquence------------------ si ((currentMillis - TEMPS_LLUM)>=1000) //Clignotement à basse vitesse { LLUM =!LLUM; écriture numérique(BOMBETA, LLUM); TEMPS_LLUM = Millis actuel ; } ; aller à A;SEQUENCIA_TANCAMENT:intervalle =28000; // Temps maximum de fermeture de la porte (s'il est dépassé, cela indiquera un échec) ! précédentMillis =millis(); digitalWrite(MOTOR_TANCAR, LOW); digitalWrite(BOMBETA, LOW); if (digitalRead(TANCAT) ==LOW) {delay(1000);};B:if (digitalRead(TANCAT) ==HIGH) { digitalWrite(MOTOR_TANCAR, HIGH); digitalWrite(BOMBETA, HAUT); aller à BUCLE_PRINCIPAL ; } ; if (digitalRead(OBRIR) ==LOW) { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("Esperant ordre per obrir"); display.setTextSize(1); display.setCursor(0, 20); display.print("Fotocel.lula:"); display.println(digitalRead(FOTOCELULA)); display.print("Capteur TANCAT:"); display.println(digitalRead(TANCAT)); display.print("Capteur OBERT:"); display.println(digitalRead(OBERT)); display.print("Ordre OBRIR:"); display.println(!digitalRead(OBRIR)); display.display(); digitalWrite(MOTOR_TANCAR, HAUT); digitalWrite(BOMBETA, HAUT); retard(1000); while (digitalRead(OBRIR) ==HIGH) {} ; //Ne rien faire jusqu'à ce que la commande OPEN soit émise goto SEQUENCIA_OBERTURA; } ; if (digitalRead(FOTOCELULA) ==HIGH) { digitalWrite(MOTOR_TANCAR, HIGH); retard(1000); aller à SEQUENCIA_OBERTURA; } ; //--Contrôle du temps et rafraîchissement de l'affichage--------------------- currentMillis =millis(); TEMPS_DISPLAY =(currentMillis - previousMillis) / 1000 ; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("Tantant porta"); display.setTextSize(2); display.setCursor(90, 0); display.println(TEMPS_DISPLAY); display.setTextSize(1); display.setCursor(0, 20); display.print("Fotocel.lula:"); display.println(digitalRead(FOTOCELULA)); display.print("Capteur TANCAT:"); display.println(digitalRead(TANCAT)); display.print("Capteur OBERT:"); display.println(digitalRead(OBERT)); display.print("Ordre OBRIR:"); display.println(!digitalRead(OBRIR)); display.display(); if ((currentMillis - previousMillis)>=intervalle) { digitalWrite(MOTOR_TANCAR, HIGH); AVIÈRE =vrai; aller à BUCLE_PRINCIPAL ; } ; //--lumière Clignotant Contrôle de la fréquence------------------ if ((currentMillis - TEMPS_LLUM)>=300) // Clignotant à vitesse rapide { LLUM =!LLUM; écriture numérique(BOMBETA, LLUM); TEMPS_LLUM = Millis actuel ; } ; aller à B;PORTA_OBERTA:intervalle =30000; // Temps d'attente avant de fermer la porte ! (30 secondes pour entrer dans la voiture...) previousMillis =millis(); digitalWrite(MOTOR_OBRIR, HAUT); delay(500);C:if (digitalRead(OBRIR) ==LOW) { goto SEQUENCIA_TANCAMENT; } ; //--Contrôle du temps et rafraîchissement de l'affichage--------------------- currentMillis =millis(); TEMPS_DISPLAY =(currentMillis - previousMillis) / 1000 ; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("Porta Oberta completement"); display.setTextSize(2); display.setCursor(90, 0); display.println(TEMPS_DISPLAY); display.setTextSize(1); display.setCursor(0, 20); display.print("Fotocel.lula:"); display.println(digitalRead(FOTOCELULA)); display.print("Capteur TANCAT:"); display.println(digitalRead(TANCAT)); display.print("Capteur OBERT:"); display.println(digitalRead(OBERT)); display.print("Ordre OBRIR:"); display.println(!digitalRead(OBRIR)); display.display(); if ((currentMillis - previousMillis)>=intervalle) { goto SEQUENCIA_TANCAMENT; } ; //--Fréquence de clignotement composée spéciale en état d'attente------------------ // (Clignote court de 100 millisecondes entre de longues périodes de 2 secondes) if (LLUM ==false ) { DURADA =100; } sinon DURADA =2000 ; if ((currentMillis - TEMPS_LLUM)>=DURADA) // { LLUM =!LLUM; écriture numérique(BOMBETA, LLUM); TEMPS_LLUM = Millis actuel ; } ; aller à C;}
CodeC/C++
Il s'agit du code C++ à compiler et à télécharger sur l'Arduino Nano
/************************************ ************************************** Automatisme per porta corredera motoritzada********* ******************************************************** **********/// Llibreries per fer servir el display#include #include #include #include // Definim broches par automatisme portaint FOTOCELULA =2;int BOMBETA =5; //Relais 1int TANCAT =7;int OBERT =3;int MOTOR_OBRIR =6; //Relais 2int MOTOR_TANCAR =12; //Relay 3int OBRIR =4;// Definim pins per display#define OLED_MOSI 11#define OLED_CLK 13#define OLED_DC 9#define OLED_CS 10#define OLED_RESET 8Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_CRESET);// variables globalsunsigned long TEMPS_PORTA_OBERTA =20000;non signé long TEMPS_MAXIM_RECORREGUT =15000; //Despres ho redéfinir l'intervalle =1000; // L'intervalle est le temps d'attente TEMPS_DISPLAY =1; // temps en segons per imprimir en pantallaint DURADA =300; // Cicle bombeta senyalitzaciounsigned long previousMillis =0; // Suit le temps écoulé depuis le dernier événement déclenché unsigned long currentMillis =millis();unsigned long TEMPS_LLUM =1000; // temps en milisegons de estat llum senyalitzacioboolean LLUM =false; // Llum encessa si ON i apagada si OFFboolean AVARIA =false; // Excedit el temps de recorregut sense detectar finals de carreavoid setup() { // Inicialitzem els pins per automatisme porta pinMode (FOTOCELULA, INPUT_PULLUP); pinMode(TANCAT, INPUT_PULLUP); pinMode(OBERT, INPUT_PULLUP); pinMode(OBRIR, INPUT_PULLUP); pinMode(BOMBETA, SORTIE); pinMode(MOTOR_OBRIR, SORTIE); pinMode(MOTOR_TANCAR, SORTIE); // Moteurs Apaguem i llum digitalWrite(MOTOR_OBRIR, HIGH); digitalWrite(MOTOR_TANCAR, HAUT); digitalWrite(BOMBETA, HAUT); // Initialisation de l'affichage Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC); display.display(); // Mostra pantalla inicial de Adafruit delay(1000); display.clearDisplay(); display.display(); // prépare l'affichage par texte display.setTextSize(1); display.setTextColor(WHITE);}void loop() {BUCLE_PRINCIPAL:delay(2000); précédentMillis =millis(); while (digitalRead(OBRIR) ==HIGH) { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("BUCLE PRINCIPAL ..."); display.setTextSize(1); display.setCursor(0, 20); display.print("Fotocel.lula:"); display.println(digitalRead(FOTOCELULA)); display.print("Capteur TANCAT:"); display.println(digitalRead(TANCAT)); display.print("Capteur OBERT:"); display.println(digitalRead(OBERT)); display.print("Ordre OBRIR:"); display.println(!digitalRead(OBRIR)); display.display(); if (AVARIA et (millis() - previousMillis <60000)) { digitalWrite(BOMBETA, LOW); } else (digitalWrite(BOMBETA, HIGH)); } ; //Esperem ailerons que premem OBRIR i anem refrescant pantalla per mostrar estat capteurs goto SEQUENCIA_OBERTURA;SEQUENCIA_OBERTURA:interval =28000; // TEMPS MAXIM DE RECORREGUT PORTA OBRINT !!!!!!!!! précédentMillis =millis(); digitalWrite(MOTOR_OBRIR, LOW); digitalWrite(BOMBETA, LOW); delay(1000);A:if (digitalRead(OBERT) ==HIGH) { goto PORTA_OBERTA; } ; if (digitalRead(OBRIR) ==LOW) { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("Ordre espérant par tancar"); display.setTextSize(1); display.setCursor(0, 20); display.print("Fotocel.lula:"); display.println(digitalRead(FOTOCELULA)); display.print("Capteur TANCAT:"); display.println(digitalRead(TANCAT)); display.print("Capteur OBERT:"); display.println(digitalRead(OBERT)); display.print("Ordre OBRIR:"); display.println(!digitalRead(OBRIR)); display.display(); digitalWrite(MOTOR_OBRIR, HAUT); digitalWrite(BOMBETA, HAUT); retard(1000); while (digitalRead(OBRIR) ==HIGH) {} ; //No fem res ailerons que premem OBRIR goto SEQUENCIA_TANCAMENT; } ; //--Control-de-temps-i-impressió-en-pantalla--------------------- currentMillis =millis(); TEMPS_DISPLAY =(currentMillis - previousMillis) / 1000 ; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("Obrint porta"); display.setTextSize(2); display.setCursor(90, 0); display.println(TEMPS_DISPLAY); display.setTextSize(1); display.setCursor(0, 20); display.print("Fotocel.lula:"); display.println(digitalRead(FOTOCELULA)); display.print("Capteur TANCAT:"); display.println(digitalRead(TANCAT)); display.print("Capteur OBERT:"); display.println(digitalRead(OBERT)); display.print("Ordre OBRIR:"); display.println(!digitalRead(OBRIR)); display.display(); if ((currentMillis - previousMillis)>=intervalle) { digitalWrite(MOTOR_OBRIR, HIGH); AVIÈRE =vrai; // aller à PORTA_OBERTA; } ; //--Contrôle-de-cadencia-de-la-llum-intermitent------------------ si ((currentMillis - TEMPS_LLUM)>=1000) // Cadencia de la llum intermittent de senyalitzacio { LLUM =!LLUM; écriture numérique(BOMBETA, LLUM); TEMPS_LLUM = Millis actuel ; } ; aller à A;SEQUENCIA_TANCAMENT:intervalle =28000; // TEMPS MAXIM DE RECORREGUT PORTA TANCANT !!!!!!!!! précédentMillis =millis(); digitalWrite(MOTOR_TANCAR, LOW); digitalWrite(BOMBETA, LOW); if (digitalRead(TANCAT) ==LOW) {delay(1000);};B:if (digitalRead(TANCAT) ==HIGH) { digitalWrite(MOTOR_TANCAR, HIGH); digitalWrite(BOMBETA, HAUT); aller à BUCLE_PRINCIPAL ; } ; if (digitalRead(OBRIR) ==LOW) { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("Esperant ordre per obrir"); display.setTextSize(1); display.setCursor(0, 20); display.print("Fotocel.lula:"); display.println(digitalRead(FOTOCELULA)); display.print("Capteur TANCAT:"); display.println(digitalRead(TANCAT)); display.print("Capteur OBERT:"); display.println(digitalRead(OBERT)); display.print("Ordre OBRIR:"); display.println(!digitalRead(OBRIR)); display.display(); digitalWrite(MOTOR_TANCAR, HAUT); digitalWrite(BOMBETA, HAUT); retard(1000); while (digitalRead(OBRIR) ==HIGH) {} ; //No fem res ailerons que premem OBRIR goto SEQUENCIA_OBERTURA; } ; if (digitalRead(FOTOCELULA) ==HIGH) { digitalWrite(MOTOR_TANCAR, HIGH); retard(1000); aller à SEQUENCIA_OBERTURA; } ; //--Control-de-temps-i-impressió-en-pantalla--------------------- currentMillis =millis(); TEMPS_DISPLAY =(currentMillis - previousMillis) / 1000 ; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("Tantant porta"); display.setTextSize(2); display.setCursor(90, 0); display.println(TEMPS_DISPLAY); display.setTextSize(1); display.setCursor(0, 20); display.print("Fotocel.lula:"); display.println(digitalRead(FOTOCELULA)); display.print("Capteur TANCAT:"); display.println(digitalRead(TANCAT)); display.print("Capteur OBERT:"); display.println(digitalRead(OBERT)); display.print("Ordre OBRIR:"); display.println(!digitalRead(OBRIR)); display.display(); if ((currentMillis - previousMillis)>=intervalle) { digitalWrite(MOTOR_TANCAR, HIGH); AVIÈRE =vrai; aller à BUCLE_PRINCIPAL ; } ; //--Contrôle-de-cadencia-de-la-llum-intermitent------------------ si ((currentMillis - TEMPS_LLUM)>=300) // Cadencia de la llum intermittent de senyalitzacio { LLUM =!LLUM; écriture numérique(BOMBETA, LLUM); TEMPS_LLUM = Millis actuel ; } ; aller à B;PORTA_OBERTA:intervalle =30000; // TEMPS MAXIM ESPERANT AMB PORTA OBERTA !!!!!!!!! précédentMillis =millis(); digitalWrite(MOTOR_OBRIR, HAUT); delay(500);C:if (digitalRead(OBRIR) ==LOW) { goto SEQUENCIA_TANCAMENT; } ; //--Control-de-temps-i-impressió-en-pantalla--------------------- currentMillis =millis(); TEMPS_DISPLAY =(currentMillis - previousMillis) / 1000 ; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("Porta Oberta completement"); display.setTextSize(2); display.setCursor(90, 0); display.println(TEMPS_DISPLAY); display.setTextSize(1); display.setCursor(0, 20); display.print("Fotocel.lula:"); display.println(digitalRead(FOTOCELULA)); display.print("Capteur TANCAT:"); display.println(digitalRead(TANCAT)); display.print("Capteur OBERT:"); display.println(digitalRead(OBERT)); display.print("Ordre OBRIR:"); display.println(!digitalRead(OBRIR)); display.display(); if ((currentMillis - previousMillis)>=intervalle) { goto SEQUENCIA_TANCAMENT; } ; //--Contrôle-de-cadencia-de-la-llum-intermitent------------------ if (LLUM ==false) { DURADA =100; } sinon DURADA =2000 ; if ((currentMillis - TEMPS_LLUM)>=DURADA) // Cadencia de la llum intermittent de senyalitzacio { LLUM =!LLUM; écriture numérique(BOMBETA, LLUM); TEMPS_LLUM = Millis actuel ; } ; aller à C;}

Schémas

Comment connecter le câblage aux capteurs, aux relais et au module radio de l'unité de commande principale. schemas_Kzy9lps55T.fzzScreenshoot à partir de schémas frits Ceci est la liste des broches Arduino utilisées et comment les connecter au reste des composants. pinouts_x7JmwoGJTY.txtCet addon matériel est en réponse à la question de irshad2318 (voir les messages pour ce projet)

Processus de fabrication

  1. DHT Tiny Breakout pour Raspberry Pi
  2. Les meilleurs accessoires pour votre Raspberry Pi
  3. SIGHT :For the Blind
  4. Drone sous-marin :L'histoire de la folie
  5. Poupée coulissante automatique pour tournage suisse et de production
  6. Croissance automatique :un bel avenir pour les PME qui adoptent l'automatisation
  7. Choisir les meilleurs amortisseurs pour véhicules
  8. La scie à ruban manuelle pour toutes les occasions
  9. Qu'est-ce que la presse automatique ?