как установить вывод 13 на ВЫСОКИЙ уровень только на 1 минуту, если датчик на выводе 8 выдает ВЫСОКИЙ уровень?
int PUMP = 13;
int sensor = 8;
int val;
void setup() {
pinMode(13,OUTPUT);
pinMode(8,INPUT);
}
void loop() {
val = digitalRead(8);
if(val == HIGH)
{
digitalWrite(13,HIGH);
}
else
{
digitalWrite(13,LOW);
}
delay(0);
}
@Hakim692, 👍1
3 ответа
Просто добавьте задержку после включения контакта 13. Таким образом, получится:
int PUMP = 13;
int sensor = 8;
int val;
void setup() {
pinMode(13, OUTPUT);
pinMode(8, INPUT);
}
void loop() {
val = digitalRead(8);
if (val == HIGH)
{
digitalWrite(13, HIGH);
delay(60000); //60000мс это 1 минута
}
else
{
digitalWrite(13, LOW);
}
}
Я хочу добавить к ответу Яна:
Если вы хотите что-то сделать позже в течение этой минуты, не используйте
задержку. Вместо этого используйте миллисы, см. Мигание без задержки и используйте тот же принцип. Использование задержек считается плохой практикой, поскольку мешает выполнять другие действия в это время. Однако для вашего небольшого примера это не проблема.Также проверьте, что вы на самом деле подразумеваете под требованием «установить вывод 13 на высокий уровень, если вывод 8 на высоком уровне»:
- Что, если вывод 13 останется высоким в течение 2 минут, должен ли вывод 8 остаться высоким в течение 1 минуты с момента, когда вывод 13 стал высоким (таким образом, он будет низким, когда вывод 13 все еще будет высоким)?
- Или контакт 8 должен оставаться высоким ещё 1 минуту после того, как контакт 13 снова станет низким? В этом случае нужно проверять наличие флангов, а не только текущее состояние.
Это плохой способ сделать это, после этого uC сидит там в течение минуты, не в состоянии сделать что-либо еще. Лучший способ — зафиксировать время ввода PIN-кода, а затем продолжать проверять время, пока не истечет 1 минута.
void loop(){
if ((digitalRead(8) == HIGH) && (timerRunning == 0)){
startTime = millis(); // все переменные времени имеют тип unsigned long
digitalWrite (13, HIGH);
timerRunning = 1;
}
if (timerRunning == 1){
timeNow = millis();
if ((timeNow - startTime)>= 60000UL){
timerRunning = 0;
digitalWrite (13, LOW);
} // проверка прохождения времени окончания
} // завершение проверки работы таймера
// теперь вы можете заниматься другими делами, ожидая, пока пройдет время
} // конец цикла
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора