В скетче в части с датчиком движения в конце есть делей , который здесь нужен. Но просто делей оставить не получается ибо виснет весь скетч. Помогите исправить пожалуйста Код (C++): #include <Servo.h> // Включаем библиотеку Сервопривода #include <DHT.h> // Включаем библиотеку Термометра const int move_sensor = 2; // Пин Датчика Приближения const int button = 4; // Пин Кнопки const int motor1_IN3 = 5; // Пин Мотора на Драйвер_1 L298N const int motor2_IN4 = 6; // Пин Мотора на Драйвер_2 L298N const int LEDpin1 = 7; // Пин Светодиода_1 const int LEDpin2 = 8; // Пин Светодиода_2 const int motor_ENB = 9; // Пин скорости мотора const int DHTPIN = 11; // Пин Датчика Температуры const int LEDpin3 = 12; // Пин Светодиода_3 int state = LOW; // Переменная состояния выхода int reading; // Переменная значения кнопки в данный момент int previous = HIGH; // Переменная предыдущего значения кнопки #define DHTTYPE DHT11 // Тип Датчика Температуры (DHT11) DHT dht(DHTPIN, DHTTYPE); // Обозначаем Датчик Температуры для Библиотеки long time = 0; // Переменная последнего времени , когда выход был переключен long debounce = 200; // Переменная дребежжания Servo servo1; // Обозначаем Сервопривод для Библиотеки Сервоприводов void setup() { servo1.attach(3); // Подключить Сервопривод Пин - 3 pinMode(A0, INPUT); // Пин A0 - вход (Фоторезистор) pinMode (2, INPUT); // Пин 2 - вход (Датчик приближения) pinMode(4, INPUT); // Пин 4 - вход (Кнопка) pinMode(5, OUTPUT); // Пин 5 - выход (Мотор) pinMode(6, OUTPUT); // Пин 6 - выход (Мотор) pinMode (7, OUTPUT); // Пин 7 - выход (Светодиод) pinMode (8, OUTPUT); // Пин 8 - выход (Светодиод) pinMode (9, OUTPUT); // Пин 9 - выход (Скорость мотора) pinMode (12, OUTPUT); // Пин 12 - выход (Светодиод) } void loop() { /* Гараж открывается и закрывается по кнопке. */ { reading = digitalRead(4); // Присваивем переменной значение с 4 пина (кнопки) if (reading == HIGH && previous == LOW && millis() - time > debounce) // Если значение кнопки HIGH, до этого было LOW и нет дребежжания { if (state == HIGH) // Если значение выхода HIGH , то сделать LOW. state = LOW; else // Иначе оставить state = HIGH; time = millis(); } digitalWrite(8, state); // Значение светодиода = состоянию выхода if (state == HIGH) // Если значение выхода HIGH , то сервопривод на угол 0 { servo1.write(0); } else // Иначе на 90 { servo1.write(90); } previous = reading; } /* Свет включается , если на улице темно. */ { if (analogRead(A0) < 150) // Если значение фоторезистора меньше 150 , то включить светодиод { digitalWrite(12, HIGH); } else { digitalWrite(12, LOW); // Иначе выключить } } /* Если температура больше 27 градусов , то включается вентилятор. */ { float t = dht.readTemperature(); if (t > 27) { digitalWrite (6, HIGH); // Включить мотор на скорость 200 digitalWrite (5, LOW); analogWrite(9,200); } else // Иначе выключить { digitalWrite (6, LOW); digitalWrite (5, LOW); } } /* Если есть движение , то включить свет. */ { int move; // Переменной move присвоить значение Датчика движения move = digitalRead (2); if(move == HIGH) // Если есть движение , то включить светодиод и не выключать 40 секунд { digitalWrite (7, HIGH); delay (40000) digitalWrite (7, LOW); } else // Иначе выключить { digitalWrite (7, LOW); } } }
delay проще в использовании, а millis требует более структурированую программу. Конкретно, пока вы не научитесь такие программы писать, то вы будете топтаться на месте. Поэтому более опытные помалкивают на ваш вопрос.
Я написал, однако не работает как надо. Не скажите, в чём проблема? Код (C++): #include <Servo.h> // Включаем библиотеку Сервопривода #include <DHT.h> // Включаем библиотеку Термометра const int move_sensor = 2; // Пин Датчика Приближения const int button = 4; // Пин Кнопки const int motor1_IN3 = 5; // Пин Мотора на Драйвер_1 L298N const int motor2_IN4 = 6; // Пин Мотора на Драйвер_2 L298N const int LEDpin1 = 7; // Пин Светодиода_1 const int LEDpin2 = 8; // Пин Светодиода_2 const int motor_ENB = 9; // Пин скорости мотора const int DHTPIN = 11; // Пин Датчика Температуры const int LEDpin3 = 12; // Пин Светодиода_3 long long last; int state = LOW; // Переменная состояния выхода int reading; // Переменная значения кнопки в данный момент int previous = HIGH; // Переменная предыдущего значения кнопки #define DHTTYPE DHT11 // Тип Датчика Температуры (DHT11) DHT dht(DHTPIN, DHTTYPE); // Обозначаем Датчик Температуры для Библиотеки long time = 0; // Переменная последнего времени , когда выход был переключен long debounce = 200; // Переменная дребежжания Servo servo1; // Обозначаем Сервопривод для Библиотеки Сервоприводов void setup() { servo1.attach(3); // Подключить Сервопривод Пин - 3 pinMode(A0, INPUT); // Пин A0 - вход (Фоторезистор) pinMode (2, INPUT); // Пин 2 - вход (Датчик приближения) pinMode(4, INPUT); // Пин 4 - вход (Кнопка) pinMode(5, OUTPUT); // Пин 5 - выход (Мотор) pinMode(6, OUTPUT); // Пин 6 - выход (Мотор) pinMode (7, OUTPUT); // Пин 7 - выход (Светодиод) pinMode (8, OUTPUT); // Пин 8 - выход (Светодиод) pinMode (9, OUTPUT); // Пин 9 - выход (Скорость мотора) pinMode (12, OUTPUT); // Пин 12 - выход (Светодиод) } void loop() { /* Гараж открывается и закрывается по кнопке. */ { reading = digitalRead(4); // Присваивем переменной значение с 4 пина (кнопки) if (reading == HIGH && previous == LOW && millis() - time > debounce) // Если значение кнопки HIGH, до этого было LOW и нет дребежжания { if (state == HIGH) // Если значение выхода HIGH , то сделать LOW. state = LOW; else // Иначе оставить state = HIGH; time = millis(); } digitalWrite(8, state); // Значение светодиода = состоянию выхода if (state == HIGH) // Если значение выхода HIGH , то сервопривод на угол 0 { servo1.write(0); } else // Иначе на 90 { servo1.write(90); } previous = reading; } /* Свет включается , если на улице темно. */ { if (analogRead(A0) < 150) // Если значение фоторезистора меньше 150 , то включить светодиод { digitalWrite(12, HIGH); } else { digitalWrite(12, LOW); // Иначе выключить } } /* Если температура больше 27 градусов , то включается вентилятор. */ { float t = dht.readTemperature(); if (t > 27) { digitalWrite (6, HIGH); // Включить мотор на скорость 200 digitalWrite (5, LOW); analogWrite(9,200); } else // Иначе выключить { digitalWrite (6, LOW); digitalWrite (5, LOW); } } /* Если есть движение , то включить свет. */ { int move; // Переменной move присвоить значение Датчика движения move = digitalRead (2); if(move == HIGH) // Если есть движение , то включить светодиод и не выключать 40 секунд { digitalWrite (7, HIGH); last = millis(); } else // Иначе выключить { digitalWrite (7, LOW); } } if(millis() - last > 40000){ digitalWrite (7, LOW); } }
Надо , чтобы если есть движение, то диод горел ещё 40 секунд (как я указал для наглядности в начале темы.) Попробовал ещё чуть по другому , тож не работает как надо Код (C++): move = digitalRead (2); if (move == HIGH && temp == 0) // Если есть движение , то включить светодиод и не выключать 40 секунд { digitalWrite (7, HIGH); temp = 1; } t2 = millis(); if (temp = 1){ t1 = millis(); if (t1 - t2 > 40000){ if ( move == HIGH) t2=t1;//прошло 40с, движение ЕСТЬ, ещё 40с ждём if ( move == LOW) { digitalWrite (7, LOW);// прошло 40с, движения НЕТ, вырубаем)) temp = 0; } } }
строчку t2 = millis(); перенесите внутрь скобки выше - иначе у вас t2 будет при каждом проходе цикла обновлятся и 40сек интервал никогда не наступит. Вы, похоже, совсем логику кода с миллис не понимаете...