/*int currentFloor = 1; // Инициализация переменной для хранения текущего этажа лифта (старт с 1 этажа).
int targetFloor = 0; // Начальное значение целевого этажа
// Назначение пинов для управления сдвиговым регистром 74HC595 (подключение к 7-сегментному индикатору).
int latchPin = 4;
int clockPin = 3;
int dataPin = 5;
// Назначение аналоговых пинов A0-A5 для управления дополнительными индикаторами.
int D1=A0;
int D2=A1;
int D3=A2;
int D4=A3;
int D5=A4;
int D6=A5;
// Пины подключения кнопок вызова этажей (1-4).
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);
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() {
// Опрос состояния кнопок. При нажатии вызывает moveToFloor() с целевым этажом.
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) {
// Включение светодиода движения
digitalWrite(D1, HIGH);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
digitalWrite(D5, HIGH);
digitalWrite(D6, LOW);
// Вызов up() или down() в зависимости от направления.
if(currentFloor != targetFloor)
{
if (currentFloor < targetFloor)
{
currentFloor++;
//up();
digitalWrite(D1, HIGH);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
digitalWrite(D5, HIGH);
digitalWrite(D6, LOW);
}
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);
//Serial.print("Current Target Floor: ");
//Serial.println(targetFloor);
// Выключение светодиода по прибытии
updateLedDisplay(false);
// Задержка 500 мс.
delay(500);
}
// Oстановка мотора.
stopMotor();
}
void updateDisplay(int floor) {
// Управление 7-сегментником через сдвиговый регистр.
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() {
if (currentFloor<targetFloor) {
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() {
if(currentFloor>targetFloor) {
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);
}
// Активация конкретных фаз двигателя с задержкой 3 мс для формирования шага.
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);
}
void setTargetFloor(int floorNumber) {
targetFloor = floorNumber;
}*/
/*#include <AccelStepper.h>
// Назначение пинов для управления сдвиговым регистром 74HC595 (подключение к 7-сегментному индикатору).
int latchPin = 4;
int clockPin = 3;
int dataPin = 5;
// Назначение аналоговых пинов A0-A5 для управления дополнительными индикаторами.
int D1=A0;
int D2=A1;
int D3=A2;
int D4=A3;
int D5=A4;
int D6=A5;
// Пины подключения кнопок вызова этажей (1-4).
int btn1 = 6;
int btn2 = 7;
int btn3 = 8;
int btn4 = 9;
#define STEPPER_STEP_PIN 11
#define STEPPER_DIR_PIN 10
// Определение пинов для концевых датчиков
#define TOP_LIMIT_PIN 12
#define BOTTOM_LIMIT_PIN 13
// Объект шагового двигателя
AccelStepper elevator(AccelStepper::DRIVER, STEPPER_STEP_PIN, STEPPER_DIR_PIN);
// Текущий этаж
int current_floor = 1;
void setup() {
myLift.setMaxSpeed(1000); // Максимальная скорость
myLift.setAcceleration(500); // Ускорение
myLift.setCurrentPosition(1); // Начальное положение
Настройка входов для кнопок
pinMode(btn4, INPUT);
pinMode(btn3, INPUT);
pinMode(btn2, INPUT);
pinMode(btn1, INPUT);
// Настройка сдвиговых регистров
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
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() {
static bool up = true;
if(up){
myLift.moveTo(revolutionsPerFloor * stepsPerRevolution); // Поднимаемся на 1 этаж
digitalWrite(D1, HIGH);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
digitalWrite(D5, HIGH);
digitalWrite(D6, LOW);
} else{
myLift.moveTo(0); // Опускаемся на нулевой уровень
}
while(myLift.distanceToGo()!=0){myLift.run();delay(1);}
up = !up; // Меняем направление движения
}*/
#include <AccelStepper.h>
int currentFloor = 1; // Инициализация переменной для хранения текущего этажа лифта (старт с 1 этажа).
int targetFloor = 0; // Начальное значение целевого этажа
#define STEP 11
#define DIR 10
// Назначение пинов для управления сдвиговым регистром 74HC595 (подключение к 7-сегментному индикатору).
int latchPin = 4;
int clockPin = 3;
int dataPin = 5;
// Назначение аналоговых пинов A0-A5 для управления дополнительными индикаторами.
int D1=A0;
int D2=A1;
int D3=A2;
int D4=A3;
int D5=A4;
int D6=A5;
// Пины подключения кнопок вызова этажей (1-4).
int btn1 = 6;
int btn2 = 7;
int btn3 = 8;
int btn4 = 9;
// Пины управления шаговым двигателем.
//int motorPin1 = 10;
//int motorPin2 = 11;
//int motorPin3 = 12;
//int motorPin4 = 13;
//AccelStepper myLift(AccelStepper::DRIVER, 11, 10);
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);
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() {
// Опрос состояния кнопок. При нажатии вызывает moveToFloor() с целевым этажом.
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) {
// Вызов up() или down() в зависимости от направления.
if(currentFloor != targetFloor)
{
if (currentFloor < targetFloor)
{
currentFloor++;
//up();
digitalWrite(D1, HIGH);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
digitalWrite(D5, HIGH);
digitalWrite(D6, LOW);
}
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);
// Задержка 500 мс.
delay(500);
}
// Oстановка мотора.
// stopMotor();
}}
void updateDisplay(int floor) {
// Управление 7-сегментником через сдвиговый регистр.
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<200; 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<200; 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);
}
// Активация конкретных фаз двигателя с задержкой 3 мс для формирования шага.
/*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);
}
*/