Здравствуйте помогите разобраться новчику, пожалуйста!!!
Сначала я описал функции для направления вращения электромотора и его остановки(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;
Поднимаемся вверх - двигатель вращается в одну сторону, опускаемся вниз - двигатель вращается в другую строну. Третьего не дано.
В процессе движения контролируем показания датчика, как только датчик показывает нужное расстояние
У меня вышел такой скетч на данный момент, он реагирует на кнопки и движется, но не совсем понятно как, в направлении нужном, но на этажах не останавливается, а ездит туда сюда, мне бы выяснить как добавить точную дистанцию до места, в котром ему нужно останавливаться, спасибо за помощь
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;
}
}
}
Ну ты подумай головой как в системе с трясущимся уз датчиком при езде могут быть точные значения? Только допустимые интервалы. Кстати они есть в скетче. Проще надо быть.