Я хочу, чтобы мой шаговый двигатель работал 1 час.

Я уже пробовал код, который заставляет шаговый двигатель работать всего несколько минут. Я использую модуль часов, DS1302 и уже имеющуюся библиотеку шагового двигателя. Также я использую драйвер L298n. Было бы здорово, если бы кто-то мог помочь. Спасибо.

#include <Stepper.h>
#include <virtuabotixRTC.h>

virtuabotixRTC myRTC(5, 6, 7);
const int stepsPerRevolution = 200;
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

const int OnHour = 12;
const int OnMin = 52;
const int OffHour = 12;
const int OffMin = 55;

void setup() {
  Serial.begin(9600);
  myStepper.setSpeed(100);
}

void loop() {
  myRTC.updateTime();
  Serial.print(myRTC.dayofmonth); //Вы можете переключаться между днем и месяцем, если используете американскую систему
  Serial.print("/");
  Serial.print(myRTC.month);
  Serial.print("/");
  Serial.print(myRTC.year);
  Serial.print(" ");
  Serial.print(myRTC.hours);
  Serial.print(":");
  Serial.print(myRTC.minutes);
  Serial.print(":");
  Serial.println(myRTC.seconds);
  if (myRTC.hours >= OnHour && myRTC.minutes >= OnMin && myRTC.hours <= OffHour && myRTC.minutes < OffMin) {
    Serial.print(myRTC.hours);
    Serial.print(":");
    Serial.print(myRTC.minutes);
    Serial.print(":");
    Serial.println(myRTC.seconds);
    myStepper.step(stepsPerRevolution);
  }
}

, 👍0


1 ответ


2

Проблема в том, что вы обрабатываете минуты и часы отдельно. Это не сработает — их нужно объединить. В текущем виде ваше время «включения» составляет:

  • Минуты больше W, и
  • Часы больше X, и
  • Минуты меньше Y, и
  • Часов меньше, чем Z.

Или, если переставить:

  • Часы между X и Z, и
  • Минуты между W и Y.

Как видите, это не сработает. Вы получите «включение» только на блок минут между W и Y для каждого часа в вашем периоде «ВКЛЮЧЕНИЯ».

Например, если вы хотите ВКЛ с 9:30 до 12:45, вы получите:

  • Если количество часов больше или равно 9 и меньше или равно 12, и
  • Минуты больше или равны 30 и меньше или равны 45

Итак, это с 9:30 до 9:45, с 10:30 до 10:45, с 11:30 до 11:45 и с 12:30 до 12:45

Еще хуже, если вы хотите с 9:30 до 12:00... вторая часть IF выше становится:

  • Минуты больше или равны 30 и меньше или равны 0.

Этого никогда не может случиться. Нет числа, которое было бы одновременно больше 30 и меньше 0.

Таким образом, вам нужно объединить два значения вместе, чтобы создать значение «минут с полуночи». Тогда ваше время включения определяется количеством минут, а не часами и минутами по отдельности. Это достаточно просто:

int minutesSinceMidnight = myRTC.hours * 60 + myRTC.minutes;

Ваше время включения тогда составит для 9:30 9 * 60 + 30 = 570, для 12:00 = 12 * 60 + 0 = 720.

Итак:

if (minutesSinceMidnight >= 570 && minutesSinceMidnight <= 720) {
    // Делай шаги
}
,