int currentFloor = 1;
// Сдвиговый регистр для 7-сегментного индикатора
int latchPin = 4;
int clockPin = 3;
int dataPin = 5;
int D1=A0;
int D2=A1;
int D3=A2;
int D4=A3;
int D5=A4;
int D6=A5;
// Пины кнопок
int btn1 = 6;
int btn2 = 7;
int btn3 = 8;
int btn4 = 9;
// Пины шагового двигателя
int motorPin1 = 10;
int motorPin2 = 11;
int motorPin3 = 12;
int motorPin4 = 13;
void setup() {
// Настройка входов для кнопок
pinMode(btn4, INPUT);
pinMode(btn3, INPUT);
pinMode(btn2, INPUT);
pinMode(btn1, INPUT);
// Настройка выходов для двигателя
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
// Настройка сдвиговых регистров
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
//digitalWrite(latchPindiod, HIGH);
Serial.begin(9600);
updateDisplay(currentFloor);
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
pinMode(D5, OUTPUT);
pinMode(D6, OUTPUT);
}
void loop() {
if (digitalRead(btn4)) moveToFloor(4);
if (digitalRead(btn3)) moveToFloor(3);
if (digitalRead(btn2)) moveToFloor(2);
if (digitalRead(btn1)) moveToFloor(1);
}
void moveToFloor(int targetFloor) {
while (currentFloor != targetFloor) {
// Включение светодиода движения
//updateLedDisplay(true);
digitalWrite(D1, HIGH);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
digitalWrite(D5, HIGH);
digitalWrite(D6, LOW);
if (currentFloor < targetFloor) {
currentFloor++;
up();
} else {
currentFloor--;
down();
digitalWrite(D1, HIGH);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
digitalWrite(D5, LOW);
digitalWrite(D6, HIGH);
}
updateDisplay(currentFloor);
Serial.print("Этаж: ");
Serial.println(currentFloor);
// Выключение светодиода по прибытии
updateLedDisplay(false);
delay(500);
}
stopMotor();
}
void updateDisplay(int floor) {
digitalWrite(latchPin, LOW);
switch(floor) {
case 1: shiftOut(dataPin, clockPin, LSBFIRST, B01001111); break;
case 2: shiftOut(dataPin, clockPin, LSBFIRST, B00010001); break;
case 3: shiftOut(dataPin, clockPin, LSBFIRST, B00000101); break;
case 4: shiftOut(dataPin, clockPin, LSBFIRST, B01001100); break;
}
digitalWrite(latchPin, HIGH);
}
void updateLedDisplay(bool moving) {
if(moving) {
digitalWrite(D1, HIGH);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
digitalWrite(D5, HIGH);
digitalWrite(D6, HIGH);
} else {
digitalWrite(D1, LOW);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
digitalWrite(D5, LOW);
digitalWrite(D6, LOW);
}
}
void up() {
for(int b=0; b<600; b++) {
step(HIGH, LOW, LOW, LOW);
step(LOW, HIGH, LOW, LOW);
step(LOW, LOW, HIGH, LOW);
step(LOW, LOW, LOW, HIGH);
}
digitalWrite(D1, HIGH);
delay(200);
digitalWrite(D2, HIGH);
delay(200);
digitalWrite(D3, HIGH);
delay(200);
digitalWrite(D4, HIGH);
delay(200);
digitalWrite(D5, HIGH);
delay(200);
digitalWrite(D6, LOW);
delay(200);
}
void down() {
for(int a=0; a<600; a++) {
step(LOW, LOW, LOW, HIGH);
step(LOW, LOW, HIGH, LOW);
step(LOW, HIGH, LOW, LOW);
step(HIGH, LOW, LOW, LOW);
}
digitalWrite(D1, HIGH);
delay(200);
digitalWrite(D2, HIGH);
delay(200);
digitalWrite(D3, HIGH);
delay(200);
digitalWrite(D4, HIGH);
delay(200);
digitalWrite(D5, LOW);
delay(200);
digitalWrite(D6, HIGH);
delay(200);
}
void step(bool a, bool b, bool c, bool d) {
digitalWrite(motorPin1, a);
digitalWrite(motorPin2, b);
digitalWrite(motorPin3, c);
digitalWrite(motorPin4, d);
delay(3);
}
void stopMotor() {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
}