Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Автоматическая раздвижная дверь для гаража

Компоненты и расходные материалы

Arduino Nano R3
× 1
Макет (общий)
Для размещения Arduino Nano и дисплея Oled
× 1
Дисплей Adafruit Oled
Для отображения статуса датчика, счетчика времени и действий.
× 1
Модуль реле (общий)
4 релейный модуль. Я использовал только три из них.
× 1
Источник питания макетной платы SparkFun 5 В / 3,3 В
Я использовал миниатюрный блок питания 5 В от 220 В
× 1
Кнопочный переключатель SparkFun, 12 мм
Для кнопки сброса (стереть сигнал о неисправности)
× 1

Об этом проекте

Фон

Что ж, история началась однажды, когда я пришел домой и понял, что пульт дистанционного управления раздвижной двери не работает. "Батареи!" Я подумал, но нет, причина не в этом. Я немного исследовал и какой сюрприз, когда снял крышку дверного мотора:маленькая ящерица буквально обугливалась в крошечном пространстве между электронной платой управления и пластиковой опорой (кстати, я не собираюсь загружать изображения с эта ужасающая сцена). Я предполагаю, что рептилия задела фастоны 220В и произвела короткое замыкание. В результате он погиб, и вся схема сгорела.

Я удалил с доски некоторые компоненты, которые можно было сохранить для использования в своих проектах, но на этой фотографии вы можете увидеть, как все закончилось.

В тот самый момент я решил, что это может быть прекрасным предлогом для создания проекта Arduino и полной перестройки блока управления.

ВНИМАНИЕ

Для этого проекта вам придется иметь дело с компонентами, подключенными к 220V напрямую (или 110V). Учтите, что это может быть опасно, если вы не очень хорошо разбираетесь в установке такого рода. Пожалуйста, будьте осторожны и действуйте осторожно. Всегда выполняйте моделирование перед подключением к реальной схеме двигателя.

Компоненты и схемы

Проект разделен на несколько частей, но здесь я представляю схему Arduino, которая контролирует вращение двигателя и сигнальную лампу, а также учитывает состояние датчиков концевых выключателей и фотоэлемента безопасности.

Сначала вы могли подумать, что его легко создавать и программировать, но я могу вас заверить, что мне пришлось преодолеть множество трудностей, которые сделали этот проект таким захватывающим.

Другими важными компонентами всего проекта являются:

  • Электрический двигатель 220 В, физические направляющие и механизмы:на них не повлияло действие ящерицы.
  • Удаленный радиоприемник для выполнения команды "Открыть":я использовал готовое коммерческое устройство, в которое входили пульты дистанционного управления и приемник.
  • реле 220 В для поддержки высокого тока, используемого двигателем.
  • Главный блок управления, сделанный с использованием Arduino Nano и других совместимых аксессуаров, таких как OLED-дисплей и модуль реле. Это то, что я показываю вам на этом портале.

Я также добавил некоторые улучшения и несколько автоматизированных действий, которые не были включены в исходный коммерческий блок управления.

Распиновка для этого проекта

Следующая информация резюмирует контакты компонентов и способы их соединения:

Как видите, в этом проекте я использовал OLED-дисплей, непосредственно прикрепленный к плате. В нормальных условиях работы этот дисплей расположен внутри защитной крышки механизма и электроники. Так что вы не можете этого видеть. Фактически, этот дисплей предназначен для использования только для проверки состояния компонентов, пока вы настраиваете параметры и выполняете точную настройку кода (например, настройка максимального времени).

Информация, предоставляемая этим дисплеем, также могла быть отправлена ​​в последовательный порт и проверена с ноутбука с программным обеспечением Arduino IDE, но я считаю, что этот маленький дисплей - отличный способ управлять устройством без необходимости использования ноутбука или дополнительных устройств. устройство.

На OLED-экране отображается следующая информация:

  • Фаза выполнения кода (открытие двери, закрытие двери, ожидание команды «Открыть», основной цикл, ...)
  • Прошедшее время для основных действий (открытие, ожидание перед повторным закрытием и закрытие)
  • Статус фотоэлемента (активен, когда кто-то или что-то находится на замыкающем пути)
  • Состояние датчика ограничения ЗАКРЫТО (активен, когда дверь полностью закрыта)
  • Состояние датчика ограничения ОТКРЫТО (активен, когда дверь полностью открыта)
  • командный сигнал ОТКРЫТЬ (активен, когда пульт дистанционного управления нажат и радиомодуль активирует реле)

