Подскажите, пожалуйста, по коду
- Войдите на сайт для отправки комментариев
Вс, 27/03/2016 - 18:42
Добрый день! Прошу подсказать по коду. Что-то я совсем запутался в ветвях условий.
Есть задача управлять тельфером церез два реле (по которым будет идти ток уже на пускатели тельфера)
Управление кнопочными постами (с кнопкой вызова на этаж).
В общем виде код вот... Но что-то явно я тут напутал..))
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); // Двигаемся вниз
}
}
Заранее спасибо за любую подсказку
#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; } }Ух как круто! Спасибо большущее!!!