Выполнение процеса на время, при замыкание контакта

tkachukyurii
Offline
Зарегистрирован: 28.11.2017

Всем Доброго времени суток. Есть такая задачка. Есть три контакта. Когда все контакти не полючают цифровой сигнал то замыкаетса 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
              }           
 }

 

vvadim
Offline
Зарегистрирован: 23.05.2012

а где у вас инициация входных контактов.
раз работаете с тремя контактами то и в условиях прописывайте все три.
да и код перед вставкой нужно форматировать

tkachukyurii
Offline
Зарегистрирован: 28.11.2017

Я считую, 2,3,4 пины

tkachukyurii
Offline
Зарегистрирован: 28.11.2017

Таким  способом

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
              }           
 }

 

vvadim
Offline
Зарегистрирован: 23.05.2012

а кто будет настраивать их на вход ?

tkachukyurii
Offline
Зарегистрирован: 28.11.2017

Нужно создать такой процес. Если есть контакт на 3 пине, то задать на 12 пине выход на 8 минут. После чего отключить питание на 12 пине. И подать питание на 12 пин при следующем получении сигнала на 3 пине.

Спасибо за помощь наперед.

b707
Offline
Зарегистрирован: 26.05.2017

tkachukyurii пишет:

Нужно создать такой процес. Если есть контакт на 3 пине, то задать на 12 пине выход на 8 минут. После чего отключить питание на 12 пине. И подать питание на 12 пин при следующем получении сигнала на 3 пине.

Спасибо за помощь наперед.

ну так где у вас инициализация входных контактов? - нету

Уже три раза вам это сказали - а вы все постите один и тот же код. Исправлять кто будет за вас?

 

tkachukyurii
Offline
Зарегистрирован: 28.11.2017

Вот код.

#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);
  }
Ї

 

b707
Offline
Зарегистрирован: 26.05.2017

где вы списали этот код? только не говорите, что это ваш - не поверю.  В коде куча строк, не имеющих отношения друг к другу. Например, зачем нужна строка 28? Переменная state_mid нигде потом не используется.

По сути. Этот код не будет работать так, как вы хотите. Как только на пине 3 пропадет сигнал - условие в строке 32 станет ложным и нагрузка на пине 12 сразу выключится, без учета времени.

Очевидно, что проверять наличие сигнала на пине 3 нужно только пока нагрузка не включена. Потом этот сигнал нам не интересен, есть он или нет - мы просто ждем положенное время. Значит нужен флаг. показывающий. что нагрузка уже включена и проверять пин3 больше не надо. Как флаг можно использовать само состояние пина12, но лучше взять для этого отдельную переменную (у вас в программе она даже уже есть - work1).

Алгоритм такой  -

- если нагрузка еще не работает (флаг сброшен), проверяем наличие сигнала на пине 3 - если HIGH - включаем нагрузку 12. выставляем флаг и запоминаем значение миллис

- если флаг установлен - прверяем, не прошло ли нужное время

- если флаг установлен и время истекло - выключаем пин 12 и сбрасываем флаг

tkachukyurii
Offline
Зарегистрирован: 28.11.2017

Этот код действительно найден и переделан под свою ситуацию. Спасибо за подсказку. Ну тут фишка в том, что если же пропадает сигнал с 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]

 

tkachukyurii
Offline
Зарегистрирован: 28.11.2017

По времени после первого срабатывания не то выходит.

Надо со временем ёще скоректировать.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

tkachukyurii пишет:

Нужно создать такой процес. Если есть контакт на 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);
    }
  }
}

 

tkachukyurii
Offline
Зарегистрирован: 28.11.2017

vosara пишет:

tkachukyurii пишет:

Нужно создать такой процес. Если есть контакт на 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. Всё работает, залил, проверил. Полёт нормальный. БЛАГОДАРЮ.