산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

차고용 자동 미닫이문

구성품 및 소모품

Arduino Nano R3
× 1
브레드보드(일반)
Arduino Nano 및 Oled 디스플레이를 고정하려면
× 1
Adafruit Oled 디스플레이
센서 상태, 시간 카운터 및 작업을 표시합니다.
× 1
릴레이 모듈(일반)
4 릴레이 모듈. 저는 3개만 사용했습니다.
× 1
SparkFun 브레드보드 전원 공급 장치 5V/3.3V
220V에서 5V 소형 전원 공급 장치를 사용했습니다.
× 1
SparkFun 푸시버튼 스위치 12mm
리셋 버튼용(오작동 알람 지우기)
× 1

이 프로젝트 정보

배경

그런데 이야기는 어느 날 집에 도착했을 때 미닫이 도어의 리모콘이 작동하지 않는다는 것을 깨달았습니다. "배터리!" 생각했지만 아니, 이것이 이유가 아니었다. 조금 조사를 해보니 도어 모터의 덮개를 제거했을 때 놀라운 일이 벌어졌습니다. 전자 제어 보드와 플라스틱 지지대 사이의 작은 공간에서 작은 도마뱀이 말 그대로 탄화되어 있었습니다. 그 끔찍한 장면). 나는 작은 파충류가 220V 고정 장치를 만지고 단락을 생성했다고 생각합니다. 결과는 죽음이었고 모든 회로가 불탔습니다.

내 프로젝트에 사용하기 위해 저장할 수 있는 몇 가지 구성 요소를 보드에서 제거했지만 이 사진에서 최종 결과를 볼 수 있습니다.

바로 그 순간 나는 이것이 Arduino 프로젝트와 제어 장치의 완전한 재구축을 위한 완벽한 핑계가 될 수 있다고 결정했습니다.

경고

이 프로젝트의 경우 220V(또는 110V)에 직접 연결된 구성 요소를 처리해야 합니다. 이러한 종류의 설치에 능숙하지 않은 경우 위험할 수 있다는 점을 고려하십시오. 주의하여 진행하시기 바랍니다. 실제 모터 회로에 연결하기 전에 항상 시뮬레이션을 수행하십시오.

부품 및 회로

프로젝트는 여러 부분으로 나누어져 있지만 여기서 소개하는 것은 모터와 신호등의 회전을 제어하고 리미트 스위치 센서와 안전 광전지의 상태를 고려하는 Arduino 회로입니다.

처음에는 빌드하고 프로그래밍하는 것이 쉽다고 생각할 수 있지만 이 프로젝트를 매우 흥미롭게 만든 많은 어려움을 극복해야 했습니다.

전체 프로젝트의 다른 중요한 구성 요소는 다음과 같습니다.

