помогите со скетчем

arter
Offline
Зарегистрирован: 16.01.2015

есть скетч, если честно то это доводчик стекол, на 4 стекла.

int switchPin = 12;
int relay1Pin = 6;
int relay2Pin = 7;
int relay3Pin = 8;
int relay4Pin = 9;
int loc1Pin = 2;
int loc2Pin = 3;
int loc3Pin = 4;
int loc4Pin = 5;
 
void setup()
{
  pinMode(switchPin, INPUT);
  pinMode(relay1Pin, OUTPUT);
  pinMode(loc1Pin, INPUT);
  pinMode(relay2Pin, OUTPUT);
  pinMode(loc2Pin, INPUT);
  pinMode(relay3Pin, OUTPUT);
  pinMode(loc3Pin, INPUT);
  pinMode(relay4Pin, OUTPUT);
  pinMode(loc4Pin, INPUT);
}
 
void loop()
 
{
  if (digitalRead(switchPin) == LOW)
  {  
    if (digitalRead(loc1Pin) == LOW)
  digitalWrite(relay1Pin, LOW);   
  } 
  if (digitalRead(switchPin) == LOW)
  { 
    if (digitalRead(loc2Pin) == LOW)  
    digitalWrite(relay2Pin, LOW );
  }
  if (digitalRead(switchPin) == LOW)
  {   
    if (digitalRead(loc3Pin) == LOW)  
    digitalWrite(relay3Pin, LOW);
  }
  if (digitalRead(switchPin) == LOW)
  {  
    if (digitalRead(loc4Pin) == LOW) 
    digitalWrite(relay4Pin, LOW );
  }
   else 
  {
    {  delay(5000);}
   digitalWrite(relay1Pin, HIGH);
   {  delay(5000);}
   digitalWrite(relay2Pin, HIGH);
   {  delay(5000);}
   digitalWrite(relay3Pin, HIGH);
   {  delay(5000);}
   digitalWrite(relay4Pin, HIGH);  
  
  }
}

как бы работает ка кнадо, но хотелось бы еще лучше. 

принцип его работы не сложный, но не для меня, 

описание: если подать сигнал 5в на контакт (я назвал его switchPin), то поочередно включатся 4 реле (relay1Pin-relay4Pin)  с промежутком 5-7сек. есть еще 4 кнопки (loc1Pin-loc4Pin), которые сигнализируют о закрытии окна, так же не дают включить реле если оно уже закрыто (loc1Pin-loc4Pin работают на размыкание).

проблема в том что этот не могу сделать так что бы реле не включались если нажата loc1Pin-loc4Pin.

а на скетче пока все 4 реле поочередно не включатся, даже если какой то из loc1Pin-loc4Pin нажат. после если какой то зажат то реле выключается

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Ну если не вдаваться в подробности и не обсуждать использование delay то самое простое и очевидное это изменить порядок выполнения. У Вас сначало проверяются все кнопки, а потом уже включаются реле, причём независимо от состояния кнопки. Т.е. получается две большие группы в одной кнопки проверяются в другой реле щелкается. А надо сделать 4 группы поменьше вроде таких:

if (digitalRead(switchPin) == LOW)
{
  if (digitalRead(loc1Pin) == LOW)
    digitalWrite(relay1Pin, LOW);
}
else
{
  digitalWrite(relay1Pin, HIGH);
  delay(5000);
}

и таких 4ре группы меняя тоьлко циферки в locNPin и relayNPin. Но это тоже колхоз на самом деле. Но Вашу задачу решит, перед включение реле проверится состояние кнопки и если она нажата (или не нажата смотря что там за кнопки) реле не сработает.

arter
Offline
Зарегистрирован: 16.01.2015

Penni пишет:

if (digitalRead(switchPin) == LOW)
{
  if (digitalRead(loc1Pin) == LOW)
    digitalWrite(relay1Pin, LOW);
}
else
{
  digitalWrite(relay1Pin, HIGH);
  delay(5000);
}

 

у меня был такой вариант, но я все равно попробовал еще раз, 

при добавлении delay в цикл, чтобы что-то сработало надо удерживать SwitchPin.

а в реале на SwitchPin подается импульс напряжения 0.5сек (импульс с сигнализации о ее включении и закрытии дверей)

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Ну введите флаг который будет показывать надо ли закрывать окна или нет и всё. Т.е. импульст 0.5сек устанавливает флаг в true ориентируясь на этот флаг мы и работаем уже независимо от состояния switchPin

arter
Offline
Зарегистрирован: 16.01.2015

я в Ардуине 1 мес и я не программист от бога... я не знаю всех терминов... не могли бы вы чуточку поподробней.

arter
Offline
Зарегистрирован: 16.01.2015

кто-нибудь можно поподробней!

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Что-то вроде такого, логику еще проверить надо, в блокноте делал

boolean NeedClose = false;

void loop()
{
  if((digitalRead(switchPin)==HIGH)&&(!NeedClose))
    NeedClose = true;
  
  if(NeedClose)
  {
    if (digitalRead(loc1Pin) == LOW)
      digitalWrite(relay1Pin, LOW)
    else
    {
      digitalWrite(relay1Pin, HIGH);
      delay(5000);    
    };
    
    if (digitalRead(loc2Pin) == LOW)
      digitalWrite(relay2Pin, LOW)
    else
    {
      digitalWrite(relay2Pin, HIGH);
      delay(5000);    
    };

    if (digitalRead(loc3Pin) == LOW)
      digitalWrite(relay3Pin, LOW)
    else
    {
      digitalWrite(relay3Pin, HIGH);
      delay(5000);    
    };

    if (digitalRead(loc4Pin) == LOW)
      digitalWrite(relay4Pin, LOW)
    else
    {
      digitalWrite(relay4Pin, HIGH);
      delay(5000);    
    }
    NeedClose = false;
  }  
}
alex_vs_drugs@u...
Offline
Зарегистрирован: 29.03.2015

Такие доводчики раньше на амереканские тачки ставили, но после того как стеклом задушило ребенка подобные устройства запретили!!! Сейчас доводчики оснащены датчиком тока, если стекло уперлось, закрылось или чьято голова попала) то реле отключается! Можно прикрутить датчик ACS712 .

http://arduino.ru/forum/programmirovanie/datchik-toka-acs712