Странная проблема. Ардуино перестает работать через несколько часов. Мнения, пожалуйста

Я пытаюсь настроить автоматическое реле для своего аквариума. Arduino должен выключать насос каждые 3 часа на 20 минут и кормить в определенное время в течение дня. Код отлично работает для первых двух циклов включения/выключения. Однако после этого система перестает отвечать на запросы.

Я испробовал много способов решить эту проблему, но пришел к выводу, что проблема может заключаться в утечке памяти, которую я пытался исправить с помощью сброса сторожевого таймера. Я также пытался сбросить настройки Arduino, но это не помогло. не работает после первого сброса.

Я до сих пор не уверен, в чем может быть проблема, поэтому буду признателен за любую информацию.

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

Схема:

Маленький RTC:

Мой код ниже, любые советы будут оценены.

#include "Wire.h"
 #define DS1307_ADDRESS 0x68
 #define RELAY_PIN 2
 #define Feed_PIN 4
 #define led13 13

 void setup() {
   Wire.begin();
   Serial.begin(9600);
   pinMode(RELAY_PIN, OUTPUT);
   pinMode(Feed_PIN, OUTPUT);
   pinMode(led13, OUTPUT);
 }

 void loop() {  
   printDate();
   // digitalWrite(led13, HIGH);
   // задержка (500);
   // задержка (500);
   // цифровая запись (led13, LOW);
   // нулевой байт = 0x00;
   ///Wire.write(ноль);
 }


 byte bcdToDec(byte val)  {
   // Преобразование двоично-десятичных чисел в обычные десятичные числа
   return ( (val / 16 * 10) + (val % 16) );
 }


 void printDate() {
   // Сбрасываем указатель регистра
   Wire.beginTransmission(DS1307_ADDRESS);
   byte zero = 0x00;
   Wire.write(zero);
   Wire.endTransmission();
   Wire.requestFrom(DS1307_ADDRESS, 7);
   int second = bcdToDec(Wire.read());
   int minute = bcdToDec(Wire.read());
   int hour = bcdToDec(Wire.read() & 0b111111); // 24-часовое время
   int weekDay = bcdToDec(Wire.read()); //0-6-> вс-сб
   int monthDay = bcdToDec(Wire.read());
   int month = bcdToDec(Wire.read());
   int year = bcdToDec(Wire.read());
   //печатаем дату EG 01.03.11 23:59:59
   Serial.print(month);
   Serial.print("/");
   Serial.print(monthDay);
   Serial.print("/");
   Serial.print(year);
   Serial.print(" ");
   Serial.print(hour);
   Serial.print(":");
   Serial.print(minute);
   Serial.print(":");
   Serial.println(second);
   if ( (hour ==  9 && (minute >= 00 && minute <= 20)) ||
        (hour == 12 && (minute >= 20 && minute <= 40)) ||
        (hour == 15 && (minute >= 40 && minute <= 59)) ||
        (hour == 18 && (minute >= 00 && minute <= 20)) ||
        (hour == 20 && (minute >= 20 && minute <= 40)) ||
        (hour == 22 && (minute >= 40 && minute <= 59)) ||
        (hour ==  1 && (minute >= 00 && minute <= 20)) ||
        (hour ==  3 && (minute >= 20 && minute <= 40)) ||
        (hour ==  5 && (minute >= 40 && minute <= 59)))
   {
     Serial.print(month);
     Serial.print("/");
     Serial.print(monthDay);
     Serial.print("/");
     Serial.print(year);
     Serial.print(" ");
     Serial.print(hour);
     Serial.print(":");
     Serial.print(minute);
     Serial.print(":");
     Serial.println(second);
     Serial.print(':');
     Serial.print(':');
     Serial.println(", pump off!");

     digitalWrite(RELAY_PIN, HIGH);  
   } else {
     digitalWrite(RELAY_PIN, LOW);  
   }

   if ((hour ==  2 && minute == 43 && second >= 52) ||
       (hour == 10 && minute == 00 && second >= 52) ||
       (hour == 13 && minute == 00 && second >= 52) ||
       (hour == 16 && minute == 00 && second >= 52)) 
   {
     digitalWrite(Feed_PIN, HIGH);
     Serial.println("feeding fish.....");
   } else { 
     digitalWrite(Feed_PIN, LOW); 
   }
 }

, 👍-1

Обсуждение

Важная информация: во сколько он останавливается и какой последний серийный отпечаток? Добавляйте информацию в свой вопрос, а не в комментарии., @Transistor

Когда вы собираетесь "digitalWrite(Feed_PIN, LOW);"?, @Mikael Patel

последний серийный отпечаток ничего. так как последовательный монитор тоже перестает прокручиваться., @user16314

я не пишу цифровой НИЗКИЙ, потому что по истечении минуты условие if не выполняется, @user16314

время его остановки примерно через час, @user16314

@ user16314: Микаэль дал вам очень важную подсказку. Подумай, чувак. Думать., @Transistor

