Подскажите, пожалуйста, по коду

Kruppa
Offline
Зарегистрирован: 18.12.2015

Добрый день! Прошу подсказать по коду. Что-то я совсем запутался в ветвях условий.

Есть задача управлять тельфером церез два реле (по которым будет идти ток уже на пускатели тельфера)

Управление кнопочными постами (с кнопкой вызова на этаж).

В общем виде код вот... Но что-то явно я тут напутал..))
 


int level1 = 3;// первый этаж
int level2= 4; // второй этаж
int level3 =5; // третий этаж
int level4 =6; // четвертый этаж



int r1 = 7; //реле 1- вверх
int r2 = 8; // реле 2- вниз

int knopka1 = 9; //Кнопка первого этажа
int knopka2 =10; // Кнопка второго этажа
int knopka3 =11; // Кнопка третьего этажа
int knopka4 =12; // Кнопка четвертого этажа
int knopka_stop =13; // Стоп
int knopka_X; // Переменная записи цели движения (на какой этаж)
int d;// Переменная этажа


void setup() 
{

pinMode(level1, INPUT); 
pinMode(level2, INPUT); 
pinMode(level3, INPUT); 
pinMode(level4, INPUT); 

pinMode(knopka1, INPUT); 
pinMode(knopka2, INPUT); 
pinMode(knopka3, INPUT); 
pinMode(knopka4, INPUT); 
pinMode(knopka_stop, INPUT); 


pinMode(r1, OUTPUT);  
pinMode(r2, OUTPUT); 


}
void loop() {

//Определяем нажатую кнопку 
if(digitalRead(knopka1)==HIGH)
{
  knopka_X=1;
}
if(digitalRead(knopka2)==HIGH)
{
 knopka_X=2;
}
if(digitalRead(knopka2)==HIGH)
{
 knopka_X=3;
}
if(digitalRead(knopka2)==HIGH)
{
 knopka_X=4;
}
if(digitalRead(knopka_stop)==HIGH)
{
 knopka_X=0;
}

//Определяем уровень платформы
if (digitalRead(level1)==HIGH)
{
  d=1;

}

if(digitalRead(level2)==HIGH)
{
  d=2;
}

if (digitalRead(level3)==HIGH)
{
  d=3;
}
if (digitalRead(level4)==HIGH)
{
  d=4;
}

//Если кнопка стоп не нажата
if (digitalRead(knopka_stop)!=HIGH)
{
  //Если нажата кнопка первого этажа
   if (knopka_X==1)
  {
    if(d!=1)// Платформа не на первом этаже
    {
      move_start(2); // Двигаемся вниз
    }

  }

  if (knopka_X==2) // Если нажата кнопка второго этажа
  {
    if(d!=2) // Мы не на втором этаже
    {
      if(d<2) // Если мы ниже второго этажа
      {
       move_start(1);       // Двигаемся вверх
      }
      if(d>2)   // Если мы ниже второго этажа 
      {
        move_start(2);       // Двигаемся вниз
      }

    }
   
  }

  if (knopka_X==3) //Если нажата кнопка третьего этажа
  {
    if(d!=3) // Если мы не на третьем этаже
    {
      if(d<3) //Если мы ниже третьего этажа
      {
           move_start(1);         // Двигаемся вверх
      }
      if(d>3) //Если мы выше третьего этажа
      {
             move_start(2) ;      //Двигаемся вниз
      }

    }

  }
if (knopka_X==4)//Если нажата кнопка четвертого этажа
  {
    if(d!=4) //Мы не на четвертом
    {
 move_start(1) ;     // Двигаемся вверх
 }


   
  }
  
  else 
{
   digitalWrite(r1, LOW);
    digitalWrite(r2, LOW);
} 

}

  delay(50);
  
}

void move_start(int x) //Включаем пускатель вниз или вверх
{
  if (x==1)
  {
    digitalWrite(r2, LOW);
    digitalWrite(r1, HIGH); //Двигаемся вверх
   }
   if (x==2)
   {
        digitalWrite(r1, LOW);
        digitalWrite(r2, HIGH); // Двигаемся вниз

   }
}

 

