Мой первый проект. Автоматическое открывание-закрывание вертикальных штор.

Wlad_Nbg
Offline
Зарегистрирован: 17.03.2022

Приветствую всех ардуинщиков!

Этой мой первый пробный проект, поэтому прошу не "пинать ногам".

Суть проекта заключается в автоматическом открывании-закрывании вертикальных штор в зависимости от освещения.

В проекте были задействованы:

- Arduino Uno

- два шаговых мотора 28BYJ-48

- два драйвера ULN2003

- датчик освещения

- резистор на 10kOm

Ниже схема и скетч.

#include <Stepper.h>

int SPMU = 32;

Stepper myStepper1(SPMU, 6,8,7,9);
Stepper myStepper2(SPMU, 10,12,11,13);

const int sensorInput = A0;

enum states { LIGHT, DARK, SUN };

int oldState;

void setup()
{
  Serial.begin(9600);
  myStepper1.setSpeed(500);
  myStepper2.setSpeed(500);
  int sensor = sensorInput;
  if (sensor < 200) //DARK//Темно
  {
    oldState = DARK;
  }
  else if (sensor > 750) // SUN//СОЛНЦЕ
  {
    oldState = SUN;
  }
  else //LIGHT//СВЕТЛО
  {
    oldState = LIGHT;
  }
}

void loop()
{
  int sensor = analogRead(sensorInput);
  
static unsigned long previousMillis;

if(millis() - previousMillis > 1000)
{
   previousMillis = millis();
   Serial.print("Sensorwert = ");
   Serial.println(sensor);
}
  
  int currentState = getCurrentState();
  
  if (oldState == LIGHT && currentState == DARK)
  {
    oldState = DARK;
    myStepper1.step(-1228); 
    myStepper2.step(-1228); 
  }
  else if (oldState == LIGHT && currentState == SUN)
  {
    oldState = SUN;
    myStepper1.step(819); 
    myStepper2.step(819); 
  }
  else if (oldState == DARK && currentState == SUN)
  {
    oldState = SUN;
    myStepper1.step(2048);
    myStepper2.step(2048);
  }
  else if (oldState == DARK && currentState == LIGHT)
  {
    oldState = LIGHT;
    myStepper1.step(1228);
    myStepper2.step(1228); 
  }
  else if (oldState == SUN && currentState == LIGHT)
  {
    oldState = LIGHT;
    myStepper1.step(-819); 
    myStepper2.step(-819); 
  }
  else if (oldState == SUN && currentState == DARK)
  {
    oldState = DARK;
    myStepper1.step(-1228);
    myStepper2.step(-1228);
  }
}
int getCurrentState()
{
  int sensor = analogRead(sensorInput);
  if (sensor < 200) //нижний порог
  return DARK;
  else if (300 < sensor && sensor < 750) //средний порог
  return LIGHT;
  else if (sensor > 850) // верхний порог
  return SUN;
  else
  return oldState;
}

Схема работает, но возникло несколько вопросов:

1. Большой расход энергии (2,2Вт =>5,14В х 0,42А) в "режиме ожидания". Это нормально? Или есть возможность снизить расход до "0"?

2. Оба мотора крутятся в нужном направлении, но друг за другом. Первый стартует, делает YYYY шагов, останавливается, потом второй стартует, делает YYYY шагов, останавливается. Есть возможность крутить их оба одновременно.

3. Можно как-то оптимизировать процесс, заменив библиотеку <Stepper.h> на <AccelStepper.h>?

Буду благодарен за ответы, советы и критику.

sadman41
Offline
Зарегистрирован: 19.10.2016

1) Нормально, если цель в удержании вала.
2)
3) Как-то можно. Когда цель будет обозначена.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Мой первый проект на ардуино был (не смотря на почти 20 лет говнокода на php) - это помигать НЕ встроенным светодиодов (на 13 лапе) ардуино нано. Как-то с места и в карьер получается. Что-то я в этой жизни пропустил...

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Wlad_Nbg пишет:

Ниже схема и скетч.

Это не схема, это рисунок. Детский рисунок.

Приди с подобным рисунком к врачу (хирургу, например), узнаешь много интересного о себе и жизни в целом.

Wlad_Nbg
Offline
Зарегистрирован: 17.03.2022

sadman41 пишет:
1) Нормально, если цель в удержании вала. 2) 3) Как-то можно. Когда цель будет обозначена.

Спасибо.

1. Цели в удержании нет. Просто открыть-закрыть.

2. Забыл знак вопроса поставить в конце)))

3. Вник немного в суть вопроса по библиотеке <AccelStepper.h> В принципе нет надобности на одном обороте +-360°

sadman41
Offline
Зарегистрирован: 19.10.2016

1) Следует снять напряжение со входов драйвера, что приведёт к обесточиванию обмоток;
2) С библиотекой Stepper напрямую не выйдет. Или "вручную" крутить или альтернативной библиотекой. Аксельстеппером, например. В нем и пример есть для двух моторов.

Wlad_Nbg
Offline
Зарегистрирован: 17.03.2022

BOOM пишет:

Мой первый проект на ардуино был (не смотря на почти 20 лет говнокода на php) - это помигать НЕ встроенным светодиодов (на 13 лапе) ардуино нано. Как-то с места и в карьер получается. Что-то я в этой жизни пропустил...

Я лет 5 назад светодиодами мигал, потом забросил это занятие. Теперь вот появилось немного свободного времени - решил немного мозги занять.

По схеме подключения: "рисовал" во "Fritzing")). Удобно переводить прототип  в физическую модель, создавать модели печатных плат и.т.д. Удобней чем рисовать на бумаге. Порадовало наличие многих микросхем, которых в аналогах или симуляторах к сожалению нет.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

 Вы не правильно описания в автомате. Кроме Закрыто, Полуоткрыто и Открыто должно быть еще четыре дополнительных состояния Открывать до полуоткрытия, Открывать до открытия, Закрывать до полуоткрытия, Закрывать до закрытия.