Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Porta deslizante automática para a garagem

Componentes e suprimentos

Arduino Nano R3
× 1
Breadboard (genérico)
Para segurar o Arduino Nano e o display Oled
× 1
Adafruit Oled display
Para mostrar o status do sensor, contador de tempo e ações.
× 1
Módulo de retransmissão (genérico)
4 módulo de relé. Usei apenas três deles.
× 1
Fonte de alimentação SparkFun breadboard 5V / 3,3V
Usei uma fonte de alimentação em miniatura de 5 V de 220 V
× 1
SparkFun Botão de pressão 12 mm
Para botão de reinicialização (apagar alarme de avaria)
× 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 Esta é a lista dos pinos Arduino usados ​​e como conectá-los ao resto dos componentes. pinouts_x7JmwoGJTY.txt Este complemento de hardware é uma resposta à pergunta de irshad2318 (veja as postagens para este projeto)

Processo de manufatura

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