Kruppa
Offline
Зарегистрирован: 18.12.2015

Заранее спасибо за любую подсказку  

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
#define LEVEL1        3           // первый этаж
#define LEVEL2        4           // второй этаж
#define LEVEL3        5           // третий этаж
#define LEVEL4        6           // четвертый этаж
#define RELAY_UP      7           // реле 1- вверх
#define RELAY_DOWN    8           // реле 2- вниз
#define BUTTON1       9           // Кнопка первого этажа
#define BUTTON2       10          // Кнопка второго этажа
#define BUTTON3       11          // Кнопка третьего этажа
#define BUTTON4       12          // Кнопка четвертого этажа
#define BUTTON_STOP   2           // Кнопка Стоп
enum {STOP, UP, DOWN} State;      // Возможные состояния системы
byte destination;                 // Переменная записи цели движения (на какой этаж)
byte position;                    // Переменная этажа, где находимся сейчас

void setup()
{
  pinMode(LEVEL1, INPUT);
  pinMode(LEVEL2, INPUT);
  pinMode(LEVEL3, INPUT);
  pinMode(LEVEL4, INPUT);
  pinMode(BUTTON1, INPUT);
  pinMode(BUTTON2, INPUT);
  pinMode(BUTTON3, INPUT);
  pinMode(BUTTON4, INPUT);
  pinMode(BUTTON_STOP, INPUT);
  pinMode(RELAY_UP, OUTPUT);
  pinMode(RELAY_DOWN, OUTPUT);
  destination = 0;
  position = 0;
  State = STOP;
}

void loop() 
{
  // Определяем текущую позицию
  while (position == 0) checkCurrentPosition();
  
  // Ждем нажатия кнопки
  while (destination == 0) checkDestination();

  // Теперь мы знаем где мы и куда надо.
  // Определим направление движения.
  if (position < destination) State = UP;       // если сейчас мы ниже чем надо, то едем вверх
  else if (position > destination) State = DOWN;// если сейчас мы выше чем надо, то едем вниз
  else State = STOP;                            // значит находимся в точке назначения или ХЗ где

  // Крутим движок пока не приедем на заданный этаж
  while(position != destination) 
  {
    if(digitalRead(BUTTON_STOP)) State = STOP;   // обработка кнопки Стоп
    move(State);
    checkCurrentPosition();
  }

  // Приехали, сбрасываем счетчики и прыгаем в начало loop
  State = STOP;
  move(State);
  if (position == destination) position = 0;    // возможно это лишнее
  destination = 0;
}


void checkCurrentPosition() // Определяем текущую позицию
{
  if (digitalRead(LEVEL1)) position = 1;
  else if (digitalRead(LEVEL2)) position = 2;
  else if (digitalRead(LEVEL3)) position = 3;
  else if (digitalRead(LEVEL4)) position = 4;  
}


void checkDestination() // Определяем нажатую кнопку
{
  if (digitalRead(BUTTON1)) destination = 1;
  else if (digitalRead(BUTTON2)) destination = 2;
  else if (digitalRead(BUTTON3)) destination = 3;
  else if (digitalRead(BUTTON4)) destination = 4;
}


void move(byte dir) //Включаем пускатель вниз или вверх
{
  // Едем в заданном направлении
  switch(dir)
  {
    case UP:
    {
      digitalWrite(RELAY_UP, LOW);
      digitalWrite(RELAY_DOWN, HIGH); //Двигаемся вверх
    }
    break;
    
    case DOWN:
    {
      digitalWrite(RELAY_UP, LOW);
      digitalWrite(RELAY_DOWN, HIGH); // Двигаемся вниз
    }
    break;
    
    case STOP:
    {
      digitalWrite(RELAY_UP, LOW);
      digitalWrite(RELAY_DOWN, LOW);
    }
    break;
  }
}

 

Kruppa
Offline
Зарегистрирован: 18.12.2015

Ух как круто! Спасибо большущее!!!