Примечание. Я использую OLED-дисплей размером 0,96 дюйма и разрешением 128 x 64 пикселя. Этот дисплей может использовать I2C или SPI для связи с устройством управления (в данном случае Arduino Nano), а я использую SPI (последовательный периферийный интерфейс).

Блок-схемы

Следующие блок-схемы резюмируют программный код в удобочитаемой форме:

Код

  • Версия программного кода на английском языке
  • Код
Английская версия программного кода C / C ++
Здесь у вас есть код со всеми комментариями, переведенными на английский язык. Он включает краткий список словаря для понимания значения переменных и меток.
 / *************************** **************************************** Автоматика для раздвижных дверей с электроприводом **** ************************************************* *************** // * Комментарии переведены на английский, но для того, чтобы помочь вам понять названия переменных и меток, у вас есть краткий словарный запас "Catalan-English" :Bucle Principal =Главный цикл Sequencia Obertura =Последовательность открытия Sequencia Tancament =Последовательность закрытия Obrir =Открыть; Оберт =Открытый Танкар =Закрыть; Tancat =закрытый Bombeta =лампочка Llum =свет Porta =ворота / дверь Avaria =Failure Temps =Time Recorregut =движение двери * /// Библиотеки для Oled Display # include  #include  #include  #include  // Мы определяем контакты, которые будут использоваться схемой управления int FOTOCELULA =2; int BOMBETA =5; // Реле 1int TANCAT =7; int OBERT =3; int MOTOR_OBRIR =6; // Реле 2int MOTOR_TANCAR =12; // Реле 3int OBRIR =4; // Мы определяем контакты, которые будут использоваться дисплеем Oled # определить OLED_MOSI 11 # определить OLED_CLK 13 # определить OLED_DC 9 # определить OLED_CS 10 # определить OLED_RESET 8 Дисплей Adafruit_SSD1306 (OLED_MOSI, OLED_CLK, OLED_ESET, OLED_ESET, , OLED_CS); // Определяем глобальные переменныеunsigned long TEMPS_PORTA_OBERTA =20000; unsigned long TEMPS_MAXIM_RECORREGUT =15000; // Позже мы переопределим это значение int interval =1000; // Интервал - это время ожидания int TEMPS_DISPLAY =1; // Время в секундах для отображения int DURADA =300; // Цикл лампочки без подписи long previousMillis =0; // Отслеживает время с момента последнего срабатывания события unsigned long currentMillis =millis (); unsigned long TEMPS_LLUM =1000; // время в миллисекундах для состояния лампочкиboolean LLUM =false; // горит или не горит булево значение AVARIA =false; // время движения двери превышено без обнаружения ограничения switchvoid setup () {// Выключить двигатель и поджечь digitalWrite (MOTOR_OBRIR, HIGH); digitalWrite (MOTOR_TANCAR, HIGH); digitalWrite (БОМБЕТА, ВЫСОКИЙ); // Инициализируем пины для автоматизма pinMode (FOTOCELULA, INPUT_PULLUP); pinMode (TANCAT, INPUT_PULLUP); pinMode (ОБЕРТ, INPUT_PULLUP); pinMode (OBRIR, INPUT_PULLUP); pinMode (БОМБЕТА, ВЫХОД); pinMode (MOTOR_OBRIR, ВЫХОД); pinMode (MOTOR_TANCAR, ВЫХОД); // Отображение инициализации Serial.begin (9600); display.begin (SSD1306_SWITCHCAPVCC); display.display (); // Показываем начальную задержку логотипа Adafruit (1000); display.clearDisplay (); display.display (); // Подготавливаем размер текста для отображения (не важно, потому что позже он будет переопределен динамически) display.setTextSize (1); display.setTextColor (WHITE);} недействительный цикл () {BUCLE_PRINCIPAL:задержка (2000); previousMillis =millis (); в то время как (digitalRead (OBRIR) ==ВЫСОКИЙ) {display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println ("ПРИНЦИП БУКЛА ..."); display.setTextSize (1); display.setCursor (0, 20); display.print ("Fotocel.lula:"); display.println (digitalRead (FOTOCELULA)); display.print («Датчик TANCAT:»); display.println (digitalRead (TANCAT)); display.print («Датчик OBERT:»); display.println (digitalRead (ОБЕРТ)); display.print ("Порядок ОБРИР:"); display.println (! digitalRead (ОБРИР)); display.display (); если (AVARIA и (millis () - previousMillis <60000)) {digitalWrite (BOMBETA, LOW); } else (digitalWrite (БОМБЕТА, ВЫСОКИЙ)); }; // Мы ждем, пока не будет подана команда Open, а пока дисплей обновляется, показывая состояние датчиков goto SEQUENCIA_OBERTURA; SEQUENCIA_OBERTURA:interval =28000; // Максимальное время открытия двери (превышение означает сбой) previousMillis =millis (); digitalWrite (MOTOR_OBRIR, LOW); digitalWrite (БОМБЕТА, НИЗКИЙ); задержка (1000); A:если (digitalRead (OBERT) ==HIGH) {goto PORTA_OBERTA; }; если (digitalRead (OBRIR) ==LOW) {display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println ("Эсперантский порядок на танкар"); // «Ожидание закрытия» display.setTextSize (1); display.setCursor (0, 20); display.print ("Fotocel.lula:"); display.println (digitalRead (FOTOCELULA)); display.print («Датчик TANCAT:»); display.println (digitalRead (TANCAT)); display.print («Датчик OBERT:»); display.println (digitalRead (ОБЕРТ)); display.print ("Порядок ОБРИР:"); display.println (! digitalRead (ОБРИР)); display.display (); digitalWrite (MOTOR_OBRIR, HIGH); digitalWrite (БОМБЕТА, ВЫСОКИЙ); задержка (1000); while (digitalRead (OBRIR) ==ВЫСОКИЙ) {}; // Ничего не делать, пока не будет дана команда OPEN goto SEQUENCIA_TANCAMENT; }; // - Контроль времени и обновление дисплея --------------- currentMillis =millis (); TEMPS_DISPLAY =(currentMillis - предыдущийMillis) / 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 ("Fotocel.lula:"); display.println (digitalRead (FOTOCELULA)); display.print («Датчик TANCAT:»); display.println (digitalRead (TANCAT)); display.print («Датчик OBERT:»); display.println (digitalRead (ОБЕРТ)); display.print ("Порядок ОБРИР:"); display.println (! digitalRead (ОБРИР)); display.display (); если ((currentMillis - previousMillis)> =интервал) {digitalWrite (MOTOR_OBRIR, HIGH); AVARIA =истина; // перейти к PORTA_OBERTA; }; // - индикатор частоты мигания ------------------ if ((currentMillis - TEMPS_LLUM)> =1000) // Мигает с малой скоростью {LLUM =! LLUM; digitalWrite (БОМБЕТА, ЛЛЮМ); TEMPS_LLUM =currentMillis; }; goto A; SEQUENCIA_TANCAMENT:interval =28000; // Максимальное время закрытия двери (превышение означает сбой)! previousMillis =millis (); digitalWrite (MOTOR_TANCAR, LOW); digitalWrite (БОМБЕТА, НИЗКИЙ); if (digitalRead (TANCAT) ==LOW) {delay (1000);}; B:if (digitalRead (TANCAT) ==HIGH) {digitalWrite (MOTOR_TANCAR, HIGH); digitalWrite (БОМБЕТА, ВЫСОКИЙ); goto BUCLE_PRINCIPAL; }; если (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 («Датчик TANCAT:»); display.println (digitalRead (TANCAT)); display.print («Датчик OBERT:»); display.println (digitalRead (ОБЕРТ)); display.print ("Порядок ОБРИР:"); display.println (! digitalRead (ОБРИР)); display.display (); digitalWrite (MOTOR_TANCAR, HIGH); digitalWrite (БОМБЕТА, ВЫСОКИЙ); задержка (1000); while (digitalRead (OBRIR) ==ВЫСОКИЙ) {}; // Ничего не делать, пока не будет дана команда OPEN goto SEQUENCIA_OBERTURA; }; если (digitalRead (FOTOCELULA) ==HIGH) {digitalWrite (MOTOR_TANCAR, HIGH); задержка (1000); goto SEQUENCIA_OBERTURA; }; // - Контроль времени и обновление дисплея --------------------- currentMillis =millis (); TEMPS_DISPLAY =(currentMillis - предыдущийMillis) / 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 ("Fotocel.lula:"); display.println (digitalRead (FOTOCELULA)); display.print («Датчик TANCAT:»); display.println (digitalRead (TANCAT)); display.print («Датчик OBERT:»); display.println (digitalRead (ОБЕРТ)); display.print ("Порядок ОБРИР:"); display.println (! digitalRead (ОБРИР)); display.display (); если ((currentMillis - previousMillis)> =интервал) {digitalWrite (MOTOR_TANCAR, HIGH); AVARIA =истина; goto BUCLE_PRINCIPAL; }; // - индикатор мигает Управление частотой ------------------ if ((currentMillis - TEMPS_LLUM)> =300) // Мигает с большой скоростью {LLUM =! LLUM; digitalWrite (БОМБЕТА, ЛЛЮМ); TEMPS_LLUM =currentMillis; }; goto B; PORTA_OBERTA:interval =30000; // Время ожидания перед закрытием двери! (30 секунд, чтобы сесть в машину ...) previousMillis =millis (); digitalWrite (MOTOR_OBRIR, HIGH); задержка (500); C:если (digitalRead (OBRIR) ==LOW) {перейти к SEQUENCIA_TANCAMENT; }; // - Контроль времени и обновление дисплея --------------------- currentMillis =millis (); TEMPS_DISPLAY =(currentMillis - предыдущийMillis) / 1000; display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println («Дополнение 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 («Датчик TANCAT:»); display.println (digitalRead (TANCAT)); display.print («Датчик OBERT:»); display.println (digitalRead (ОБЕРТ)); display.print ("Порядок ОБРИР:"); display.println (! digitalRead (ОБРИР)); display.display (); если ((currentMillis - previousMillis)> =интервал) {перейти к SEQUENCIA_TANCAMENT; }; // - Специальная составная частота мигания в состоянии ожидания ------------------ // (Короткие мигания по 100 миллисекунд между длительными периодами в 2 секунды) if (LLUM ==false ) {ДУРАДА =100; } else DURADA =2000; if ((currentMillis - TEMPS_LLUM)> =DURADA) // {LLUM =! LLUM; digitalWrite (БОМБЕТА, ЛЛЮМ); TEMPS_LLUM =currentMillis; }; goto C;} 