@ user16314: Сообщение об остановке через час не отвечает на мой вопрос в первом комментарии. «На каком _time_ он останавливается». В любом случае прислушайтесь к подсказке!, @Transistor

хорошо, вот новый код,, @user16314

Я не смог вычислить точное время, когда все это дает сбой, потому что это происходит случайным образом в разное время, однако я реализовал Feed_PIN LOW. Я постараюсь снова отметить точное время. Спасибо, @user16314

Кросс-пост [Странная неизвестная проблема. Ардуино перестает работать через несколько часов. Мнения, пожалуйста](http://forum.arduino.cc/index.php?topic=369822) - пытаетесь получить помощь из двух мест, да?, @Nick Gammon

Как узнать, что система перестала отвечать? Серийный монитор? Если вы вернете светодиод на контакт 13, он замерзнет? Я спрашиваю о точном времени, потому что это может указать нам на ваши пункты _if_., @Transistor

@transistor Я бы посоветовал всем взглянуть на сообщение на форуме, на которое ссылается Ник Гаммон, поскольку в нем есть информация, которую ОП опубликовал, связанную с некоторой серийной информацией., @RSM

http://forum.arduino.cc/index.php?topic=369822.0 вот ссылка на сообщение форума arduino, @user16314

МОЖНО избегать чтения RTC при работающем двигателе., @Mikael Patel

проблема с входной мощностью, попробуйте решить проблему с помощью блока питания. другое решение 555 Сторожевой таймер, @Şeyh Müslüm İncedal

Возможно, вы могли бы расширить свой ответ, чтобы объяснить, что такое сторожевой таймер 555 и почему вы думаете, что он решит проблему в этом случае?, @sempaiscuba


4 ответа


1

Ваш код выглядит нормально, я пока не могу дать комментарий, так как у меня недостаточно высокий рейтинг, поэтому вместо этого я попытаюсь сформулировать это как ответ.

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

Если время не работает, то я хотел бы обратить ваше внимание на эту тему на форуме arduino, так как это, по-видимому, очень плохой модуль. У некоторых людей часы не работают должным образом, и есть много сообщений об устранении неполадок, но, поскольку это должно быть ответом, я взял основные проблемы и поместил их ниже.

https://forum.arduino.cc/index.php?topic=177297.0

в основном проблемы исходят из:

поставляется неперезаряжаемая батарея Cr2032 вместо перезаряжаемой батареи li2032, это приводит к тому, что схема зарядки на плате срабатывает.

Исправлено: замена на li2032 или удаление схемы зарядки — см. ссылку

незаземленный кристалл - может быть, а может и не быть реальной проблемой

Исправлено: заземлить кристалл

Плохой кристалл:

Исправлено: заменить кристалл

Ошибка в конструкции - Резистор №. 7 на месте

Исправлено: удалить резистор

,

Вот точное время: время начала ::, откачивай! 13.01.16 5:50:49 13.01.16 5:50:49 ::, откачивай! 13.01.16 5:50:49 13.01.16 5:50:49 ::, откачивай! 13.01.16 5:50:49 13.01.16 5:50:49 ::, откачивай! 13.01.16 5:50:50 время окончания 13.01.16 15:42:55 13.01.16 15:42:55 ::, откачивай! 13.01.16 15:42:55 13.01.16 15:42:55 ::, откачивай! 1/1/0 0:0:80 1/1/0 0:0:80 1/1/0 0:0:80 1/1/0 0:0:80 1/1/0 0:0:80 1/1/0 0:0:80 после того, как он начнет увеличиваться 0:0:80 - это вывод, @user16314


0

Возможно, вы можете попробовать while (Wire.available() != 7); перед вызовом Wire.read() 7 раз подряд. Также удалите начальные нули в целочисленных литералах 0 в ваших условиях IF. И заставьте bcdToDec возвращать int вместо byte в маловероятном случае каких-либо проблем с переполнением.

,

-1

У меня тоже самое было с моей метеостанцией Arduino UNO, пока я не перешел на БП со свинцовым аккумулятором. Самое обычное - блок питания. Попробуйте использовать помощнее и используйте ферриты на проводах БП.

,

0

Я знаю очень грубую идею грубой силы, но боюсь, она вам не понравится.

Вот как это делается: Используйте дополнительное реле для питания arduino: Пока arduino включено, подайте питание на размыкающий контакт и после каждого цикла просто переводите этот выход в состояние HIGH. Как это работает, спросите вы? Что ж, после цикла вы с состоянием логической 1 (ВЫСОКИЙ) заставите «отключить» питание Arduino, что приведет к потере питания. Тем не менее, реле имеет пружину, которая в случае потери питания возвращается в нормально замкнутое положение, и в этом случае ваше Arduino будет сброшено и будет работать еще один цикл.

Это должно работать на 100 %, но, как я уже говорил, это ужасная идея грубой силы :)

,