<울>
  • 전기 220V 모터와 물리적 가이드 및 메커니즘:도마뱀의 행동에 영향을 받지 않았습니다.
  • <울>
  • "열기" 명령을 실행하는 원격 라디오 수신기:리모컨과 수신기가 포함된 상용 기성품을 사용했습니다.
  • <울>
  • 모터에서 사용하는 고전류를 지원하기 위한 220V 릴레이
  • <울>
  • Arduino Nano 및 OLED 디스플레이 및 릴레이 모듈과 같은 기타 호환 액세서리로 만든 메인 컨트롤 유닛. 이것이 제가 이 포털에서 보여드리는 것입니다.
  • 또한 상업적인 원래 제어 장치에 포함되지 않은 몇 가지 개선 사항과 몇 가지 자동화 작업을 추가했습니다.

    이 프로젝트의 핀아웃

    다음 정보는 구성 요소의 핀과 연결 방법을 요약한 것입니다.

    보시다시피 이 프로젝트에서는 기판에 직접 부착된 OLED 디스플레이를 사용했습니다. 정상적인 작업 조건에서 이 디스플레이는 메커니즘 및 전자 장치의 보호 덮개 내부에 있습니다. 그래서, 당신은 그것을 볼 수 없습니다. 사실, 이 디스플레이는 설정을 조정하고 코드를 미세 조정하는 동안 구성 요소의 상태를 확인하는 데만 사용하도록 고안되었습니다(예:최대 시간 조정).

    이 디스플레이에서 제공하는 정보는 Arduino IDE 소프트웨어가 있는 랩톱에서 직렬 포트로 전송되어 확인할 수도 있었지만 이 작은 디스플레이는 랩톱이나 추가 장치를 사용하지 않고도 장치를 작동할 수 있는 멋진 방법이라는 것을 알았습니다. 장치.

    OLED에 표시되는 정보는 다음과 같습니다.

    <울>
  • 실행 중인 코드의 단계(문 열기, 문 닫기, "열기" 명령 대기, 메인 루프, ...)
  • <울>
  • 주요 작업에 대한 경과 시간(열기, 다시 닫기 전 대기 및 닫기)
  • <울>
  • 광전지 상태(누군가 또는 무언가가 닫히는 경로에 있을 때 활성화됨)
  • <울>
  • CLOSED 한계 센서 상태(문이 완전히 닫힐 때 활성화됨)
  • <울>
  • OPENED 한계 센서 상태(문이 완전히 열렸을 때 활성화됨)
  • <울>
  • OPEN 명령 신호(리모컨을 누르고 라디오 모듈이 릴레이를 활성화하면 활성화됨)
  • 참고:내가 사용하는 OLED 디스플레이는 0.96인치이고 해상도는 128 x 64픽셀입니다. 이 디스플레이는 I2C 또는 SPI를 사용하여 제어 장치(이 경우 Arduino Nano)와 통신할 수 있으며 저는 SPI(Serial Peripheral Interface)를 사용하고 있습니다.

    순서도

    다음 순서도는 읽을 수 있는 방식으로 소프트웨어 코드를 요약합니다.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • 영어 소프트웨어 코드 버전
  • 코드
  • 영어 소프트웨어 코드 버전C/C++
    여기에 모든 주석이 영어로 번역된 코드가 있습니다. 변수와 레이블의 의미를 이해할 수 있도록 짧은 어휘 목록이 포함되어 있습니다.
    /**************************** ***************************************** 슬라이딩 전동 도어를 위한 자동화**** ************************************************** ***************//* 주석은 영어로 번역되지만 변수 및 레이블의 이름을 이해하는 데 도움이 되도록 여기에 빠른 어휘 "카탈로니아어-영어"가 있습니다. :Bucle principal =메인 루프 Sequencia Obertura =오프닝 시퀀스 Sequencia Tancament =클로징 시퀀스 Obrir =Open; Obert =열림 Tancar =닫힘; Tancat =폐쇄형 봄베타 =전구 Llum =조명 Porta =게이트 / 도어 Avaria =실패 온도 =시간 Recorregut =도어 여행*/// Oled 디스플레이용 라이브러리#include #include #include #include // 제어 회로에서 사용할 핀을 정의합니다int FOTOCELULA =2;int BOMBETA =5; //릴레이 1int TANCAT =7;int OBERT =3;int MOTOR_OBRIR =6; //릴레이 2int MOTOR_TANCAR =12; //Relay 3int OBRIR =4;// 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);// 전역 변수를 정의합니다.unsigned long TEMPS_PORTA_OBERTA =20000;unsigned long TEMPS_MAXIM_RECORREGUT =15000; //나중에 이 값을 재정의할 것입니다.int interval =1000; // Interval은 대기하는 시간입니다. TEMPS_DISPLAY =1; // 표시하는 데 걸리는 시간(초)int DURADA =300; // 전구에 대한 Cicleunsigned long previousMillis =0; // 마지막 이벤트 이후의 시간을 추적합니다. fireunsigned long currentMillis =millis();unsigned long TEMPS_LLUM =1000; // 전구 상태에 대한 시간(밀리초) 부울 LLUM =false; // 조명 켜기 또는 끄기 부울 AVARIA =false; //제한을 감지하지 않고 도어 이동 시간 초과 switchvoid setup() { // 모터 및 조명 끄기 digitalWrite(MOTOR_OBRIR, HIGH); 디지털 쓰기(MOTOR_TANCAR, HIGH); digitalWrite(BOMBETA, HIGH); // 자동화를 위한 핀을 초기화합니다. pinMode(FOTOCELULA, INPUT_PULLUP); 핀모드(TANCAT, INPUT_PULLUP); 핀모드(OBERT, INPUT_PULLUP); 핀모드(OBRIR, INPUT_PULLUP); 핀모드(BOMBETA, 출력); 핀모드(MOTOR_OBRIR, 출력); 핀모드(MOTOR_TANCAR, 출력); // 초기화 표시 Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC); 디스플레이.디스플레이(); // Adafruit 초기 로고 표시 delay(1000); display.clearDisplay(); 디스플레이.디스플레이(); // 디스플레이의 텍스트 크기를 준비합니다(나중에 동적으로 재정의되므로 중요하지 않음) display.setTextSize(1); display.setTextColor(WHITE);} 무효 루프() {BUCLE_PRINCIPAL:지연(2000); 이전Millis =millis(); 동안 (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("포토셀.룰라:"); display.println(디지털 읽기(FOTOCELULA)); display.print("탄캣 센서:"); display.println(digitalRead(TANCAT)); display.print("센서 OBERT:"); display.println(디지털 읽기(OBERT)); display.print("오드르 오브리르:"); display.println(!digitalRead(OBRIR)); 디스플레이.디스플레이(); if (AVARIA 및 (millis() - 이전Millis <60000)) { digitalWrite(BOMBETA, LOW); } 그렇지 않으면 (digitalWrite(BOMBETA, HIGH)); }; // Open 명령이 내려질 때까지 기다리며 디스플레이가 새로 고쳐지는 동안 센서의 상태를 표시합니다 goto SEQUENCIA_OBERTURA;SEQUENCIA_OBERTURA:interval =28000; // 문을 여는 최대 시간(초과하면 약간의 실패를 나타냄) previousMillis =millis(); 디지털 쓰기(MOTOR_OBRIR, LOW); digitalWrite(BOMBETA, LOW); delay(1000);A:if (digitalRead(OBERT) ==HIGH) { PORTA_OBERTA로 이동; }; if (digitalRead(OBRIR) ==LOW) { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("탄카 당 에스페란트 명령"); // "닫기 대기 중" display.setTextSize(1); display.setCursor(0, 20); display.print("포토셀.룰라:"); display.println(디지털 읽기(FOTOCELULA)); display.print("탄캣 센서:"); display.println(digitalRead(TANCAT)); display.print("센서 OBERT:"); display.println(디지털 읽기(OBERT)); display.print("오드르 오브리르:"); display.println(!digitalRead(OBRIR)); 디스플레이.디스플레이(); 디지털 쓰기(MOTOR_OBRIR, 높음); digitalWrite(BOMBETA, HIGH); 지연(1000); 동안 (디지털 읽기(OBRIR) ==높음) {}; //OPEN 명령이 발행될 때까지 아무것도 하지 않음 goto SEQUENCIA_TANCAMENT; }; //--시간 제어 및 표시 새로 고침--------------- currentMillis =millis(); TEMPS_DISPLAY =(현재 밀리 - 이전 밀리) / 1000; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("오브린트 포트"); display.setTextSize(2); display.setCursor(90, 0); display.println(TEMPS_DISPLAY); display.setTextSize(1); display.setCursor(0, 20); display.print("포토셀.룰라:"); display.println(디지털 읽기(FOTOCELULA)); display.print("탄캣 센서:"); display.println(digitalRead(TANCAT)); display.print("센서 OBERT:"); display.println(디지털 읽기(OBERT)); display.print("오드르 오브리르:"); display.println(!digitalRead(OBRIR)); 디스플레이.디스플레이(); if ((currentMillis - previousMillis)>=간격) { digitalWrite(MOTOR_OBRIR, HIGH); AVARIA =사실; // PORTA_OBERTA로 이동; }; //--light 점멸 빈도 제어------------------ if ((currentMillis - TEMPS_LLUM)>=1000) //저속으로 점멸 { LLUM =!LLUM; digitalWrite(BOMBETA, LLUM); TEMPS_LLUM =현재밀리; }; goto A;SEQUENCIA_TANCAMENT:간격 =28000; // 문을 닫는 최대 시간(초과하면 일부 실패를 나타냄)! 이전Millis =millis(); 디지털 쓰기(MOTOR_TANCAR, LOW); digitalWrite(BOMBETA, LOW); if (digitalRead(TANCAT) ==LOW) {delay(1000);};B:if (digitalRead(TANCAT) ==HIGH) { digitalWrite(MOTOR_TANCAR, HIGH); digitalWrite(BOMBETA, HIGH); BUCLE_PRINCIPAL로 이동 }; if (digitalRead(OBRIR) ==LOW) { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("오브리르에 대한 에스페란트 명령"); display.setTextSize(1); display.setCursor(0, 20); display.print("포토셀.룰라:"); display.println(디지털 읽기(FOTOCELULA)); display.print("탄캣 센서:"); display.println(digitalRead(TANCAT)); display.print("센서 OBERT:"); display.println(디지털 읽기(OBERT)); display.print("오드르 오브리르:"); display.println(!digitalRead(OBRIR)); 디스플레이.디스플레이(); 디지털 쓰기(MOTOR_TANCAR, HIGH); digitalWrite(BOMBETA, HIGH); 지연(1000); 동안 (디지털 읽기(OBRIR) ==높음) {}; //OPEN 명령이 발행될 때까지 아무 것도 하지 않음 goto SEQUENCIA_OBERTURA; }; if (digitalRead(FOTOCELULA) ==HIGH) { digitalWrite(MOTOR_TANCAR, HIGH); 지연(1000); SEQUENCIA_OBERTURA로 이동; }; //--시간 제어 및 표시 새로 고침--------------------- currentMillis =millis(); TEMPS_DISPLAY =(현재 밀리 - 이전 밀리) / 1000; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("탄칸트 포르타"); display.setTextSize(2); display.setCursor(90, 0); display.println(TEMPS_DISPLAY); display.setTextSize(1); display.setCursor(0, 20); display.print("포토셀.룰라:"); display.println(디지털 읽기(FOTOCELULA)); display.print("탄캣 센서:"); display.println(digitalRead(TANCAT)); display.print("센서 OBERT:"); display.println(디지털 읽기(OBERT)); display.print("오드르 오브리르:"); display.println(!digitalRead(OBRIR)); 디스플레이.디스플레이(); if ((currentMillis - previousMillis)>=간격) { digitalWrite(MOTOR_TANCAR, HIGH); AVARIA =사실; BUCLE_PRINCIPAL로 이동 }; //--light 점멸 빈도 제어------------------ if ((currentMillis - TEMPS_LLUM)>=300) // 빠른 속도로 점멸 { LLUM =!LLUM; digitalWrite(BOMBETA, LLUM); TEMPS_LLUM =현재밀리; }; goto B;PORTA_OBERTA:간격 =30000; // 문을 닫기까지 기다리는 시간! (차 진입까지 30초...) previousMillis =millis(); 디지털 쓰기(MOTOR_OBRIR, 높음); 지연(500);C:if (digitalRead(OBRIR) ==LOW) { SEQUENCIA_TANCAMENT로 이동; }; //--시간 제어 및 표시 새로 고침--------------------- currentMillis =millis(); TEMPS_DISPLAY =(현재 밀리 - 이전 밀리) / 1000; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("포르타 오버타 완성"); display.setTextSize(2); display.setCursor(90, 0); display.println(TEMPS_DISPLAY); display.setTextSize(1); display.setCursor(0, 20); display.print("포토셀.룰라:"); display.println(디지털 읽기(FOTOCELULA)); display.print("탄캣 센서:"); display.println(digitalRead(TANCAT)); display.print("센서 OBERT:"); display.println(디지털 읽기(OBERT)); display.print("오드르 오브리르:"); display.println(!digitalRead(OBRIR)); 디스플레이.디스플레이(); if ((currentMillis - previousMillis)>=간격) { SEQUENCIA_TANCAMENT로 이동; }; //--대기 상태의 특수 복합 깜박임 빈도------------------ // (2초의 긴 기간 사이에 100밀리초의 짧은 깜박임) if (LLUM ==false ) { 듀라다 =100; } 그렇지 않으면 DURADA =2000; if ((currentMillis - TEMPS_LLUM)>=DURADA) // { LLUM =!LLUM; digitalWrite(BOMBETA, LLUM); TEMPS_LLUM =현재밀리; }; C로 이동;}
    코드C/C++
    이것은 Arduino Nano
    /************************************로 컴파일 및 업로드하기 위한 C++ 코드입니다. ************************************ Automatisme per porta corredera motoritzada************ ************************************************** **********/// 디스플레이 서비스당 라이브러리#include #include #include #include // Definim automatisme portaint 당 핀 FOTOCELULA =2;int BOMBETA =5; //릴레이 1int TANCAT =7;int OBERT =3;int MOTOR_OBRIR =6; //릴레이 2int MOTOR_TANCAR =12; //릴레이 3int OBRIR =4;// 디스플레이당 핀 정의 정의#define OLED_MOSI 11#define OLED_CLK 13#define OLED_DC 9#define OLED_CS 10#define OLED_RESET 8Adafruit_SSD1306 디스플레이(OLED_MOSI, OLED_CLK, OLED_DC, OLED_im)RESET 변수 globalsunsigned long TEMPS_PORTA_OBERTA =20000, unsigned long TEMPS_MAXIM_RECORREGUT =15000; // Despres ho 재정의 간격 =1000; // Interval은 대기하는 시간입니다. TEMPS_DISPLAY =1; // 임시 엔 판탈린트당 임시 엔 세곤 DURADA =300; // Cicle bombeta senyalitaciounsigned long previousMillis =0; // 마지막 이벤트 이후의 시간을 추적합니다. fireunsigned long currentMillis =millis();unsigned long TEMPS_LLUM =1000; // mmilisegons de estat llum senyalitzacioboolean temps LLUM =false; // Llum encessa si ON i apagada si OFFboolean AVARIA =false; // Excedit el temps de recorregut sense detectar finals de carreravoid setup() { // 자동 포트에 대한 초기 핀 핀 모드(FOTOCELULA, INPUT_PULLUP); 핀모드(TANCAT, INPUT_PULLUP); 핀모드(OBERT, INPUT_PULLUP); 핀모드(OBRIR, INPUT_PULLUP); 핀모드(BOMBETA, 출력); 핀모드(MOTOR_OBRIR, 출력); 핀모드(MOTOR_TANCAR, 출력); // Apaguem 모터 i llum digitalWrite(MOTOR_OBRIR, HIGH); 디지털 쓰기(MOTOR_TANCAR, HIGH); digitalWrite(BOMBETA, HIGH); // 표시 초기화 Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC); 디스플레이.디스플레이(); // Mostra pantalla 초기 de Adafruit delay(1000); display.clearDisplay(); 디스플레이.디스플레이(); // 텍스트당 디스플레이 준비 display.setTextSize(1); display.setTextColor(WHITE);} 무효 루프() {BUCLE_PRINCIPAL:지연(2000); 이전Millis =millis(); 동안 (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("포토셀.룰라:"); display.println(디지털 읽기(FOTOCELULA)); display.print("탄캣 센서:"); display.println(digitalRead(TANCAT)); display.print("센서 OBERT:"); display.println(디지털 읽기(OBERT)); display.print("오드르 오브리르:"); display.println(!digitalRead(OBRIR)); 디스플레이.디스플레이(); if (AVARIA 및 (millis() - 이전Millis <60000)) { digitalWrite(BOMBETA, LOW); } 그렇지 않으면 (digitalWrite(BOMBETA, HIGH)); }; //Esperem fins que premem OBRIR i anem refresant pantalla per mostrar estat sensor goto SEQUENCIA_OBERTURA;SEQUENCIA_OBERTURA:interval =28000; // TEMPS MAXIM DE RECORREGUT PORTA OBRINT !!!!!!!!! 이전Millis =millis(); 디지털 쓰기(MOTOR_OBRIR, LOW); digitalWrite(BOMBETA, LOW); delay(1000);A:if (digitalRead(OBERT) ==HIGH) { PORTA_OBERTA로 이동; }; if (digitalRead(OBRIR) ==LOW) { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("탄카 당 에스페란트 명령"); display.setTextSize(1); display.setCursor(0, 20); display.print("포토셀.룰라:"); display.println(디지털 읽기(FOTOCELULA)); display.print("탄캣 센서:"); display.println(digitalRead(TANCAT)); display.print("센서 OBERT:"); display.println(디지털 읽기(OBERT)); display.print("오드르 오브리르:"); display.println(!digitalRead(OBRIR)); 디스플레이.디스플레이(); 디지털 쓰기(MOTOR_OBRIR, 높음); digitalWrite(BOMBETA, HIGH); 지연(1000); 동안 (디지털 읽기(OBRIR) ==높음) {}; // fem res fins que premem OBRIR goto SEQUENCIA_TANCAMENT; }; //--Control-de-temps-i-impressió-en-pantalla------------------ currentMillis =millis(); TEMPS_DISPLAY =(현재 밀리 - 이전 밀리) / 1000; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("오브린트 포트"); display.setTextSize(2); display.setCursor(90, 0); display.println(TEMPS_DISPLAY); display.setTextSize(1); display.setCursor(0, 20); display.print("포토셀.룰라:"); display.println(디지털 읽기(FOTOCELULA)); display.print("탄캣 센서:"); display.println(digitalRead(TANCAT)); display.print("센서 OBERT:"); display.println(디지털 읽기(OBERT)); display.print("오드르 오브리르:"); display.println(!digitalRead(OBRIR)); 디스플레이.디스플레이(); if ((currentMillis - previousMillis)>=간격) { digitalWrite(MOTOR_OBRIR, HIGH); AVARIA =사실; // PORTA_OBERTA로 이동; }; //--Control-de-cadencia-de-la-llum-intermitent--- if ((currentMillis - TEMPS_LLUM)>=1000) // Cadencia de la llum 간헐적 데 senyalitzacio { LLUM =!LLUM; digitalWrite(BOMBETA, LLUM); TEMPS_LLUM =현재밀리; }; goto A;SEQUENCIA_TANCAMENT:간격 =28000; // TEMPS MAXIM DE RECORREGUT PORTA TANCANT !!!!!!!! 이전Millis =millis(); 디지털 쓰기(MOTOR_TANCAR, LOW); digitalWrite(BOMBETA, LOW); if (digitalRead(TANCAT) ==LOW) {delay(1000);};B:if (digitalRead(TANCAT) ==HIGH) { digitalWrite(MOTOR_TANCAR, HIGH); digitalWrite(BOMBETA, HIGH); BUCLE_PRINCIPAL로 이동 }; if (digitalRead(OBRIR) ==LOW) { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("오브리르에 대한 에스페란트 명령"); display.setTextSize(1); display.setCursor(0, 20); display.print("포토셀.룰라:"); display.println(디지털 읽기(FOTOCELULA)); display.print("탄캣 센서:"); display.println(digitalRead(TANCAT)); display.print("센서 OBERT:"); display.println(디지털 읽기(OBERT)); display.print("오드르 오브리르:"); display.println(!digitalRead(OBRIR)); 디스플레이.디스플레이(); 디지털 쓰기(MOTOR_TANCAR, HIGH); digitalWrite(BOMBETA, HIGH); 지연(1000); 동안 (디지털 읽기(OBRIR) ==높음) {}; // fem res fins que premem OBRIR goto SEQUENCIA_OBERTURA; }; if (digitalRead(FOTOCELULA) ==HIGH) { digitalWrite(MOTOR_TANCAR, HIGH); 지연(1000); SEQUENCIA_OBERTURA로 이동; }; //--Control-de-temps-i-impressió-en-pantalla------------------ currentMillis =millis(); TEMPS_DISPLAY =(현재 밀리 - 이전 밀리) / 1000; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("탄칸트 포르타"); display.setTextSize(2); display.setCursor(90, 0); display.println(TEMPS_DISPLAY); display.setTextSize(1); display.setCursor(0, 20); display.print("포토셀.룰라:"); display.println(디지털 읽기(FOTOCELULA)); display.print("탄캣 센서:"); display.println(digitalRead(TANCAT)); display.print("센서 OBERT:"); display.println(디지털 읽기(OBERT)); display.print("오드르 오브리르:"); display.println(!digitalRead(OBRIR)); 디스플레이.디스플레이(); if ((currentMillis - previousMillis)>=간격) { digitalWrite(MOTOR_TANCAR, HIGH); AVARIA =사실; BUCLE_PRINCIPAL로 이동 }; //--Control-de-cadencia-de-la-llum-intermitent--- if ((currentMillis - TEMPS_LLUM)>=300) // Cadencia de la llum 간헐적 데 senyalitzacio { LLUM =!LLUM; digitalWrite(BOMBETA, LLUM); TEMPS_LLUM =현재밀리; }; goto B;PORTA_OBERTA:간격 =30000; // TEMPS MAXIM ESPERANT AMB PORTA OBERTA !!!!!!!!! 이전Millis =millis(); 디지털 쓰기(MOTOR_OBRIR, 높음); 지연(500);C:if (digitalRead(OBRIR) ==LOW) { SEQUENCIA_TANCAMENT로 이동; }; //--Control-de-temps-i-impressió-en-pantalla------------------ currentMillis =millis(); TEMPS_DISPLAY =(현재 밀리 - 이전 밀리) / 1000; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("포르타 오버타 완성"); display.setTextSize(2); display.setCursor(90, 0); display.println(TEMPS_DISPLAY); display.setTextSize(1); display.setCursor(0, 20); display.print("포토셀.룰라:"); display.println(디지털 읽기(FOTOCELULA)); display.print("탄캣 센서:"); display.println(digitalRead(TANCAT)); display.print("센서 OBERT:"); display.println(디지털 읽기(OBERT)); display.print("오드르 오브리르:"); display.println(!digitalRead(OBRIR)); 디스플레이.디스플레이(); if ((currentMillis - previousMillis)>=간격) { SEQUENCIA_TANCAMENT로 이동; }; //--Control-de-cadencia-de-la-llum-intermitent--- if (LLUM ==false) { DURADA =100; } 그렇지 않으면 DURADA =2000; if ((currentMillis - TEMPS_LLUM)>=DURADA) // Cadencia de la llum 간헐적 de senyalitzacio { LLUM =!LLUM; digitalWrite(BOMBETA, LLUM); TEMPS_LLUM =현재밀리; }; C로 이동;}

    회로도

    주 제어 장치에서 센서, 릴레이 및 무선 모듈에 배선을 연결하는 방법. schemas_Kzy9lps55T.fzz프릿칭 회로도의 스크린샷 사용된 Arduino 핀 목록과 나머지 구성 요소에 연결하는 방법입니다. pinouts_x7JmwoGJTY.txt이 하드웨어 애드온은 irshad2318의 질문에 대한 응답입니다(이 프로젝트에 대한 게시물 참조)

    제조공정

    1. Raspberry Pi용 DHT Tiny Breakout
    2. Raspberry Pi를 위한 최고의 액세서리
    3. 시력:시각 장애인용
    4. 수중 드론:광기의 이야기
    5. 스위스 및 생산 선삭을 위한 자동 슬라이딩 주축대
    6. 자동 성장:자동화를 수용하는 중소기업의 밝은 미래
    7. 추억에 감사드립니다!
    8. 차량에 가장 적합한 완충기 선택
    9. 모든 경우에 사용할 수 있는 수동 밴드쏘
    10. 자동 파워 프레스는 무엇입니까?