+2 голосов

есть скетч автокормушки с сайта Амперки.Загружается все нормально,но работать не хочет.серво дергается но не крутится.подскажите где моя ошибка.Подключение проверял не один раз,все по схеме.может в скетчечто не так установленно.Подскажите если не трудно.

 

// Подключаем библиотеки для работы
#include <Wire.h>
#include <TroykaRTC.h>
#include <Servo.h>
 
// Время первого кормления
#define FEED_HOUR_1     19
#define FEED_MINUTE_1   52
// Время второго кормления
#define FEED_HOUR_2     19
#define FEED_MINUTE_2   53
// Время третьего кормления
#define FEED_HOUR_3     18
#define FEED_MINUTE_3   59
// Пин к которому подключается сервопривод
#define SERVO_PIN A0
 
// Флаг "Уже покормили"
boolean flag = true;
 
RTC clock;
 
Servo servo;

 
void setup() {
  // Инициализируем часы
  clock.begin();
  servo.attach(SERVO_PIN);
  servo.write(90);
  // Устанавливаем время
clock.set(18,58,00,27,03,20,5);
  // открываем последовательный порт
  
}
 
void loop() {
  clock.read();
 
  //Проверяем не пришло ли время покормить животное
  if (((clock.getHour() == FEED_HOUR_1) && (clock.getMinute() == FEED_MINUTE_1))
  || ((clock.getHour() == FEED_HOUR_2) && (clock.getMinute() == FEED_MINUTE_2))
  || ((clock.getHour() == FEED_HOUR_3) && (clock.getMinute() == FEED_MINUTE_3))) {
    // Если время пришло устанавливаем флаг "Уже покормили"
   flag == false;
    // Открываем заслонку
    servo.write(0);
    // Время открытия заслонки
    delay(500);
    servo.write(90);
  } else {
    flag == true;
    long timeMs = millis();
    while (millis() - timeMs < 10) {}
    servo.write(90);
  }

(4 баллов) 1 2
исправил

3 Ответы

+1 голос

Флаг нигде не является условием, тогда зачем он нужен?

Когда выполняется условие 

if (((clock.getHour() == FEED_HOUR_1) && (clock.getMinute() == FEED_MINUTE_1))
  || ((clock.getHour() == FEED_HOUR_2) && (clock.getMinute() == FEED_MINUTE_2))
  || ((clock.getHour() == FEED_HOUR_3) && (clock.getMinute() == FEED_MINUTE_3))) {

Сервопривод на мгновение встаёт в 90 и потом обратно в ноль на полсекунды. Добавьте в условие флаг.

(3.1 тыс. баллов) 14 20 41
+1 голос

Я бы так сделал...

Время которое заслонка открыта, я оставил как в предыдущем скетче но по моему 500 (полсекунды) это маловато.

// Подключаем библиотеки для работы
#include <Wire.h>
#include <TroykaRTC.h>
#include <Servo.h>

// Время первого кормления
#define FEED_HOUR_1     19
#define FEED_MINUTE_1   52
// Время второго кормления
#define FEED_HOUR_2     19
#define FEED_MINUTE_2   53
// Время третьего кормления
#define FEED_HOUR_3     18
#define FEED_MINUTE_3   59
// Пин к которому подключается сервопривод
#define SERVO_PIN A0

RTC clock;

Servo servo;

unsigned long closeTime;
boolean flag;

void setup() {
  // Инициализируем часы
  clock.begin();
  servo.attach(SERVO_PIN);
  servo.write(90);
  // Устанавливаем время
  clock.set(18, 58, 00, 27, 03, 20, 5);
  // открываем последовательный порт
  closeTime = millis();
  flag = false;
}

void loop() {
  if (flag) { // заслонка открыта?
    if (closeTime < millis()) { // не пора закрывать?
      servo.write(90);
      flag = false;
    }
  } else {
    clock.read();
    //Проверяем не пришло ли время покормить животное
    if (((clock.getHour() == FEED_HOUR_1) && (clock.getMinute() == FEED_MINUTE_1))
        || ((clock.getHour() == FEED_HOUR_2) && (clock.getMinute() == FEED_MINUTE_2))
        || ((clock.getHour() == FEED_HOUR_3) && (clock.getMinute() == FEED_MINUTE_3))) {
      servo.write(0);
      flag = true;
      closeTime = millis() + 500; // время пока будет открыта заслонка
    }
  }
}
(256 баллов) 1 3 14
исправил
0 голосов
Была подобная проблема с сервой FS90. Сам серво оказался бракованным
(4 баллов) 2
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.

    За этот месяц ещё никого.

    ...