"Одноразовая" пауза с помощью для if
- Войдите на сайт для отправки комментариев
Втр, 12/09/2017 - 23:28
Всем привет!
Стоит задача сделать условие с разовой задержкой на Arduino. Подробнее:
if ( digitalRead(Pin1) == LOW ) //если включен Pin1
{
digitalWrite(Pin2, LOW); //включаем Pin2
Разовая пауза в 20 секунд с помощью millis
if ( X!= 1 ) //опрос датчика Х на изменения, после работы Pin2 в течение 20 сек
{
digitalWrite(Pin2, HIGH); //выключение Pin2 если после 20 сек работы
//не произошло изменений в системе
}
}
В общем нужна постоянная проверка работоспособности Pin2 по данным с датчика Х.
Уже всю голову поломал! Может пример какой есть простой? Помогите пожалуйста!
http://arduino.ru/forum/programmirovanie/dlya-nachinayushchikh-kak-ne-na...
http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-ch...
Ну если только как пример
#define Pin1 2 #define Pin2 5 unsigned long pausa; bool f_pausa; bool X; void setup() { pinMode(Pin1, INPUT_PULLUP); pinMode(Pin2, OUTPUT); } void loop() { if ( digitalRead(Pin1) == LOW && !f_pausa ) //если включен Pin1 { f_pausa = 1; pausa = millis(); digitalWrite(Pin2, LOW); //включаем Pin2 } if (millis() - pausa > 20000) { if (digitalRead(!Pin2) && X != 1) //опрос датчика Х на изменения, после работы Pin2 в течение 20 сек { f_pausa = 0; digitalWrite(Pin2, HIGH); //выключение Pin2 если после 20 сек работы //не произошло изменений в системе } } }vosara, выражаю громадную благодарность за помощь! Благодаря этому примеру всё склепал за 20 минут.
Желаю чтобы у тебя всё было замечательно!)
В общем, получилось как то так:
unsigned long pausa; // bool f_pausa; //Таймер для (Насоса ЦО) byte avariya; void setup(void){ mcp.begin(); mcp.pinMode(7, OUTPUT); // GPB7 Реле 12 (котел цо) mcp.pinMode(9, OUTPUT); // GPB1 Реле 2 (Насос ЦО) mcp.pinMode(4, OUTPUT); // GPA4 Реле 9 (Авария) mcp.digitalWrite(9, HIGH); // GPB1 Реле 12 (котел цо) ВЫКЛ mcp.digitalWrite(9, HIGH); // GPB1 Реле 2 (Насос ЦО) ВЫКЛ mcp.digitalWrite(4, HIGH); // GPA4 Реле 9 (Авария) ВЫКЛ } void loop(void){ if (mcp.digitalRead(7) == LOW && !f_pausa) //Условие для включения (Насос ЦО) { avariya = 2; f_pausa = 1; //Переключаем таймер в положение ВКЛ pausa = millis(); mcp.digitalWrite(9, LOW); //Включаем (Насос ЦО) } if (millis() - pausa > 5000) //Включаем таймер { if (mcp.digitalRead(9) == LOW && ds.getTempC(Temp2) >= 40 && ds.getTempC(Temp2) >= 40 && avariya == 2) { avariya = 0; } if (mcp.digitalRead(9) == LOW && ds.getTempC(Temp2) <= 40 && avariya == 2) { mcp.digitalWrite(9, HIGH); //Выключаем (Насос ЦО) mcp.digitalWrite(4, LOW); //Включаем сигнал Авария! avariya = 1; } } }В 21 строчке Вы проверяете f_pausa=0 -чтобы включить насос и провести засечку времени-если истина то включается насос и f_pausa = 1; для того чтобы сюда больше не заходить и не менять засечку времени. Больше нигде в программе Вы не возвращаете f_pausa=0, следовательно во второй раз не сможете включить насос.
И еще если mcp.digitalRead(7) то может mcp.pinMode(7, INPUT);
mcp.digitalWrite(9, HIGH); - Может mcp.digitalWrite(7, HIGH); // GPB1 Реле 12 (котел цо) ВЫКЛ
во второй раз не сможете включить насос.
А надо? :)
Ну я думаю что каждыйраз перезапускать ардуино не лутший вариант. А вообще в програме на 40 строк очень много ошибок по не внимательности!
Вы верно подметили на счет f_pausa=0 и на счет ошибок. Это значение возвращается во время перевода "mcp.digitalWrite(9, LOW);" в другом отрезке кода. Исходный код очень объёмный и не хотелось выкладывать его полностью. Если смысл работы системы понятен и (он всё таки работает так как я задумал) грамотность кода не вызывает рвотного рефлекса, то моя цель достигнута :)
Ещё раз благодарю за помощь!
Да нет все нормально. Я считаю если код работает так как Вы задумали ЗНАЧИТ ОН НАПИСАН ПРАВЕЛЬНО!