Сервопривод начинает вращаться всякий раз, когда он подключен

Я делаю кормушку для рыбы, используя Arduino Mega 2560, сервомотор SG90 и RTC DS3231. Я хочу, чтобы он вращался дважды в день, то есть утром и в 9 часов вечера.

Всякий раз, когда я подключаю свою плату Arduino к ноутбуку в первый раз, она правильно вращается в течение указанного времени 9 часов, и я меняю время на 9 часов 10 минут, чтобы проверить еще раз, и она вращается после того, как я подключаю ее к ноутбуку на 180 градусов, а затем вращается в течение указанного времени.

Что я должен сделать, чтобы избежать этого первоначального вращения?

Вот мой код:

#include<Wire.h>
#include<LiquidCrystal.h>
#include "RTClib.h"
#include <Servo.h>
     
Servo myservo;
     
int pos = 0;
RTC_DS3231 rtc;
DateTime now;
const int OnHour = 9;
const int OnMin = 15;

void setup() {
  Serial.begin(9600);
  rtc.begin();
  myservo.attach(9);
  rtc.adjust(__DATE__,__TIME__));
}
     
void loop() {
  now = rtc.now();
  Serial.print(now.hour);
  Serial.print(" hour(s), ");
  Serial.print(now.min);
  Serial.print(" minute(s)");
  Serial.println(" ");
  delay(1000);
  if (now.hour == OnHour && now.min == OnMin) {
    Serial.println("feeder ON");
    myservo.write(90); 
    delay(1000);
    myservo.write(180); 
  } else {
    Serial.println("feeder OFF");
    delay(10); 
  }
}

, 👍-1

Обсуждение

Подсказка: Какова начальная настройка сервопривода?, @Mikael Patel

@user52610 ... вы пробовали мое решение?, @Michel Keijzers


1 ответ


0

Я не до конца понимаю проблему, но я предполагаю, что вы хотите, чтобы он работал в 9:00 / 9 утра и в 21:00 / 9 вечера в течение 15 минут.

const int onTime1 =  9 * 60 +  0; // 9:00 AM
const int onTime2 = 21 * 60 + 30; // 9:30 PM
const int onMinutes   = 15; // Минут

void loop()
{
  now = rtc.now();
  int nowTime = now.hour * 60 + now.min; // Минут с текущего дня

  if (((onTime1 <= nowTime) && (nowTime < onTime1 + onMinutes)) ||
      ((onTime2 <= nowTime) && (nowTime < onTime2 + onMinutes)))
  {
     myservo.write(90); // Вкл
  }
  else
  {
     myservo.write(180); // Выкл
  }
  delay(1000); // задержка 1 с
}

Вы можете упростить приведенное выше утверждение if, выполнив:

  mysesrvo.write(180 - 90 * (int) (
   ((onTime1 <= nowTime) && (nowTime < onTime1 + onMinutes)) ||
   ((onTime2 <= nowTime) && (nowTime < onTime2 + onMinutes))));
,