Помогите с программой

bj2000
Offline
Зарегистрирован: 29.08.2015

Вобщем написал программу. В которой две тактовые кнопки и 6 электроклапанов. клапаны срабатывают поочереди. Условие начала срабатывание что обе кнопки дают сигнал на пины. по нажатию и отпусканию кнопки buttonState2 программа должна прекратить срабатывание клапанов. так вот не могу добиться этого. Помогите пожалуйста.


const int buttonPin2 = 12;
const int buttonPin = 10;     // the number of the pushbutton pin
const int rel1 =  11;
const int rel2 =  9;
const int rel3 =  8;
const int rel4 =  7;
const int rel5 =  6;
const int rel6 =  5;
const int rel7 =  4;
const int rel8 =  3;



// variables will change:
int buttonState = 0;
int buttonState2 = 0;
// variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(rel1, OUTPUT);
  pinMode(rel2, OUTPUT);
  pinMode(rel3, OUTPUT);
  pinMode(rel4, OUTPUT);
  pinMode(rel5, OUTPUT);
  pinMode(rel6, OUTPUT);
  pinMode(rel7, OUTPUT);
  pinMode(rel8, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  buttonState2 = digitalRead(buttonPin2);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH && buttonState2 == HIGH)
  {
    // turn LED on:
    digitalWrite(rel8,HIGH);
  }
  else 
  {
    digitalWrite(rel8,LOW);
    
  }
  if (rel8 == HIGH)
  {
    
    
    delay(60000);
    digitalWrite(rel1, HIGH);
    delay(500);
    digitalWrite(rel1, LOW);
    delay(10000);
    digitalWrite(rel2, HIGH);
    delay(500);
    digitalWrite(rel2, LOW);
    delay(10000);
     digitalWrite(rel3, HIGH);
    delay(500);
    digitalWrite(rel3, LOW);
    delay(10000);
    digitalWrite(rel4, HIGH);
    delay(500);
    digitalWrite(rel4, LOW);
    delay(10000);
     digitalWrite(rel5, HIGH);
    delay(500);
    digitalWrite(rel5, LOW);
    delay(10000);
    digitalWrite(rel6, HIGH);
    delay(500);
    digitalWrite(rel6, LOW);
    delay(10000); 
    digitalWrite(rel7, HIGH);
    delay(500);
    digitalWrite(rel7, LOW);
  digitalWrite(rel8,LOW);
 
  }
  }

 

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Это что за зляк такой?))) У вас с delay'ем не прекратиться тут ничего пока весь код с 51 по 83 строчки не выполнится... Уходите от delay, изучив пример BlinkWithoutDelay

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

bj2000 пишет:
Вобщем написал программу. В которой две тактовые кнопки и 6 электроклапанов. клапаны срабатывают поочереди. Условие начала срабатывание что обе кнопки дают сигнал на пины. по нажатию и отпусканию кнопки buttonState2 программа должна прекратить срабатывание клапанов. так вот не могу добиться этого. Помогите пожалуйста....

Привет попробуйте.

Где добавить ваш код указал


 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

bj2000 у вас пауз delay на 12сукунд,  при работе реле учтите что кнопку нужно будет удерживать-пока все они не пройдут.

Не парьтесь на счет пауз, вам нужно то что вы хотите воплощать в код любыми методами, вот когда все будете писать без хелпа и примеров, с головы тогда и начнете совершенствовать свой код.

В коде delay больше 1000 считаю плохо но не смертельно))))

bj2000
Offline
Зарегистрирован: 29.08.2015

Спасибо за коментарии я просто только начинаю и всех тонкостей пока не изучил.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

bodriy2014 пишет:

bj2000 у вас пауз delay на 12сукунд, 

Нолик потеряли)))

bj2000
Offline
Зарегистрирован: 29.08.2015

Там должна быть пауза 60 секунд и потом 0.5 секунды срабатывает реле и пауза 10 секунд до следующего релеюи так 6 штук. Только в начале пауза большая.

bj2000
Offline
Зарегистрирован: 29.08.2015

