Что не так с этим кодом? Это не работает

#include <DS1302.h>
#include <Servo.h>
Time t;
Servo myservo;
int Hour;
int Min;
int Sec;
// Запускаем DS1302
DS1302 rtc(2, 3, 4);

void setup()
{
myservo.attach(9); 
myservo.write(45); 
// Установить часы в режим работы и отключить защиту от записи
rtc.halt(false);
rtc.writeProtect(false);
Serial.begin(9200);
// Следующие строки можно закомментировать, чтобы использовать значения, уже сохраненные в DS1302
//rtc.setDOW(ВОСКРЕСЕНЬЕ); // Установить день недели на ВОСКРЕСЕНЬЕ
//rtc.setTime(8, 59, 50); // Установите время на 12:00:00 (24-часовой формат)
//rtc.setDate(8, 25, 2019); // Установите дату на 25 августа 2019 г.
}

void loop()
{
t = rtc.getTime();
Hour = t.hour;
Min = t.min;
Sec = t.sec;
 Serial.print(Hour);
 Serial.print(":");
 Serial.print(Min);
 Serial.print(":");
 Serial.println(Sec);

//устанавливаем время кормления рыб
if ((Hour== 2 && Min== 0 && Sec== 2)||(Hour== 21 && Min== 0 && Sec== 2)) {
myservo.write(0);
delay (300);
myservo.write(45);
delay (300);}
}

, 👍-4

Обсуждение

промежуточный код сработал?, @jsotola

Нет, вроде ничего не работает хахаха, @Tiago Kotryk

Вам нужно определить «не работает». Какой результат вы ожидаете? Какой результат вы получаете? Что случается? Это как пойти к врачу и сказать, что тебе плохо. Ему/ей нужно больше деталей, чем это., @Nick Gammon

в вашем предыдущем посте я предложил вам напечатать сообщение, когда секунд 10 ... это сработало?, @jsotola

Серийный.начало(9200) ? и в зависимости от библиотеки время rtc.get может зависнуть при плохом соединении с чипом rtc., @Tirdad Sadri Nejad

Было бы полезно, если бы вы могли ответить на вопрос Ника Гэммона. «Не работает» — это бесполезное описание проблемы. Также Serial.begin(9200);, скорее всего, не даст никакого полезного вывода на последовательной консоли., @StarCat

Ник, я ожидал, что сервопривод начнет вращаться в заданное время. Это не так. Сервопривод вообще не двигается. - Я изменил serial.begin(9200) на (9600), но, похоже, это не повлияло на вывод., @Tiago Kotryk

Я бы разбил это на отдельные проблемы, сначала прокомментировав код сервопривода и убедившись, что временной код работает КАК ОЖИДАЕТСЯ. Затем сделайте то же самое для кода сервопривода. Если часы не работают, КАК ОЖИДАЕТСЯ, дважды проверьте такие вещи, как использование правильных контактов для подключения платы RTC к ARDUINO UNO или работоспособность батареи RTC. Если сервоприводы не работают КАК ОЖИДАЕТСЯ, дважды проверьте такие вещи, как использование правильного контакта для управления сервоприводом, правильно ли подключены провода заземления и питания сервопривода, а также достаточно ли мощен источник питания для работы сервопривода., @st2000

@ st2000 Я думаю, что единственное, что я пока не рассмотрел, это использование правильных контактов. Как мне это проверить?, @Tiago Kotryk

Прекратите повторно публиковать (пока что 3 раза) свой вопрос! Люди начнут их закрывать. Вместо этого отредактируйте исходный вопрос., @st2000

