Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Puerta corredera automática para el garaje

Componentes y suministros

Arduino Nano R3
× 1
Breadboard (genérico)
Para sostener el Arduino Nano y la pantalla Oled
× 1
Pantalla Adafruit Oled
Para mostrar el estado del sensor, el contador de tiempo y las acciones.
× 1
Módulo de relé (genérico)
módulo de 4 relés. Usé solo tres de ellos.
× 1
Fuente de alimentación SparkFun Breadboard 5V / 3.3V
Usé una fuente de alimentación en miniatura de 5V de 220V
× 1
Interruptor de botón SparkFun de 12 mm
Para el botón de reinicio (borrar la alarma de mal funcionamiento)
× 1

Acerca de este proyecto

Antecedentes

Bueno, la historia empezó un día cuando llegué a casa y me di cuenta de que el mando a distancia de la puerta corredera no funcionaba. "¡Las baterias!" Pensé, pero no, esa no era la razón. Investigué un poco y que sorpresa cuando quité la tapa del motor de la puerta:literalmente se carbonizó un pequeño lagarto en un minúsculo espacio entre el tablero de control electrónico y el soporte de plástico (por cierto, no voy a subir imágenes de esa horrenda escena). Supongo que el pequeño reptil tocó los faston de 220V y produjo un cortocircuito. El resultado fue su muerte y todo el circuito se quemó.

He eliminado del tablero algunos componentes que podría guardar para usar en mis proyectos, pero puedes ver en esta foto cómo terminó.

En ese mismo momento decidí que esta podría ser la excusa perfecta para hacer un proyecto Arduino y una reconstrucción completa de la unidad de control.

ADVERTENCIA

Para este proyecto, tendrá que lidiar con componentes conectados directamente a 220 V (o 110 V). Tenga en cuenta que esto puede ser peligroso si no es muy hábil con este tipo de instalaciones. Por favor, tenga cuidado y proceda con precaución. Realice siempre una simulación antes de conectarse al circuito del motor real.

Componentes y circuitos

El proyecto está dividido en algunas partes, pero lo que presento aquí es el circuito Arduino que controla la rotación del motor y la luz de señalización, y tiene en cuenta el estado de los sensores de fin de carrera y una fotocélula de seguridad.

Al principio, podría pensar que es fácil de construir y programar, pero les puedo asegurar que tuve que superar muchas dificultades que hicieron que este proyecto fuera tan emocionante.

Otros componentes importantes para todo el proyecto son:

  • Motor eléctrico 220V y guías y mecanismos físicos:estos no se vieron afectados por la acción del lagarto.
  • Receptor de radio remoto para emitir el comando "Abrir":he utilizado una unidad comercial lista para usar que incluía los controles remotos y el receptor.
  • Relés de 220 V para soportar la alta corriente utilizada por el motor.
  • Unidad de control principal fabricada con Arduino Nano y otros accesorios compatibles como pantalla OLED y módulo de relés. Esto es lo que les muestro en este portal.

También agregué algunas mejoras y varias acciones automatizadas que no estaban incluidas en la unidad de control original comercial.

Pinouts para este proyecto

La siguiente información resume los pines de los componentes y cómo conectarlos:

Como puede ver, para este proyecto he utilizado una pantalla OLED directamente conectada a la placa. En condiciones normales de funcionamiento, esta pantalla se encuentra dentro de la tapa de protección del mecanismo y la electrónica. Entonces, no puedes verlo. De hecho, esta pantalla está diseñada para usarse solo para verificar el estado de los componentes mientras ajusta la configuración y hace un ajuste fino del código (ajuste de tiempo máximo, por ejemplo).

La información proporcionada por esta pantalla también podría haber sido enviada al puerto serie y verificada desde una computadora portátil con el software Arduino IDE, pero encuentro que esta pequeña pantalla es una forma genial de operar la unidad sin la necesidad de usar ninguna computadora portátil o adicional. dispositivo.

