Porta deslizante automática para a garagem
Componentes e suprimentos
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
Sobre este projeto
Antecedentes
Bem, a história começou um dia quando cheguei em casa e percebi que o controle remoto da porta de correr não estava funcionando. "As baterias!" Pensei, mas não, não era esse o motivo. Investiguei um pouco e que surpresa quando retirei a tampa do motor da porta:um pequeno lagarto foi literalmente carbonizado em um minúsculo espaço entre a placa de controle eletrônico e o suporte de plástico (aliás, não vou fazer upload de imagens do aquela cena horrenda). Acho que o pequeno réptil tocou nos fastons de 220 V e produziu um curto-circuito. O resultado foi sua morte e todo o circuito foi queimado.
Retirei da placa alguns componentes que poderia guardar para usar em meus projetos, mas vocês podem ver nesta foto como ficou.

Naquele exato momento, decidi que essa poderia ser a desculpa perfeita para fazer um projeto Arduino e uma reconstrução completa da unidade de controle.
AVISO
Para este projeto você terá que lidar com componentes conectados a 220V diretamente (ou 110V). Leve em consideração que isso pode ser perigoso se você não for muito hábil com este tipo de instalações. Por favor, seja cuidadoso e proceda com cautela. Sempre execute uma simulação antes de conectar ao circuito do motor real.
Componentes e circuitos
O projeto está dividido em algumas partes, mas o que apresento aqui é o circuito do Arduino que controla a rotação do motor e a luz de sinalização, e leva em consideração o estado dos sensores da chave fim de curso e uma fotocélula de segurança.
A princípio, você pode pensar que é fácil de construir e programar, mas posso garantir que tive que superar muitas dificuldades que tornaram este projeto tão emocionante.
Outros componentes importantes para todo o projeto são:
- Motor elétrico de 220 V e guias e mecanismos físicos:não foram afetados pela ação do lagarto.
- Receptor de rádio remoto para emitir o comando "Abrir":usei uma unidade comercial pronta que incluía os controladores remotos e o receptor.
- Relés de 220 V para suportar a alta corrente usada pelo motor.
- Unidade de controle principal feita com Arduino Nano e outros acessórios compatíveis, como display OLED e módulo de relés. Isso é o que mostro neste portal.
Eu também adicionei algumas melhorias e várias ações automatizadas que não foram incluídas na unidade de controle original comercial.
Pinagem para este projeto
As informações a seguir resumem os pinos dos componentes e como conectá-los:

Como você pode ver, neste projeto usei um display OLED diretamente conectado à placa. Em condições normais de trabalho, este display está localizado dentro da tampa de proteção do mecanismo e da parte eletrônica. Então você não consegue ver. Na verdade, este display deve ser usado apenas para verificar o status dos componentes enquanto você ajusta as configurações e faz um ajuste fino do código (ajuste de tempo máximo, por exemplo).
As informações fornecidas por este display também podem ter sido enviadas para a porta serial e verificadas de um laptop com o software Arduino IDE, mas acho que este pequeno display é uma maneira legal de operar a unidade sem a necessidade de usar qualquer laptop ou dispositivo adicional dispositivo.
As informações exibidas no OLED são as seguintes:
- Fase do código sendo executado (abrir porta, fechar porta, aguardar o comando "Abrir", loop principal, ...)
- Tempo decorrido para as ações principais (abrir, esperar antes de fechar novamente e fechar)
- Status da fotocélula (ativa quando alguém ou algo está no caminho de fechamento)
- Status do sensor de limite FECHADO (ativo quando a porta está totalmente fechada)
- Status do sensor de limite ABERTO (ativo quando a porta está totalmente aberta)
- Sinal de comando ABRIR (ativo quando o controle remoto é pressionado e o módulo de rádio ativa um relé)
Observação:o display OLED que estou usando tem 0,96 polegadas e uma resolução de 128 x 64 pixels. Este display pode usar I2C ou SPI para se comunicar com o dispositivo de controle (Arduino Nano neste caso) e estou usando SPI (Interface Periférica Serial).

Fluxogramas
Os fluxogramas a seguir resumem o código do software de forma legível:



Código
- Versão do código do software em inglês
- Código
Versão do código do software em inglês C / C ++
Aqui você tem o código com todos os comentários traduzidos para o inglês. Inclui uma pequena lista de vocabulário para compreender o significado das variáveis e etiquetas./ *************************** ********************************************************************** *************************************************** *************** // * Os comentários são traduzidos para o inglês, mas para ajudá-lo a entender o nome das variáveis e rótulos, aqui você tem um vocabulário rápido "Catalão-Inglês" :Bucle principal =Loop principal Sequencia Obertura =Sequencia de abertura Sequencia Tancament =Sequencia de fechamento Obrir =Open; Obert =Aberto Tancar =Fechar; Tancat =Fechado Bombeta =Lâmpada Llum =luz Porta =Portão / porta Avaria =Falha Temps =Tempo Recorregut =viagem de porta * /// Bibliotecas para exibição Oled # include#include #include #include // Definimos os pinos a serem usados pelo circuito de controle 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 os pinos a serem usados pelo display 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_DC, OLED_RESET , OLED_CS); // Definimos variáveis globais sem sinal longo TEMPS_PORTA_OBERTA =20000; sem sinal longo TEMPS_MAXIM_RECORREGUT =15000; // Mais tarde iremos redefinir este valorint intervalo =1000; // O intervalo é quanto tempo esperamosint TEMPS_DISPLAY =1; // Tempo em segundos para exibirint DURADA =300; // Ciclo para luz bulbunsigned long previousMillis =0; // Rastreia o tempo desde o último evento firedunsigned long currentMillis =millis (); unsigned long TEMPS_LLUM =1000; // tempo em milissegundos para o status da lâmpada boolean LLUM =false; // luz ON ou OFFboolean AVARIA =false; // tempo de viagem da porta excedido sem detecção de limitação switchvoid setup () {// Desligue o motor e ilumine digitalWrite (MOTOR_OBRIR, HIGH); digitalWrite (MOTOR_TANCAR, HIGH); digitalWrite (BOMBETA, ALTO); // Inicializamos os pinos para o automatismo pinMode (FOTOCELULA, INPUT_PULLUP); pinMode (TANCAT, INPUT_PULLUP); pinMode (OBERT, INPUT_PULLUP); pinMode (OBRIR, INPUT_PULLUP); pinMode (BOMBETA, OUTPUT); pinMode (MOTOR_OBRIR, OUTPUT); pinMode (MOTOR_TANCAR, OUTPUT); // Exibir inicialização Serial.begin (9600); display.begin (SSD1306_SWITCHCAPVCC); display.display (); // Mostra o atraso do logotipo inicial da Adafruit (1000); display.clearDisplay (); display.display (); // Preparamos o tamanho do texto para a exibição (não é importante porque depois é redefinido dinamicamente) display.setTextSize (1); display.setTextColor (WHITE);} void loop () {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 e (millis () - previousMillis <60000)) {digitalWrite (BOMBETA, LOW); } else (digitalWrite (BOMBETA, HIGH)); }; // Esperamos até que o comando Abrir seja emitido e enquanto isso o display está sendo atualizado exibindo o status dos sensores goto SEQUENCIA_OBERTURA; SEQUENCIA_OBERTURA:intervalo =28000; // Tempo máximo de abertura da porta (se excedido denotará alguma falha) previousMillis =millis (); digitalWrite (MOTOR_OBRIR, LOW); digitalWrite (BOMBETA, BAIXO); atraso (1000); A:if (digitalRead (OBERT) ==HIGH) {ir para PORTA_OBERTA; }; if (digitalRead (OBRIR) ==LOW) {display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println ("Esperant ordre per tancar"); // "Pedido de espera para fechar" 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 (); digitalWrite (MOTOR_OBRIR, HIGH); digitalWrite (BOMBETA, ALTO); atraso (1000); enquanto (digitalRead (OBRIR) ==HIGH) {}; // Não faça nada até que o comando OPEN seja emitido goto SEQUENCIA_TANCAMENT; }; // - Controle de tempo e atualização da exibição --------------- 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 =verdadeiro; // ir para PORTA_OBERTA; }; // - luz piscando controle de frequência ------------------ if ((currentMillis - TEMPS_LLUM)> =1000) // Piscando em baixa velocidade {LLUM =! LLUM; digitalWrite (BOMBETA, LLUM); TEMPS_LLUM =currentMillis; }; ir para A; SEQUENCIA_TANCAMENT:intervalo =28000; // Tempo máximo de fechamento da porta (se excedido denotará alguma falha)! anteriorMillis =millis (); digitalWrite (MOTOR_TANCAR, LOW); digitalWrite (BOMBETA, BAIXO); if (digitalRead (TANCAT) ==LOW) {delay (1000);}; B:if (digitalRead (TANCAT) ==HIGH) {digitalWrite (MOTOR_TANCAR, HIGH); digitalWrite (BOMBETA, ALTO); goto 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 ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); digitalWrite (MOTOR_TANCAR, HIGH); digitalWrite (BOMBETA, ALTO); atraso (1000); enquanto (digitalRead (OBRIR) ==HIGH) {}; // Não faça nada até que o comando OPEN seja emitido goto SEQUENCIA_OBERTURA; }; if (digitalRead (FOTOCELULA) ==HIGH) {digitalWrite (MOTOR_TANCAR, HIGH); atraso (1000); goto SEQUENCIA_OBERTURA; }; // - Controle de tempo e atualização da exibição --------------------- 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 =verdadeiro; goto BUCLE_PRINCIPAL; }; // - luz piscando controle de frequência ------------------ if ((currentMillis - TEMPS_LLUM)> =300) // Piscando em alta velocidade {LLUM =! LLUM; digitalWrite (BOMBETA, LLUM); TEMPS_LLUM =currentMillis; }; ir para B; PORTA_OBERTA:intervalo =30000; // Tempo de espera antes de fechar a porta! (30 segundos para entrar no carro ...) previousMillis =millis (); digitalWrite (MOTOR_OBRIR, HIGH); atraso (500); C:if (digitalRead (OBRIR) ==LOW) {ir para SEQUENCIA_TANCAMENT; }; // - Controle de tempo e atualização da exibição --------------------- currentMillis =millis (); TEMPS_DISPLAY =(currentMillis - previousMillis) / 1000; display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println ("Completamento da Porta Oberta"); 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) {goto SEQUENCIA_TANCAMENT; }; // - Frequência de piscamento composta especial em estado de espera ------------------ // (Flashes curtos de 100 milissegundos entre longos períodos de 2 segundos) if (LLUM ==false ) {DURADA =100; } else DURADA =2000; if ((currentMillis - TEMPS_LLUM)> =DURADA) // {LLUM =! LLUM; digitalWrite (BOMBETA, LLUM); TEMPS_LLUM =currentMillis; }; ir para C;}
Código C / C ++
Este é o código C ++ para compilar e fazer upload para o Arduino Nano/ ******************************** ************************************* Automatisme per porta corredera motoritzada ********* *************************************************** ********** /// Llibreries per fer servir el display # include#include #include #include // Definim pinos por portaint de automatismo 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; // Definir pinos por 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_RESET, OLED_CS); // Definim variáveis globalsunsigned long TEMPS_PORTA_OBERTA =20000; sem sinal long TEMPS_MAXIM_RECORREGUT =15000; // Despres ho redefinimint interval =1000; // O intervalo é quanto tempo esperamosint TEMPS_DISPLAY =1; // tempo em segons para imprimir em pantallaint DURADA =300; // Cicle bombeta senyalitzaciounsigned long previousMillis =0; // Rastreia o tempo desde o último evento firedunsigned long currentMillis =millis (); unsigned long TEMPS_LLUM =1000; // temps em milissegundos de estat llum senyalitzacioboolean LLUM =false; // Llum encessa si ON i apagada si OFFboolean AVARIA =false; // Excitar o tempo de recorregut sentido detectar finals de carreravoid setup () {// Inicialitzem els pins por porta automatisme pinMode (FOTOCELULA, INPUT_PULLUP); pinMode (TANCAT, INPUT_PULLUP); pinMode (OBERT, INPUT_PULLUP); pinMode (OBRIR, INPUT_PULLUP); pinMode (BOMBETA, OUTPUT); pinMode (MOTOR_OBRIR, OUTPUT); pinMode (MOTOR_TANCAR, OUTPUT); // Motores Apaguem i llum digitalWrite (MOTOR_OBRIR, HIGH); digitalWrite (MOTOR_TANCAR, HIGH); digitalWrite (BOMBETA, ALTO); // Inicialitzem el display Serial.begin (9600); display.begin (SSD1306_SWITCHCAPVCC); display.display (); // Mostra pantalla inicial de Adafruit delay (1000); display.clearDisplay (); display.display (); // prepara a exibição por texto display.setTextSize (1); display.setTextColor (WHITE);} void loop () {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 e (millis () - previousMillis <60000)) {digitalWrite (BOMBETA, LOW); } else (digitalWrite (BOMBETA, HIGH)); }; // Esperem fins que premem OBRIR i anem refrescant pantalla per mostrar estat sensores goto SEQUENCIA_OBERTURA; SEQUENCIA_OBERTURA:interval =28000; // TEMPS MAXIM DE RECORREGUT PORTA OBRINT !!!!!!!!! anteriorMillis =millis (); digitalWrite (MOTOR_OBRIR, LOW); digitalWrite (BOMBETA, BAIXO); atraso (1000); A:if (digitalRead (OBERT) ==HIGH) {ir para PORTA_OBERTA; }; if (digitalRead (OBRIR) ==LOW) {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 (); digitalWrite (MOTOR_OBRIR, HIGH); digitalWrite (BOMBETA, ALTO); atraso (1000); enquanto (digitalRead (OBRIR) ==HIGH) {}; // Sem fem res fins 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 ("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 =verdadeiro; // ir para PORTA_OBERTA; }; // - Control-de-cadencia-de-la-llum-intermitent ------------------ if ((currentMillis - TEMPS_LLUM)> =1000) // Cadencia de la llum intermitent de senyalitzacio {LLUM =! LLUM; digitalWrite (BOMBETA, LLUM); TEMPS_LLUM =currentMillis; }; ir para A; SEQUENCIA_TANCAMENT:intervalo =28000; // TEMPS MAXIM DE RECORREGUT PORTA TANCANT !!!!!!!!! anteriorMillis =millis (); digitalWrite (MOTOR_TANCAR, LOW); digitalWrite (BOMBETA, BAIXO); if (digitalRead (TANCAT) ==LOW) {delay (1000);}; B:if (digitalRead (TANCAT) ==HIGH) {digitalWrite (MOTOR_TANCAR, HIGH); digitalWrite (BOMBETA, ALTO); goto 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 ("Sensor TANCAT:"); display.println (digitalRead (TANCAT)); display.print ("Sensor OBERT:"); display.println (digitalRead (OBERT)); display.print ("Ordre OBRIR:"); display.println (! digitalRead (OBRIR)); display.display (); digitalWrite (MOTOR_TANCAR, HIGH); digitalWrite (BOMBETA, ALTO); atraso (1000); enquanto (digitalRead (OBRIR) ==HIGH) {}; // Sem fem res fins que premem OBRIR goto SEQUENCIA_OBERTURA; }; if (digitalRead (FOTOCELULA) ==HIGH) {digitalWrite (MOTOR_TANCAR, HIGH); atraso (1000); goto 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 ("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 =verdadeiro; goto BUCLE_PRINCIPAL; }; // - Control-de-cadencia-de-la-llum-intermitent ------------------ if ((currentMillis - TEMPS_LLUM)> =300) // Cadencia de la llum intermitent de senyalitzacio {LLUM =! LLUM; digitalWrite (BOMBETA, LLUM); TEMPS_LLUM =currentMillis; }; ir para B; PORTA_OBERTA:intervalo =30000; // TEMPS MAXIM ESPERANTE AMB PORTA OBERTA !!!!!!!!! anteriorMillis =millis (); digitalWrite (MOTOR_OBRIR, HIGH); atraso (500); C:if (digitalRead (OBRIR) ==LOW) {ir para 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 ("Completamento da Porta Oberta"); 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) {goto SEQUENCIA_TANCAMENT; }; // - Control-de-cadencia-de-la-llum-intermitent ------------------ if (LLUM ==false) {DURADA =100; } else DURADA =2000; if ((currentMillis - TEMPS_LLUM)> =DURADA) // Cadencia de la llum intermitent de senyalitzacio {LLUM =! LLUM; digitalWrite (BOMBETA, LLUM); TEMPS_LLUM =currentMillis; }; ir para C;}
Esquemas
Como conectar a fiação aos sensores, relés e módulo de rádio da unidade de controle principal. schematics_Kzy9lps55T.fzzScreenshoot de esquemas fritzing

Processo de manufatura
- DHT Tiny Breakout para Raspberry Pi
- Os melhores acessórios para o seu Raspberry Pi
- VISÃO:Para cegos
- Drone subaquático:A história da loucura
- Cabeçote deslizante automático para torneamento suíço e de produção
- Crescimento automático:um futuro brilhante para as PMEs que adotam a automação
- Obrigado pelas lembranças!
- Escolhendo os melhores amortecedores para veículos
- A serra de fita manual para qualquer ocasião
- O que é a prensa automática de energia?