Автоматическая раздвижная дверь для гаража
Компоненты и расходные материалы
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 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 Скриншот из схемы фритзинга

Производственный процесс
- DHT Tiny Breakout для Raspberry Pi
- Лучшие аксессуары для Raspberry Pi
- Зрение:для слепых
- Подводный дрон:история безумия
- Автоматическая скользящая передняя бабка для швейцарского и серийного точения
- Автоматический рост:светлое будущее для малых и средних предприятий, использующих автоматизацию
- Спасибо за воспоминания!
- Выбор лучших амортизаторов для автомобилей
- Ручная ленточная пила на все случаи жизни
- Что такое автоматический силовой пресс?