La información que se muestra en el OLED es la siguiente:

  • Fase del código que se está ejecutando (Abriendo puerta, cerrando puerta, esperando comando "Abrir", bucle principal, ...)
  • Tiempo transcurrido para las acciones principales (abrir, esperar antes de volver a cerrar y cerrar)
  • Estado de la fotocélula (activa cuando alguien o algo está en la ruta de cierre)
  • Estado del sensor de límite CERRADO (activo cuando la puerta está completamente cerrada)
  • Estado del sensor de límite ABIERTO (activo cuando la puerta está completamente abierta)
  • Señal de comando ABRIR (activa cuando se presiona el control remoto y el módulo de radio activa un relé)

Nota:La pantalla OLED que estoy usando es de 0.96 pulgadas y tiene una resolución de 128 x 64 píxeles. Esta pantalla puede usar I2C o SPI para comunicarse con el dispositivo de control (Arduino Nano en este caso) y yo estoy usando SPI (Interfaz de periféricos en serie).

Diagramas de flujo

Los siguientes diagramas de flujo resumen el código del software de forma legible:

Código

  • Versión del código de software en inglés
  • Código
Versión de código de software en inglés C / C ++
Aquí tienes el código con todos los comentarios traducidos al inglés. Incluye una breve lista de vocabulario para comprender el significado de variables y etiquetas.
 / *************************** **************************************** Automatismo para puerta corredera motorizada **** *********************************************** *************** // * Los comentarios están traducidos al inglés, pero para ayudarte a entender el nombre de las variables y etiquetas, aquí tienes un vocabulario rápido "Catalán-Inglés" :Bucle principal =Bucle principal Sequencia Obertura =Secuencia de apertura Sequencia Tancament =Secuencia de cierre Obrir =Abierto; Obert =Abierto Tancar =Cercano; Tancat =Bombeta cerrada =Bombilla Llum =luz Porta =Puerta / puerta Avaria =Temps de falla =Tiempo Recorregut =recorrido de la puerta * /// Bibliotecas para pantalla Oled # incluye  #include  #include  #include  // Definimos los pines que utilizará el circuito de controlint FOTOCELULA =2; int BOMBETA =5; // Relé 1int TANCAT =7; int OBERT =3; int MOTOR_OBRIR =6; // Relé 2int MOTOR_TANCAR =12; // Relay 3int OBRIR =4; // Definimos los pines que utilizará la pantalla Oled , OLED_CS); // Definimos variables globales unsigned long TEMPS_PORTA_OBERTA =20000; unsigned long TEMPS_MAXIM_RECORREGUT =15000; // Más adelante redefiniremos este valor en intervalo =1000; // El intervalo es el tiempo que esperamos en TEMPS_DISPLAY =1; // Tiempo en segundos para mostrarint DURADA =300; // Ciclo de bombillainsigned long previousMillis =0; // Realiza un seguimiento del tiempo transcurrido desde el último evento disparado unsigned long currentMillis =millis (); unsigned long TEMPS_LLUM =1000; // tiempo en milisegundos para el estado de la bombilla booleana LLUM =false; // luz ENCENDIDA o APAGADA booleana AVARIA =falso; // se excedió el tiempo de recorrido de la puerta sin detectar el interruptor limitador de vacío setup () {// Apague el motor y la luz digitalWrite (MOTOR_OBRIR, HIGH); escritura digital (MOTOR_TANCAR, ALTA); escritura digital (BOMBETA, ALTA); // Inicializamos los pines para el automatismo pinMode (FOTOCELULA, INPUT_PULLUP); pinMode (TANCAT, INPUT_PULLUP); pinMode (OBERT, INPUT_PULLUP); pinMode (OBRIR, INPUT_PULLUP); pinMode (BOMBETA, SALIDA); pinMode (MOTOR_OBRIR, SALIDA); pinMode (MOTOR_TANCAR, SALIDA); // Mostrar inicialización Serial.begin (9600); display.begin (SSD1306_SWITCHCAPVCC); display.display (); // Muestra el retraso del logo inicial de Adafruit (1000); display.clearDisplay (); display.display (); // Preparamos el tamaño del texto para la visualización (no es importante porque luego se redefine dinámicamente) display.setTextSize (1); display.setTextColor (WHITE);} bucle vacío () {BUCLE_PRINCIPAL:delay (2000); anteriorMillis =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 ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); if (AVARIA y (millis () - previousMillis <60000)) {digitalWrite (BOMBETA, LOW); } else (digitalWrite (BOMBETA, HIGH)); }; // Esperamos hasta que se emita el comando Abrir y mientras tanto se actualiza la pantalla mostrando el estado de los sensores goto SEQUENCIA_OBERTURA; SEQUENCIA_OBERTURA:interval =28000; // Tiempo máximo de apertura de la puerta (si se supera indicará algún fallo) previousMillis =millis (); digitalWrite (MOTOR_OBRIR, BAJO); escritura digital (BOMBETA, BAJA); delay (1000); A:if (digitalRead (OBERT) ==HIGH) {ir a PORTA_OBERTA; }; if (digitalRead (OBRIR) ==BAJO) {display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println ("Esperant ordre per tancar"); // "Esperando orden de cierre" display.setTextSize (1); display.setCursor (0, 20); display.print ("Fotocel.lula:"); display.println (digitalRead (FOTOCELULA)); display.print ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); escritura digital (MOTOR_OBRIR, ALTO); escritura digital (BOMBETA, ALTA); retraso (1000); while (digitalRead (OBRIR) ==HIGH) {}; // No hacer nada hasta que se emita el comando OPEN goto SEQUENCIA_TANCAMENT; }; // - Control de tiempo y actualización de la 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 ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); if ((currentMillis - previousMillis)> =intervalo) {digitalWrite (MOTOR_OBRIR, HIGH); AVARIA =verdadero; // ir a PORTA_OBERTA; }; // - luz Control de frecuencia intermitente ------------------ if ((currentMillis - TEMPS_LLUM)> =1000) // Parpadeo a baja velocidad {LLUM =! LLUM; escritura digital (BOMBETA, LLUM); TEMPS_LLUM =currentMillis; }; ir a A; SEQUENCIA_TANCAMENT:intervalo =28000; // ¡Tiempo máximo de cierre de la puerta (si se supera indicará algún fallo)! anteriorMillis =millis (); digitalWrite (MOTOR_TANCAR, BAJO); escritura digital (BOMBETA, BAJA); if (digitalRead (TANCAT) ==LOW) {delay (1000);}; B:if (digitalRead (TANCAT) ==HIGH) {digitalWrite (MOTOR_TANCAR, HIGH); escritura digital (BOMBETA, ALTA); ir a BUCLE_PRINCIPAL; }; if (digitalRead (OBRIR) ==BAJO) {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 ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); escritura digital (MOTOR_TANCAR, ALTA); escritura digital (BOMBETA, ALTA); retraso (1000); while (digitalRead (OBRIR) ==HIGH) {}; // No hacer nada hasta que se emita el comando OPEN goto SEQUENCIA_OBERTURA; }; if (digitalRead (FOTOCELULA) ==HIGH) {digitalWrite (MOTOR_TANCAR, HIGH); retraso (1000); ir a SEQUENCIA_OBERTURA; }; // - Control de tiempo y actualización de la pantalla --------------------- currentMillis =millis (); TEMPS_DISPLAY =(currentMillis - previousMillis) / 1000; display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println ("Tancant 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 ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); if ((currentMillis - previousMillis)> =intervalo) {digitalWrite (MOTOR_TANCAR, HIGH); AVARIA =verdadero; ir a BUCLE_PRINCIPAL; }; // - luz Control de frecuencia intermitente ------------------ if ((currentMillis - TEMPS_LLUM)> =300) // Parpadeo a alta velocidad {LLUM =! LLUM; escritura digital (BOMBETA, LLUM); TEMPS_LLUM =currentMillis; }; ir a B; PORTA_OBERTA:intervalo =30000; // ¡Tiempo de espera antes de cerrar la puerta! (30 segundos para entrar al coche ...) previousMillis =millis (); escritura digital (MOTOR_OBRIR, ALTO); delay (500); C:if (digitalRead (OBRIR) ==LOW) {ir a SEQUENCIA_TANCAMENT; }; // - Control de tiempo y actualización de la pantalla --------------------- currentMillis =millis (); TEMPS_DISPLAY =(currentMillis - previousMillis) / 1000; display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println ("Porta Oberta completament"); 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 ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); if ((currentMillis - previousMillis)> =intervalo) {ir a SEQUENCIA_TANCAMENT; }; // - Frecuencia de destellos compuestos especiales en estado de espera ------------------ // (Destellos cortos de 100 milisegundos entre períodos largos de 2 segundos) if (LLUM ==false ) {DURADA =100; } más DURADA =2000; if ((currentMillis - TEMPS_LLUM)> =DURADA) // {LLUM =! LLUM; escritura digital (BOMBETA, LLUM); TEMPS_LLUM =currentMillis; }; ir a C;} 
