Помощь новичку дописать код для работы опытной модели лифта

Здравствуйте помогите разобраться новчику, пожалуйста!!!
Сначала я описал функции для направления вращения электромотора и его остановки(motor1_1;motor1_2)
Далее описал определение расстояния в см с помощью УЗ сонара.
На основе измерений дистанции описал присвоение значений местоположения кабины(kabina) в шахте от 1 до 4,что соответсвует этажам шахты.
Далее описал присвоение этажа(floor1)в зависимости от нажатой кнопки, вместе с этажом от сигнала кнопки устанавливается значение “b” , от которого зависит выполенение функции, которую я не могу корректно написать…
Нужно чтобы эта функция сравнивала значение местоположения кабины(kabina) и значение этажа(floor1) , на который должен подняться или отпуститься лифт, и вызавала функцию мотора поднять или отпустить на нужный этаж.
Этаж 1 находится на высоте 4см
Этаж 2 находится на высоте 14см
Этаж 3 находится на высоте 24см
Этаж 4 находится на ввсоте 34 см
Используется плата ардуино уно
Код:

int motor1_1     = 13;
int motor1_2     = 12;
int motor_speed  = 9;
int trigPin = 3;
int echoPin = 19;
int kabina;
int b, floor1;

void moveUp() {
  digitalWrite(motor1_1, LOW);
  digitalWrite(motor1_2, HIGH);

}
void moveDown() {
  digitalWrite(motor1_1, HIGH);
  digitalWrite(motor1_2, LOW);
}

void stop_motor() {
  digitalWrite(motor1_1, LOW);
  digitalWrite(motor1_2, LOW);
}



void setup() {

  Serial.begin(9600);
  pinMode(motor1_1, OUTPUT);
  pinMode(motor1_2, OUTPUT);
  pinMode(motor_speed, OUTPUT);


  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  pinMode(A3, INPUT);
  pinMode(A4, INPUT);

  analogWrite(motor_speed, 80);

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  b = 0;
}

void loop() {
  int dist;

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  dist = pulseIn(echoPin, HIGH) / 58;


  if (dist > 0 && dist < 4) {
    kabina = 1;
  }
  if (dist > 13 && dist < 15) {
    kabina = 2;
  }
  if (dist > 23 && dist < 25) {
    kabina = 3;
  }
  if (dist > 33) {
    kabina = 4;
  }

  Serial.println(kabina);

  if (analogRead(A1) > 800) {
    floor1 = 1;
    b = 1;
  }
  if (analogRead(A2) > 800) {
    floor1 = 2;
    b = 1;
  }
  if (analogRead(A3) > 800) {
    floor1 = 3;
    b = 1;
  }
  if (analogRead(A4) > 800) {
    floor1 = 4;
    b = 1;
  }
  if (b == 1) {
    byte lift1();
  }

}

Схема(светодиоды нужно исключить, они не используются):

У тебя есть переменная, в которой записан текущий этаж. Пусть это будет переменная a. У тебя есть переменная b, в которой записан этаж вызова. А дальше простая логика

если(a < b)
  поднимаемся вверх до этажа b;
иначе если (a > b)
  опускаемся вниз до этажа b;

Что сложного-то?

1 лайк

Ещё проще: в своей флоор пишите не номер этажа, а высоту в см. И сравнивайте дист и флоор. См. сообщение выше.

1 лайк

Спасибо, я вот не очень понимаю как описать “до этажа”, какими командами

Поднимаемся вверх - двигатель вращается в одну сторону, опускаемся вниз - двигатель вращается в другую строну. Третьего не дано.
В процессе движения контролируем показания датчика, как только датчик показывает нужное расстояние

останавливаем двигатель

Сделал так, но понял, что он всегда будет стоять на месте, кошмарики

byte lift() { 
if (kabina<floor1) { moveUp(); if(kabina=floor1){stop_motor();b=0;}} 
 else 
 if (kabina>floor1){moveDown();if(kabina=floor1){stop_motor();b=0;}} 
 else 
 {stop_motor();b=0;} 
}

Попробуй и увидишь

Попробовал, стоит на месте

Значит не так. Думай дальше