Кнопку держать не надо так как реле 8 реализует самоподхват кнопки до конца срабатывания клапанов

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

bj2000 пишет:

Кнопку держать не надо так как реле 8 реализует самоподхват кнопки до конца срабатывания клапанов

Вы наверное не совсем поняли почему все так против delay, как только до него доходит код-контроллер ничего не делает только ждет окончание этой команды!

И если программа дойдет до 55-й строки вашего кода то среагировать на кнопки сможет только через 120секунд.

bj2000
Offline
Зарегистрирован: 29.08.2015

Я все прекрасно понял , только знаний пока не хватает у меня. Вот я и прошу помощи ). Ваш код не работает. Без delay не получается у меня сделать. Buttonstate2 на размыкание.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

bj2000 пишет:
Я все прекрасно понял , только знаний пока не хватает у меня. Вот я и прошу помощи ). Ваш код не работает. Без delay не получается у меня сделать. Buttonstate2 на размыкание.

Я думал вам нужно управление двумя кнопками, нажали обе запустились реле, нажали только вторую выключились реле.

Зачем самоподхват это же не аналоговая техника все можно указать в коде.

Непонятен алгоритм, хотел помочь.

bj2000
Offline
Зарегистрирован: 29.08.2015

Алгоритм такой. Одна кнопка на замыкание, а вторая на размыкание . Нажимаем и отпускаем кнопку 1 начинается работа клапанов и если в процессе работы клапанов нажать и отпустить 2 кнопку то программа прекращается. Буду очень признателен если поможете и я смогу поучиться.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

bj2000 пишет:
Алгоритм такой. Одна кнопка на замыкание, а вторая на размыкание . Нажимаем и отпускаем кнопку 1 начинается работа клапанов и если в процессе работы клапанов нажать и отпустить 2 кнопку то программа прекращается. Буду очень признателен если поможете и я смогу поучиться.

Теперь ясно.

одна кнопка включила, вторая выключила.

вот код

//для bj2000 с форума Arduino.ru
#define  buttonPin2 12
#define buttonPin 10     
#define rel1  11
#define rel2  9
#define rel3  8
#define rel4  7
#define rel5  6
#define rel6  5
#define rel7  4
#define rel8  3
void setup() {
  pinMode(rel1, OUTPUT);
  pinMode(rel2, OUTPUT);
  pinMode(rel3, OUTPUT);
  pinMode(rel4, OUTPUT);
  pinMode(rel5, OUTPUT);
  pinMode(rel6, OUTPUT);
  pinMode(rel7, OUTPUT);
  pinMode(rel8, OUTPUT);
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT);
}
void loop() {
      if (digitalRead(buttonPin) == HIGH){
          //Врубаем реле ваш код
       }
      if(digitalRead(buttonPin2) == HIGH){
        //Выключаем реле ваш код
        }
  }

 

bj2000
Offline
Зарегистрирован: 29.08.2015

Так в моем коде delay останется?

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

bj2000 пишет:
Так в моем коде delay останется?

Там где я указал ваш код строка 26 пишите включение реле в своем порядке хоти-те с delay хоти-те без.

в строке 29 пишите отключение.

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

Я так понял, из кода, что у Вас не кнопки а переключатели. Тогда пример такой а если кнопки то надо код по кнопкам подправить. Не проверял но должно работать, проверьте!!!


#define buttonPin2 12
#define buttonPin 10     // the number of the pushbutton pin
#define rel1 11
#define rel2 9
#define rel3 8
#define rel4 7
#define rel5 6
#define rel6 5
#define rel7 4
#define rel8 3
byte f_status =1;
unsigned long time = millis();
int t = 0;



// variables will change:
int buttonState = 0;
int buttonState2 = 0;
// variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(rel1, OUTPUT);
  pinMode(rel2, OUTPUT);
  pinMode(rel3, OUTPUT);
  pinMode(rel4, OUTPUT);
  pinMode(rel5, OUTPUT);
  pinMode(rel6, OUTPUT);
  pinMode(rel7, OUTPUT);
  pinMode(rel8, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  buttonState2 = digitalRead(buttonPin2);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH && buttonState2 == HIGH)
  {
    // turn LED on:
    digitalWrite(rel8,HIGH);
  }
  else 
  {
    digitalWrite(rel8,LOW);
    f_status=1;	
    
  }
  if (rel8 == HIGH)
  {
    
    switch (f_status) {
    case 1:
      if (millis()-time>=t)
      {
        digitalWrite(rel1, HIGH); 
	t=500;
	time=millis();
	f_status=2;       
      }
      break;
    case 2:
      if (millis()-time>=t)
      {
        digitalWrite(rel1, LOW); 
	t=1000;
	time=millis();
	f_status=3;       
      }
      break;
    case 3:
      if (millis()-time>=t)
      {
        digitalWrite(rel1, HIGH); 
	t=500;
	time=millis();
	f_status=4;       
      }
      break;
    case 4:
      if (millis()-time>=t)
      {
        digitalWrite(rel1, LOW); 
	t=1000;
	time=millis();
	f_status=5;       
      }
      break;
    case 5:
      if (millis()-time>=t)
      {
        digitalWrite(rel2, HIGH); 
	t=500;
	time=millis();
	f_status=6;       
      }
      break;
    case 6:
      if (millis()-time>=t)
      {
        digitalWrite(rel2, LOW); 
	t=1000;
	time=millis();
	f_status=7;       
      }
      break;
    case 7:
      if (millis()-time>=t)
      {
        digitalWrite(rel3, HIGH); 
	t=500;
	time=millis();
	f_status=8;       
      }
      break;
    case 8:
      if (millis()-time>=t)
      {
        digitalWrite(rel3, LOW); 
	t=1000;
	time=millis();
	f_status=9;       
      }
      break;
    case 9:
      if (millis()-time>=t)
      {
        digitalWrite(rel4, HIGH); 
	t=500;
	time=millis();
	f_status=10;       
      }
      break;
    case 10:
      if (millis()-time>=t)
      {
        digitalWrite(rel4, LOW); 
	t=1000;
	time=millis();
	f_status=11;       
      }
      break;
    case 11:
      if (millis()-time>=t)
      {
        digitalWrite(rel5, HIGH); 
	t=500;
	time=millis();
	f_status=12;       
      }
      break;
    case 12:
      if (millis()-time>=t)
      {
        digitalWrite(rel5, LOW); 
	t=1000;
	time=millis();
	f_status=13;       
      }
      break;
    case 13:
      if (millis()-time>=t)
      {
        digitalWrite(rel6, HIGH); 
	t=500;
	time=millis();
	f_status=14;       
      }
      break;
    case 14:
      if (millis()-time>=t)
      {
        digitalWrite(rel6, LOW); 
	t=1000;
	time=millis();
	f_status=15;       
      }
      break;
    case 15:
      if (millis()-time>=t)
      {
        digitalWrite(rel7, HIGH); 
	t=500;
	time=millis();
	f_status=16;       
      }
      break;
    case 16:
      if (millis()-time>=t)
      {
        digitalWrite(rel7, LOW); 
	t=6000;
	time=millis();
	f_status=1;       
      }
      break;
    }
 
   }
  }

 

bj2000
Offline
Зарегистрирован: 29.08.2015

Проверил, программа работает вот только клапана не срабатывают.

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

Смените 55 строчку if (rel8 == HIGH) на if (digitalRead(rel8) == HIGH)

bj2000
Offline
Зарегистрирован: 29.08.2015

vosara спасибо большое программа работает, а как сделать перед началом срабатывания 1го реле 60 сек задержку?

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

#define buttonPin2 12
#define buttonPin 10     // the number of the pushbutton pin
#define rel1 11
#define rel2 9
#define rel3 8
#define rel4 7
#define rel5 6
#define rel6 5
#define rel7 4
#define rel8 3
byte f_status = 0;
unsigned long time = millis();
int t = 0;



// variables will change:
int buttonState = 0;
int buttonState2 = 0;
// variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(rel1, OUTPUT);
  pinMode(rel2, OUTPUT);
  pinMode(rel3, OUTPUT);
  pinMode(rel4, OUTPUT);
  pinMode(rel5, OUTPUT);
  pinMode(rel6, OUTPUT);
  pinMode(rel7, OUTPUT);
  pinMode(rel8, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  buttonState2 = digitalRead(buttonPin2);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH && buttonState2 == HIGH)
  {
    // turn LED on:
    digitalWrite(rel8, HIGH);
  }
  else
  {
    digitalWrite(rel8, LOW);
    f_status = 0;

  }
  if (digitalRead(rel8) == HIGH)
  {

    switch (f_status) {
      case 0:
        t = 60000;
        if (millis() - time >= t)
        {
          f_status = 1;
          t = 0;
        }
        break;
      case 1:
        if (millis() - time >= t)
        {
          digitalWrite(rel1, HIGH);
          t = 500;
          time = millis();
          f_status = 2;
        }
        break;
      case 2:
        if (millis() - time >= t)
        {
          digitalWrite(rel1, LOW);
          t = 1000;
          time = millis();
          f_status = 3;
        }
        break;
      case 3:
        if (millis() - time >= t)
        {
          digitalWrite(rel1, HIGH);
          t = 500;
          time = millis();
          f_status = 4;
        }
        break;
      case 4:
        if (millis() - time >= t)
        {
          digitalWrite(rel1, LOW);
          t = 1000;
          time = millis();
          f_status = 5;
        }
        break;
      case 5:
        if (millis() - time >= t)
        {
          digitalWrite(rel2, HIGH);
          t = 500;
          time = millis();
          f_status = 6;
        }
        break;
      case 6:
        if (millis() - time >= t)
        {
          digitalWrite(rel2, LOW);
          t = 1000;
          time = millis();
          f_status = 7;
        }
        break;
      case 7:
        if (millis() - time >= t)
        {
          digitalWrite(rel3, HIGH);
          t = 500;
          time = millis();
          f_status = 8;
        }
        break;
      case 8:
        if (millis() - time >= t)
        {
          digitalWrite(rel3, LOW);
          t = 1000;
          time = millis();
          f_status = 9;
        }
        break;
      case 9:
        if (millis() - time >= t)
        {
          digitalWrite(rel4, HIGH);
          t = 500;
          time = millis();
          f_status = 10;
        }
        break;
      case 10:
        if (millis() - time >= t)
        {
          digitalWrite(rel4, LOW);
          t = 1000;
          time = millis();
          f_status = 11;
        }
        break;
      case 11:
        if (millis() - time >= t)
        {
          digitalWrite(rel5, HIGH);
          t = 500;
          time = millis();
          f_status = 12;
        }
        break;
      case 12:
        if (millis() - time >= t)
        {
          digitalWrite(rel5, LOW);
          t = 1000;
          time = millis();
          f_status = 13;
        }
        break;
      case 13:
        if (millis() - time >= t)
        {
          digitalWrite(rel6, HIGH);
          t = 500;
          time = millis();
          f_status = 14;
        }
        break;
      case 14:
        if (millis() - time >= t)
        {
          digitalWrite(rel6, LOW);
          t = 1000;
          time = millis();
          f_status = 15;
        }
        break;
      case 15:
        if (millis() - time >= t)
        {
          digitalWrite(rel7, HIGH);
          t = 500;
          time = millis();
          f_status = 16;
        }
        break;
      case 16:
        if (millis() - time >= t)
        {
          digitalWrite(rel7, LOW);
          t = 6000;
          time = millis();
          f_status = 1;
        }
        break;
    }

  }
}

 

bj2000
Offline
Зарегистрирован: 29.08.2015

Программа работает только из цикла не выходит после 6го клапана.

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

Да программа закольцована специально, Я посмотрев ваш код подумал что так и должно быть пока рел8 включено. других условий Вы не оговаривали.