Código C / C ++
Este es el código C ++ para compilar y cargar en Arduino Nano
 / ******************************* *********************************** Automatisme per porta corredera motoritzada ********* *********************************************** ********** /// Llibreries per fer servir el display # include  #include  #include  #include  // Definim pines por portaint automatisme FOTOCELULA =2; int BOMBETA =5; // Relé 1int TANCAT =7; int OBERT =3; int MOTOR_OBRIR =6; // Relé 2int MOTOR_TANCAR =12; // Relé 3int OBRIR =4; // Definir pines por pantalla # definir OLED_MOSI 11 # definir OLED_CLK 13 # definir OLED_DC 9 # definir OLED_CS 10 # definir OLED_RESET 8Adafruit_SSD1306 pantalla (OLED_MOSI, OLED_CLK, OLED_DC, OLED_CSET), // Definir OLED_DC, OLED_CSET); variables globalsunsigned long TEMPS_PORTA_OBERTA =20000; unsigned long TEMPS_MAXIM_RECORREGUT =15000; // Despres ho redefinimint interval =1000; // El intervalo es el tiempo que esperamos en TEMPS_DISPLAY =1; // temps en segons por imprimir en pantallaint DURADA =300; // Cicle bombeta senyalitzaciounsigned long previousMillis =0; // Realiza un seguimiento del tiempo transcurrido desde el último evento disparado 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 carreravoid 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, SALIDA); pinMode (MOTOR_OBRIR, SALIDA); pinMode (MOTOR_TANCAR, SALIDA); // Motores Apaguem i llum digitalWrite (MOTOR_OBRIR, HIGH); escritura digital (MOTOR_TANCAR, ALTA); escritura digital (BOMBETA, ALTA); // Inicialitzem el display Serial.begin (9600); display.begin (SSD1306_SWITCHCAPVCC); display.display (); // Mostra pantalla inicial de Adafruit delay (1000); display.clearDisplay (); display.display (); // preparar la visualización por texto display.setTextSize (1); display.setTextColor (WHITE);} bucle vacío () {BUCLE_PRINCIPAL:delay (2000); anteriorMillis =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 ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); if (AVARIA y (millis () - previousMillis <60000)) {digitalWrite (BOMBETA, LOW); } else (digitalWrite (BOMBETA, HIGH)); }; // Esperem fins que premem OBRIR i anem pantalla refrescante para mostrar sensores estat goto SEQUENCIA_OBERTURA; SEQUENCIA_OBERTURA:interval =28000; // TEMPS MAXIM DE RECORREGUT PORTA OBRINT !!!!!!!!! anteriorMillis =millis (); digitalWrite (MOTOR_OBRIR, BAJO); escritura digital (BOMBETA, BAJA); delay (1000); A:if (digitalRead (OBERT) ==HIGH) {ir a PORTA_OBERTA; }; if (digitalRead (OBRIR) ==BAJO) {display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println ("Esperant ordre per tancar"); display.setTextSize (1); display.setCursor (0, 20); display.print ("Fotocel.lula:"); display.println (digitalRead (FOTOCELULA)); display.print ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); escritura digital (MOTOR_OBRIR, ALTO); escritura digital (BOMBETA, ALTA); retraso (1000); while (digitalRead (OBRIR) ==HIGH) {}; // No fem res fins que premem OBRIR goto SEQUENCIA_TANCAMENT; }; // - Control-de-temps-i-impresionió-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 ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); if ((currentMillis - previousMillis)> =intervalo) {digitalWrite (MOTOR_OBRIR, HIGH); AVARIA =verdadero; // ir a PORTA_OBERTA; }; // - Control-de-cadencia-de-la-llum-intermitent ------------------ if ((currentMillis - TEMPS_LLUM)> =1000) // Cadencia de la llum intermitent de senyalitzacio {LLUM =! LLUM; escritura digital (BOMBETA, LLUM); TEMPS_LLUM =currentMillis; }; ir a A; SEQUENCIA_TANCAMENT:intervalo =28000; // TEMPS MAXIM DE RECORREGUT PORTA TANCANT !!!!!!!!! anteriorMillis =millis (); digitalWrite (MOTOR_TANCAR, BAJO); escritura digital (BOMBETA, BAJA); if (digitalRead (TANCAT) ==LOW) {delay (1000);}; B:if (digitalRead (TANCAT) ==HIGH) {digitalWrite (MOTOR_TANCAR, HIGH); escritura digital (BOMBETA, ALTA); ir a BUCLE_PRINCIPAL; }; if (digitalRead (OBRIR) ==BAJO) {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 ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); escritura digital (MOTOR_TANCAR, ALTA); escritura digital (BOMBETA, ALTA); retraso (1000); while (digitalRead (OBRIR) ==HIGH) {}; // No fem res fins que premem OBRIR goto SEQUENCIA_OBERTURA; }; if (digitalRead (FOTOCELULA) ==HIGH) {digitalWrite (MOTOR_TANCAR, HIGH); retraso (1000); ir a SEQUENCIA_OBERTURA; }; // - Control-de-temps-i-impresionió-en-pantalla --------------------- currentMillis =millis (); TEMPS_DISPLAY =(currentMillis - previousMillis) / 1000; display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println ("Tancant 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 ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); if ((currentMillis - previousMillis)> =intervalo) {digitalWrite (MOTOR_TANCAR, HIGH); AVARIA =verdadero; ir a BUCLE_PRINCIPAL; }; // - Control-de-cadencia-de-la-llum-intermitent ------------------ if ((currentMillis - TEMPS_LLUM)> =300) // Cadencia de la llum intermitent de senyalitzacio {LLUM =! LLUM; escritura digital (BOMBETA, LLUM); TEMPS_LLUM =currentMillis; }; ir a B; PORTA_OBERTA:intervalo =30000; // TEMPERATURAS MAXIM ESPERANT AMB PORTA OBERTA !!!!!!!!! anteriorMillis =millis (); escritura digital (MOTOR_OBRIR, ALTO); delay (500); C:if (digitalRead (OBRIR) ==LOW) {ir a SEQUENCIA_TANCAMENT; }; // - Control-de-temps-i-impresionió-en-pantalla --------------------- currentMillis =millis (); TEMPS_DISPLAY =(currentMillis - previousMillis) / 1000; display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println ("Porta Oberta completament"); 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 ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); if ((currentMillis - previousMillis)> =intervalo) {ir a SEQUENCIA_TANCAMENT; }; // - Control-de-cadencia-de-la-llum-intermitent ------------------ if (LLUM ==false) {DURADA =100; } más DURADA =2000; if ((currentMillis - TEMPS_LLUM)> =DURADA) // Cadencia de la llum intermitent de senyalitzacio {LLUM =! LLUM; escritura digital (BOMBETA, LLUM); TEMPS_LLUM =currentMillis; }; ir a C;} 

Esquemas

Cómo conectar el cableado a los sensores, relés y módulo de radio desde la unidad de control principal. schematics_Kzy9lps55T.fzz Captura de pantalla de esquemas fritzing Esta es la lista de los pines de Arduino usados ​​y cómo conectarlos al resto de los componentes. pinouts_x7JmwoGJTY.txt Este complemento de hardware es en respuesta a la pregunta de irshad2318 (ver las publicaciones de este proyecto)

Proceso de manufactura

  1. El pentodo
  2. DHT Tiny Breakout para Raspberry Pi
  3. Los mejores accesorios para tu Raspberry Pi
  4. VISTA:Para ciegos
  5. Drone submarino:La historia de la locura
  6. Con cabezal deslizante automático para torneado suizo y de producción
  7. Crecimiento automático:un futuro brillante para las pymes que adoptan la automatización
  8. ¡Gracias por los recuerdos!
  9. Elegir los mejores amortiguadores para vehículos
  10. La sierra de cinta manual para cualquier ocasión
  11. ¿Qué es la prensa automática?