Выполнение процеса на время, при замыкание контакта
- Войдите на сайт для отправки комментариев
Втр, 28/11/2017 - 12:56
Всем Доброго времени суток. Есть такая задачка. Есть три контакта. Когда все контакти не полючают цифровой сигнал то замыкаетса 13 пин. Когда подаетса сигнал на первий и второй контакт нужно задать включение 12 пина на определенное время, после чего отключить. Когда замыкаютса все три пина 2,3,4 отключаетса 13 пин.(Это работает). А вот когда замкнутый контакт 2 и 3 пин, не могу установить включение на время 12 контакт. Прошу подскажите. Наперед спасибо всем кто подскажет.
void setup()
{
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}
void loop()
{
if ((digitalRead(2)==HIGH) && (digitalRead(3)==HIGH))
{
digitalWrite(12,HIGH);
}
else if(digitalRead(4)==HIGH) //якщо мін і макс є контакт
{
digitalWrite(13,LOW);//water off
digitalWrite(3,LOW);
digitalWrite(11,HIGH);
}
else if((digitalRead(2)==LOW) && (digitalRead(4)==LOW)) //якщо мін і макс немає контакту
{
digitalWrite(13,HIGH); //water on
}
}
а где у вас инициация входных контактов.
раз работаете с тремя контактами то и в условиях прописывайте все три.
да и код перед вставкой нужно форматировать
Я считую, 2,3,4 пины
Таким способом
const int pin1 = 2; const int pin2 = 3; const int pin3 = 4; void setup() { pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); digitalWrite(11,LOW); digitalWrite(12,LOW); digitalWrite(13,LOW); } void loop() { if ((digitalRead(pin1)==HIGH) && (digitalRead(pin2)==HIGH)) { digitalWrite(12,HIGH); } else if(digitalRead(pin3)==HIGH) //якщо мін і макс є контакт { digitalWrite(13,LOW);//water off digitalWrite(3,LOW); digitalWrite(11,HIGH); } else if((digitalRead(pin1)==LOW) && (digitalRead(pin3)==LOW)) //якщо мін і макс немає контакту { digitalWrite(13,HIGH); //water on } }а кто будет настраивать их на вход ?
Нужно создать такой процес. Если есть контакт на 3 пине, то задать на 12 пине выход на 8 минут. После чего отключить питание на 12 пине. И подать питание на 12 пин при следующем получении сигнала на 3 пине.
Спасибо за помощь наперед.
Нужно создать такой процес. Если есть контакт на 3 пине, то задать на 12 пине выход на 8 минут. После чего отключить питание на 12 пине. И подать питание на 12 пин при следующем получении сигнала на 3 пине.
Спасибо за помощь наперед.
ну так где у вас инициализация входных контактов? - нету
Уже три раза вам это сказали - а вы все постите один и тот же код. Исправлять кто будет за вас?
Вот код.
#define MIX 12 #define WATER 13 #define SCREW 11 #define TIME_ON_SCR 480000 #define TIME_OFF_SCR 60000 boolean state_mid = 0; boolean state_scr = 0; boolean work1 = 0; int state0 = LOW; int state1 = HIGH; unsigned long new_millis_scr = millis(); void setup() { pinMode(MIX, OUTPUT); } void loop() { state_mid = digitalRead(3); if ((digitalRead(3) == HIGH)&&(millis() <= (new_millis_scr + TIME_ON_SCR))) { new_millis_scr = millis(); //digitalWrite(3, state0); digitalWrite(SCREW, state1); } else { digitalWrite(SCREW, state0); } Їгде вы списали этот код? только не говорите, что это ваш - не поверю. В коде куча строк, не имеющих отношения друг к другу. Например, зачем нужна строка 28? Переменная state_mid нигде потом не используется.
По сути. Этот код не будет работать так, как вы хотите. Как только на пине 3 пропадет сигнал - условие в строке 32 станет ложным и нагрузка на пине 12 сразу выключится, без учета времени.
Очевидно, что проверять наличие сигнала на пине 3 нужно только пока нагрузка не включена. Потом этот сигнал нам не интересен, есть он или нет - мы просто ждем положенное время. Значит нужен флаг. показывающий. что нагрузка уже включена и проверять пин3 больше не надо. Как флаг можно использовать само состояние пина12, но лучше взять для этого отдельную переменную (у вас в программе она даже уже есть - work1).
Алгоритм такой -
- если нагрузка еще не работает (флаг сброшен), проверяем наличие сигнала на пине 3 - если HIGH - включаем нагрузку 12. выставляем флаг и запоминаем значение миллис
- если флаг установлен - прверяем, не прошло ли нужное время
- если флаг установлен и время истекло - выключаем пин 12 и сбрасываем флаг
Этот код действительно найден и переделан под свою ситуацию. Спасибо за подсказку. Ну тут фишка в том, что если же пропадает сигнал с 3 пина, то и 12 не зависимо прошло время или нет, должен быть разомкнут.
Вот кое что скоректировал.
Должно срабатывать.
Благодарю ёще раз за помощь.
[code] if ((digitalRead(3) == HIGH)&& work1==0 && (millis() > new_millis_scr)) { new_millis_scr = millis() + TIME_ON_SCR; digitalWrite(SCREW,!digitalRead(SCREW)); work1=1; } if ((digitalRead(3) == LOW)&& work1==1){ work1=0; } [/code]По времени после первого срабатывания не то выходит.
Надо со временем ёще скоректировать.
Нужно создать такой процес. Если есть контакт на 3 пине, то задать на 12 пине выход на 8 минут. После чего отключить питание на 12 пине. И подать питание на 12 пин при следующем получении сигнала на 3 пине.
Может так, попробуйте!
#define MIX 3 //#define WATER 13 #define SCREW 12 #define TIME_ON_SCR 480000 //#define TIME_OFF_SCR 60000 #define state0 LOW #define state1 HIGH boolean state_mid = 0; //boolean state_scr = 0; boolean work1 = 0; unsigned long new_millis_scr = millis(); void setup() { pinMode(MIX, INPUT); pinMode(SCREW, OUTPUT); } void loop() { state_mid = digitalRead(MIX); if (state_mid && !work1) { work1 = 1; new_millis_scr = millis(); digitalWrite(SCREW, state1); } if (!state_mid) { work1 = 0; digitalWrite(SCREW, state0); } if (digitalRead(SCREW)) { if ( millis() - new_millis_scr >= TIME_ON_SCR) { digitalWrite(SCREW, state0); } } }Нужно создать такой процес. Если есть контакт на 3 пине, то задать на 12 пине выход на 8 минут. После чего отключить питание на 12 пине. И подать питание на 12 пин при следующем получении сигнала на 3 пине.
Может так, попробуйте!
#define MIX 3 //#define WATER 13 #define SCREW 12 #define TIME_ON_SCR 480000 //#define TIME_OFF_SCR 60000 #define state0 LOW #define state1 HIGH boolean state_mid = 0; //boolean state_scr = 0; boolean work1 = 0; unsigned long new_millis_scr = millis(); void setup() { pinMode(MIX, INPUT); pinMode(SCREW, OUTPUT); } void loop() { state_mid = digitalRead(MIX); if (state_mid && !work1) { work1 = 1; new_millis_scr = millis(); digitalWrite(SCREW, state1); } if (!state_mid) { work1 = 0; digitalWrite(SCREW, state0); } if (digitalRead(SCREW)) { if ( millis() - new_millis_scr >= TIME_ON_SCR) { digitalWrite(SCREW, state0); } } }Всем благодарю за помощь. Особенно vosara. Всё работает, залил, проверил. Полёт нормальный. БЛАГОДАРЮ.