Код C / C ++
Это код C ++ для компиляции и загрузки в Arduino Nano
 / ******************************** *********************************** Автоматизация для двигателя двигателя ********* ************************************************* ********** /// Библиотеки для каждого сервера дисплея # include  #include  #include  #include  // Определение выводов на портал автоматизма FOTOCELULA =2; int BOMBETA =5; // Реле 1int TANCAT =7; int OBERT =3; int MOTOR_OBRIR =6; // Реле 2int MOTOR_TANCAR =12; // Реле 3int OBRIR =4; // Определение выводов на дисплей # определение OLED_MOSI 11 # определение OLED_CLK 13 # определение OLED_DC 9 # определение OLED_CS 10 # определение OLED_RESET 8 Дисплей Adafruit_SSD1306 (OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET); // переменные globalsunsigned long TEMPS_PORTA_OBERTA =20000; unsigned long TEMPS_MAXIM_RECORREGUT =15000; // Despres ho redefinimint interval =1000; // Интервал - это время ожидания int TEMPS_DISPLAY =1; // время в сегментах для отпечатка в панталлине DURADA =300; // Cicle bombeta senyalitzaciounsigned long previousMillis =0; // Отслеживает время с момента последнего срабатывания события unsigned long currentMillis =millis (); unsigned long TEMPS_LLUM =1000; // временные интервалы в миллисекундах с установленным сроком действия LLUM =false; // Llum encessa si ON и apagada si OFFboolean AVARIA =false; // Excedit el temps de recordregut sense detectar final de carreravoid setup () {// Инициализация контактов для автоматического порта pinMode (FOTOCELULA, INPUT_PULLUP); pinMode (TANCAT, INPUT_PULLUP); pinMode (ОБЕРТ, INPUT_PULLUP); pinMode (OBRIR, INPUT_PULLUP); pinMode (БОМБЕТА, ВЫХОД); pinMode (MOTOR_OBRIR, ВЫХОД); pinMode (MOTOR_TANCAR, ВЫХОД); // Двигатели Apaguem i llum digitalWrite (MOTOR_OBRIR, HIGH); digitalWrite (MOTOR_TANCAR, HIGH); digitalWrite (БОМБЕТА, ВЫСОКИЙ); // Инициализируем отображение Serial.begin (9600); display.begin (SSD1306_SWITCHCAPVCC); display.display (); // Mostra pantalla inicial de Adafruit delay (1000); display.clearDisplay (); display.display (); // подготавливаем отображение для каждого текста display.setTextSize (1); display.setTextColor (WHITE);} недействительный цикл () {BUCLE_PRINCIPAL:задержка (2000); previousMillis =millis (); в то время как (digitalRead (OBRIR) ==ВЫСОКИЙ) {display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println ("ПРИНЦИП БУКЛА ..."); display.setTextSize (1); display.setCursor (0, 20); display.print ("Fotocel.lula:"); display.println (digitalRead (FOTOCELULA)); display.print («Датчик TANCAT:»); display.println (digitalRead (TANCAT)); display.print («Датчик OBERT:»); display.println (digitalRead (ОБЕРТ)); display.print ("Порядок ОБРИР:"); display.println (! digitalRead (ОБРИР)); display.display (); если (AVARIA и (millis () - previousMillis <60000)) {digitalWrite (BOMBETA, LOW); } else (digitalWrite (БОМБЕТА, ВЫСОКИЙ)); }; // Если вы хотите использовать OBRIR в качестве освежающего напитка для большинства датчиков, goto SEQUENCIA_OBERTURA; SEQUENCIA_OBERTURA:interval =28000; // TEMPS MAXIM DE RECORREGUT PORTA OBRINT !!!!!!!!! previousMillis =millis (); digitalWrite (MOTOR_OBRIR, LOW); digitalWrite (БОМБЕТА, НИЗКИЙ); задержка (1000); A:если (digitalRead (OBERT) ==HIGH) {goto PORTA_OBERTA; }; если (digitalRead (OBRIR) ==LOW) {display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println ("Эсперантский порядок на танкар"); display.setTextSize (1); display.setCursor (0, 20); display.print ("Fotocel.lula:"); display.println (digitalRead (FOTOCELULA)); display.print («Датчик TANCAT:»); display.println (digitalRead (TANCAT)); display.print («Датчик OBERT:»); display.println (digitalRead (ОБЕРТ)); display.print ("Порядок ОБРИР:"); display.println (! digitalRead (ОБРИР)); display.display (); digitalWrite (MOTOR_OBRIR, HIGH); digitalWrite (БОМБЕТА, ВЫСОКИЙ); задержка (1000); while (digitalRead (OBRIR) ==ВЫСОКИЙ) {}; // Нет разрешения на замену OBRIR goto SEQUENCIA_TANCAMENT; }; // - Control-de-temps-i-impressionió-en-pantalla --------------------- currentMillis =millis (); TEMPS_DISPLAY =(currentMillis - предыдущийMillis) / 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 ("Fotocel.lula:"); display.println (digitalRead (FOTOCELULA)); display.print («Датчик TANCAT:»); display.println (digitalRead (TANCAT)); display.print («Датчик OBERT:»); display.println (digitalRead (ОБЕРТ)); display.print ("Порядок ОБРИР:"); display.println (! digitalRead (ОБРИР)); display.display (); если ((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 intermitent de senyalitzacio {ЛЛЮМ =! ЛЛЮМ; digitalWrite (БОМБЕТА, ЛЛЮМ); TEMPS_LLUM =currentMillis; }; goto A; SEQUENCIA_TANCAMENT:interval =28000; // TEMPS MAXIM DE RECORREGUT PORTA TANCANT !!!!!!!!! previousMillis =millis (); digitalWrite (MOTOR_TANCAR, LOW); digitalWrite (БОМБЕТА, НИЗКИЙ); if (digitalRead (TANCAT) ==LOW) {delay (1000);}; B:if (digitalRead (TANCAT) ==HIGH) {digitalWrite (MOTOR_TANCAR, HIGH); digitalWrite (БОМБЕТА, ВЫСОКИЙ); goto BUCLE_PRINCIPAL; }; если (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 («Датчик TANCAT:»); display.println (digitalRead (TANCAT)); display.print («Датчик OBERT:»); display.println (digitalRead (ОБЕРТ)); display.print ("Порядок ОБРИР:"); display.println (! digitalRead (ОБРИР)); display.display (); digitalWrite (MOTOR_TANCAR, HIGH); digitalWrite (БОМБЕТА, ВЫСОКИЙ); задержка (1000); while (digitalRead (OBRIR) ==ВЫСОКИЙ) {}; // Нет разрешения на замену OBRIR goto SEQUENCIA_OBERTURA; }; если (digitalRead (FOTOCELULA) ==HIGH) {digitalWrite (MOTOR_TANCAR, HIGH); задержка (1000); goto SEQUENCIA_OBERTURA; }; // - Control-de-temps-i-impressionió-en-pantalla --------------------- currentMillis =millis (); TEMPS_DISPLAY =(currentMillis - предыдущийMillis) / 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 ("Fotocel.lula:"); display.println (digitalRead (FOTOCELULA)); display.print («Датчик TANCAT:»); display.println (digitalRead (TANCAT)); display.print («Датчик OBERT:»); display.println (digitalRead (ОБЕРТ)); display.print ("Порядок ОБРИР:"); display.println (! digitalRead (ОБРИР)); display.display (); если ((currentMillis - previousMillis)> =интервал) {digitalWrite (MOTOR_TANCAR, HIGH); AVARIA =истина; goto BUCLE_PRINCIPAL; }; // - Control-de-cadencia-de-la-llum-intermitent ------------------ if ((currentMillis - TEMPS_LLUM)> =300) // Cadencia de la llum intermitent de senyalitzacio {ЛЛЮМ =! ЛЛЮМ; digitalWrite (БОМБЕТА, ЛЛЮМ); TEMPS_LLUM =currentMillis; }; goto B; PORTA_OBERTA:interval =30000; // TEMPS MAXIM ESPERANT AMB PORTA OBERTA !!!!!!!!! previousMillis =millis (); digitalWrite (MOTOR_OBRIR, HIGH); задержка (500); C:если (digitalRead (OBRIR) ==LOW) {перейти к SEQUENCIA_TANCAMENT; }; // - Control-de-temps-i-impressionió-en-pantalla --------------------- currentMillis =millis (); TEMPS_DISPLAY =(currentMillis - предыдущийMillis) / 1000; display.clearDisplay (); display.setTextSize (1); display.setCursor (0, 0); display.println («Дополнение 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 («Датчик TANCAT:»); display.println (digitalRead (TANCAT)); display.print («Датчик OBERT:»); display.println (digitalRead (ОБЕРТ)); display.print ("Порядок ОБРИР:"); display.println (! digitalRead (ОБРИР)); display.display (); если ((currentMillis - previousMillis)> =интервал) {перейти к SEQUENCIA_TANCAMENT; }; // - Control-de-cadencia-de-la-llum-intermitent ------------------ if (LLUM ==false) {DURADA =100; } else DURADA =2000; if ((currentMillis - TEMPS_LLUM)> =DURADA) // Прерывистая каденция сениалицацио {LLUM =! LLUM; digitalWrite (БОМБЕТА, ЛЛУМ); TEMPS_LLUM =currentMillis; }; goto C;} 

Схема

Как подключить проводку к датчикам, реле и радиомодулю от главного блока управления. schematics_Kzy9lps55T.fzz Скриншот из схемы фритзинга Это список используемых контактов Arduino и способы их подключения к остальным компонентам. pinouts_x7JmwoGJTY.txt Этот аппаратный аддон является ответом на вопрос irshad2318 (см. сообщения для этого проекта)

Производственный процесс

  1. DHT Tiny Breakout для Raspberry Pi
  2. Лучшие аксессуары для Raspberry Pi
  3. Зрение:для слепых
  4. Подводный дрон:история безумия
  5. Автоматическая скользящая передняя бабка для швейцарского и серийного точения
  6. Автоматический рост:светлое будущее для малых и средних предприятий, использующих автоматизацию
  7. Спасибо за воспоминания!
  8. Выбор лучших амортизаторов для автомобилей
  9. Ручная ленточная пила на все случаи жизни
  10. Что такое автоматический силовой пресс?