почитай что-нибудь за конечные автоматы.

 switch (state) {
  case WAITING : 
        if (new_floor > current_floor)  (state = MOVING_UP;}
         if (new_floor  < current_floor)  (state = MOVING_DOWN;}
         break;
 case MOVING_UP:
         if (new_floor > current_floor)
             { moveUp();}
         else
              { stop_motor();
                 state WAITING;
                 }
          break;
  case MOVING_DOWN:
         if (new_floor < current_floor) 
              { moveDown();}
         else 
               { stop_motor();
                 state WAITING;
                 }
          break;
 }

С таким кодом он всегда будет стоять.

Да, это я уже понял

Забудь про лифт, этажи и проще смотри на систему - кнопки, уз датчик,мотор.
И да… = и == две большие разницы.

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

int motor1_1 = 13; 
int motor1_2 = 12; 
int motor_speed = 9; 
int trigPin = 3; 
int echoPin = 19; 
int kabina; 
int b, floor1; 
 
void moveUp() { 
 digitalWrite(motor1_1, LOW); 
 digitalWrite(motor1_2, HIGH); 
} 
void moveDown() { 
 digitalWrite(motor1_1, HIGH); 
 digitalWrite(motor1_2, LOW); 
} 
 
void stop_motor() { 
 digitalWrite(motor1_1, LOW); 
 digitalWrite(motor1_2, LOW); 
} 
 
byte getDistance() { 
 int dist; 
 digitalWrite(trigPin, LOW); 
 delayMicroseconds(2); 
 digitalWrite(trigPin, HIGH); 
 delayMicroseconds(10); 
 digitalWrite(trigPin, LOW); 
 dist = pulseIn(echoPin, HIGH) / 58; 
 
 if (dist > 0 && dist < 4) { 
 kabina = 1; 
 } 
 if (dist > 13 && dist < 15) { 
 kabina = 2; 
 } 
 if (dist > 23 && dist < 25) { 
 kabina = 3; 
 } 
 if (dist > 33) { 
 kabina = 4; 
 } 
 Serial.println(kabina); 
} 
 
 
void setup() { 
 
 Serial.begin(9600); 
 pinMode(motor1_1, OUTPUT); 
 pinMode(motor1_2, OUTPUT); 
 pinMode(motor_speed, OUTPUT); 
 
 
 pinMode(A1, INPUT); 
 pinMode(A2, INPUT); 
 pinMode(A3, INPUT); 
 pinMode(A4, INPUT); 
 
 analogWrite(motor_speed, 80); 
 
 pinMode(trigPin, OUTPUT); 
 pinMode(echoPin, INPUT); 
 b = 0; 
} 
 
void loop() { 
 
 byte a; 
 a = getDistance(); 
 if (analogRead(A1) > 800) { 
 floor1 = 1; 
 b = 1; 
 } 
 if (analogRead(A2) > 800) { 
 floor1 = 2; 
 b = 1; 
 } 
 if (analogRead(A3) > 800) { 
 floor1 = 3; 
 b = 1; 
 } 
 if (analogRead(A4) > 800) { 
 floor1 = 4; 
 b = 1; 
 } 
 if (b == 1) { 
 switch (floor1){ 
 case 1: 
 if (floor1>kabina){moveUp();} 
 else 
 if (floor1<kabina){moveDown();} 
 else 
 {stop_motor();} 
 break; 
 
 case 2: 
 if (floor1>kabina){moveUp();} 
 else 
 if (floor1<kabina){moveDown();} 
 else 
 {stop_motor();} 
 break; 
 
 case 3: 
 if (floor1>kabina){moveUp();} 
 else 
 if (floor1<kabina){moveDown();} 
 else 
 {stop_motor();} 
 break; 
 
 case 4: 
 if (floor1>kabina){moveUp();} 
 else 
 if (floor1<kabina){moveDown();} 
 else 
 {stop_motor();} 
 break; 
 } 
 } 
 }

Ну ты подумай головой как в системе с трясущимся уз датчиком при езде могут быть точные значения? Только допустимые интервалы. Кстати они есть в скетче. Проще надо быть.

Кстати в скетче при любом значении кнопочной переменной одни и те же действия.

Так ему ж в любом случае нужно либо поднять, либо отпустить, кроме 1 и 4 этажа

Более того - звуковые волны не рассеиваются мгновенно после замера, а если постоянно пищать, то в воздухе будет шторм.