Отвечает ли это на ваш вопрос? [Код для автоматической подачи не работает](https://arduinoprosto.ru/q/77999/code-for-fish-auto-feeder-not-working), @Delta_G

В строке «DS1302 rtc(2, 3, 4);» Вы сообщаете программе, что будете подключать микросхему часов Dallas Semiconductor к контактам 2, 3 и 4., @st2000

Пожалуйста, не повторяйте тот же вопрос. Этот сайт работает не так. Я собираюсь объединить их., @Nick Gammon


2 ответа


1

Объяснение многократного выполнения

if ((Hour== 9 && Min== 14)||(Hour== 21 && Min== 0)) {
  for (pos = 0; pos <= 180; pos += 1) { // переход от 0 градусов к 180 градусам
    // с шагом в 1 градус
    myservo.write(pos);              // сообщаем сервоприводу перейти в позицию в переменной 'pos'
    delay(15);                       // ждем 15 мс, пока сервопривод не достигнет позиции
  }
  for (pos = 180; pos >= 0; pos -= 1) { // переход от 180 градусов к 0 градусам
    myservo.write(pos);              // сообщаем сервоприводу перейти в позицию в переменной 'pos'
    delay(15);                       // ждем 15 мс, пока сервопривод не достигнет позиции
  }
 }
  1. Предположим, что время 9:14:00 (9 часов, 14 минут, 00 секунд). Условие if выполнено.

  2. Цикл for будет выполнен. Продолжительность, необходимая для завершения цикла, составляет примерно 5 секунд.

  3. Позже он снова перейдет к условию if. Теперь время будет 9:14:06.. это означает, что состояние снова пройдет.. двигатель снова будет вращаться, т.е. это будет повторяться примерно 11 раз.. пока время не изменится на 9:15:00 или больше.

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

    delay(60000);

затем следующее условие "если" не будет выполнено и будет работать в соответствии с вашими ожиданиями.


Часть 2:

отладка:

        if ((Hour== 9 && Min== 14)||(Hour== 21 && Min== 0)) {
          for (pos = 0; pos <= 180; pos += 1) { // переход от 0 градусов к 180 градусам
            // с шагом в 1 градус
            myservo.write(pos);              // сообщаем сервоприводу перейти в позицию в переменной 'pos'
            delay(15);
            Serial.println("moving");
    ....

,

Как это? пустой цикл() { т = rtc.getTime(); Час = t.час; Мин = t.мин; сек = t.сек; // Serial.print(Час); // Serial.print(":"); // Serial.print(мин); // Serial.print(":"); Serial.println (сек ); //устанавливаем время кормления рыб if ((Час== 11 && Мин== 46 && Сек== 0)||(Час== 21 && Мин== 0 && Сек== 0)) { for (позиция = 0; позиция <= 180; позиция += 1) { // с шагом в 1 градус myservo.write(pos); задержка(15); } for (позиция = 180; позиция >= 0; позиция -= 1) { myservo.write(pos); задержка(15); } задержка(60000); } }, @Tiago Kotryk

Но в любом случае, проблема здесь в том, что сервопривод даже не запускается!, @Tiago Kotryk

вы должны проверить соединения сервопривода один раз. я сомневаюсь в этом, @ArduinoFan

С соединениями все в порядке, я только что проверил сервопривод с помощью кода примера сервопривода., @Tiago Kotryk

Я только что добавил снимок симуляции. Я создал с помощью симулятора wokwi Arduino.. он работает очень хорошо.. тем не менее, можете ли вы использовать некоторые операторы печати, чтобы увидеть, выполняется ли когда-либо условие IF?, @ArduinoFan

Я полный нуб в ардуино и программировании. Я понимаю, что вы предлагаете, используя некоторые операторы печати, чтобы увидеть, проходит ли условие IF, но я понятия не имею, как это сделать. Простите, что так сильно вас беспокою. :\, @Tiago Kotryk

@TiagoKotryk вставьте Serial.println("moving"); в скобки операторов if. Хотя в этот момент вам следует немного отступить и сначала пройти несколько базовых руководств по Arduino, чтобы изучить основы. Я не думаю, что вы действительно понимаете код, который вы там написали, но что вы просто скопировали и вставили его вместе. Становится легче, когда вы понимаете основы, @chrisl

@chrisl Вы правы в том, что сделали. Спасибо за ваше предложение. Я вставил код в скобки, и он показывает здесь «Движение» каждую секунду! Означает ли это, что сервопривод пытается двигаться каждую секунду?, @Tiago Kotryk

Да. Хотя непонятно, какой код вы сейчас используете. Добавьте новую версию кода к вашему вопросу (оставив старую часть нетронутой), @chrisl

@chrisl обновил эту ветку текущим кодом и результатами, чтобы вы могли взглянуть. Спасибо за огромную помощь!, @Tiago Kotryk

вы поместили оператор печати вне цикла for. Пожалуйста, поместите его в цикл for. вы можете поместить его после строки delay(15), @ArduinoFan

@goodarduinocode Я внес изменение: for (pos = 180; pos >= 0; pos -= 1) { // переход от 180 градусов к 0 градусам myservo.write(pos); // сообщаем сервоприводу перейти в позицию в переменной 'pos' задержка(15); // ждем 15 мс, пока сервопривод не достигнет позиции Serial.println ("перемещение"); } } } Но в результате серийный номер монитора ничего не отображает, @Tiago Kotryk

Условие запуска двигателя никогда не бывает «проходящим». Пожалуйста, найдите время и попытайтесь понять. РТК работает? Можете ли вы отладить время? Распечатайте время и посмотрите, @ArduinoFan


-1

Я думаю, проблема в том, что вы указали скорость 9200 бод, но минимальная скорость 9600 (Serial.begin(9600)). И измените скорость передачи в последовательном мониторе.

,

За 4 часа до того, как вы опубликовали свой ответ, Тьяго Котрик уже ответил в комментариях, что изменение скорости передачи данных на 9600 не имеет значения. Так зачем публиковать это как ответ?, @StarCat