Самопроизвольный Reset ардуино

Jeterex
Offline
Зарегистрирован: 26.08.2020

Ситуация следующая:
Есть УНО с LCD keypad Shild, к ней подключен dht 11 (влажность температура), два модуля реле, два мосфет модуля (на один управляющий пин). Все работает нормально, НО периодически происходит сброс, и МК ресетится. Видно это по счётчику времени. Причем время ремонта разное -от 1 до 5 часов. Сейчас работает уже 8.5 часов.
Подскажите пожалуйста где искать, куда копать.

Green
Offline
Зарегистрирован: 01.10.2015

Питание какое? Реле какие? Питаются от чего?

Jeterex
Offline
Зарегистрирован: 26.08.2020

Питание - блок питания 220/12 через 7805, 5 вольт.
Реле - модули, 5воль питание. Реле подключены от 7805 напрямую.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Jeterex пишет:
где искать

Везде.

1. Скетч
2. Питание
3. качество сборки и пропайки
4. Наличие и характер ЭМИ как по линиям, так и по эфиру

Jeterex пишет:
куда копать.

Как всегда, "от забора и до обеда".

Для начала выкладывай сюда

1. схему (полную, с питанием и указанием что именно там используется)
2. скетч (полный, чтобы его можно было просто запустить у себя)
3. фото сборки (на котором всё хорошо видно)
4. описание где и как используется изделие (в чистом поле, в жилом помещении, в заводском цеху, в рабочем помещении ускорителя частиц, в реакторном отсеке АЭС и т.п.)

Без всего этого в теме будет только тыкание пальцем в небо, флуд и стёб.

Jeterex пишет:
Реле - модули, 5воль питание. Реле подключены от 7805 напрямую.
Вот я как раз о том же - какие модули (не поверишь, но они разные бывают) - чего питают, а то может там такие просадки по току ... В общем, не ленись и выкладывай всё подробно.

Green
Offline
Зарегистрирован: 01.10.2015

Jeterex пишет:
Питание - блок питания 220/12 через 7805, 5 вольт. Реле - модули, 5воль питание. Реле подключены от 7805 напрямую.

Я бы посоветовал попробовать без реле. Т.е., исключить их срабатывание и посмотреть на картину.

Jeterex
Offline
Зарегистрирован: 26.08.2020

Фото:

https://drive.google.com/drive/folders/1HPu-72csjsxLhoVU3brgkz2dNsEc4d0I...

Реле:

https://erg.com.ua/p660900736-odnokanalnyj-modul-rele.html

https://erg.com.ua/p660900737-dvuh-kanalnyj-modul.html

модуль MOSFET (транзистор IRF 540 перепаян на IRF 3707, и вынесен на проводах на радиатор с обдувом):

https://erg.com.ua/p660900734-silovoj-modul-mosfet.html

Схемы нету, так как все собиралось "на ходу", в коментариях к коду постарался максимально подробно описать подключения.

ПОЛНЫЙ КОД (прошу прощения, но не нашел как сделать спойлер):

// Version 1.1
// Пример скетча для различных датчиков влажности / температуры DHT

// ТРЕБУЮТСЯ следующие библиотеки Arduino:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor

// полностью автоматический инкубатор, расчитанный на автономную работу на весь период инкубации

// LCD Keyboard shild -  0,1,2,~3,~11,12,13
// №пина ||тип сигнала || цвет провода || назначение
// 0           -
// 1           -
// 2           -             3х жильн         DHT 11
// 3           ~              белый           проветривание
// 11          ~            чорный          нагреватель
// 12          -            красный         увлажнитель
// 13          -              жолтый         переворот

#include "DHT.h"
#include <LiquidCrystal.h>
#define DHTPIN 2                          // Цифровой пин для подключения датчика датчика DHT
#define DHTTYPE DHT11                   // тип подключаемого датчика
#define HEAT 11                        // пин подключения нагревателя
#define MOTOR 13                         // пин подключения реле переворота
#define HUM 12                         // пин подключения реле увлажнителя
#define VENT 3                         // пин подключения реле проветривание

// флаги состояния:
#define START 0
#define OVERHEAT 1
#define UNDERHEAT 2
#define HUMINITY 3
#define COUP 4
#define VENTING 5
#define TIMING 6
#define RESERVED 7

#define COUP_TIME 8

unsigned long last_time;                 // для хранения таймера от старта контроллера
float period = 1000;

float t_in;           // установленная температура
float t;              // измеренная температура
float h_in;           // установленная влажность
float h;              // измеренная влажность

float btn;            // для чтения кнопок
byte pwm = 0;         // значение ШИМ для нагревателя
byte pwm_const = 150; // коэфициент для коректировки ШИМ
byte power;
byte pwm_timer;       // таймер для коректировки ШИМ

byte second;          // секунды
byte minutes;         // минуты
byte hour;            // часы
byte day;             // дни

byte coup = 0;         // время следующего переворота
byte coup_period;      // периодичность переворота в ЧАСАХ
byte coup_timer = 0;   // таймер работы привода

byte venting = 0;       // время следующего проветривания инкубатора (на 3м этапе 2 раза в сутки 15 минут)
byte venting_timer;     // вспомогательный таймер
byte venting_period = 0; // период проветривания в часах
byte v_time;            // время проветривания

byte startCount = 50;   // значение шим для старта
boolean flags = 0;      // флаг состояния


DHT dht(DHTPIN, DHTTYPE);               // Инициализация DHT датчика.

const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  Serial.begin(9600);
  dht.begin();                // инициализация датчика температуры
  lcd.begin(16, 2);           // инициализация монитора
  last_time = millis();

  digitalWrite(HUM, HIGH);    // установка сигнала для реле
  pinMode(HUM, OUTPUT);       // установка пина на выход

  digitalWrite(VENT, LOW);
  pinMode(VENT, OUTPUT);

  digitalWrite(MOTOR, HIGH);
  pinMode(MOTOR, OUTPUT);

  analogWrite(HEAT, 30);        // устанавливаем шим около 10% мощноста
  // для первичного нагрева ламп и увеличения их сопротивления
  lcd.setCursor(2, 0);          // иначе блок питания уходит в защиту
  lcd.print("Pleas wait");
  lcd.setCursor(2, 2);
  lcd.print("cold start");
  delay(5000);                  // ждем 5 секунд, и только после этого запускаем систему
}
void loop()
{
  if (millis() - last_time >= period)
  {
    last_time = last_time + period;
    TIME();           // счетчик времени
    SENSOR();         // чтение датчика
    MONITOR();        // вывод информации на LCD
    PARAMETER();      // чтение параметров инкубации
    HEATER();         // расчет ШИМ для нагревателя  (ШИМ, силовой модуль на MOSFET, транзистор IRF 540 перепаян на IRF 3707, и вынесен на внешний радиатор)
    HUMITING();       // контроль влажности   (модуль реле 1, ультразвуковой испаритель с блоком питания, управление сетевым напряжением)
    COUPING();        // переворот  (модуль реле 1, редукторный привод от микроволновки на 220 вольт)
    VENTING_ON();     // проветривание (модуль реле 2, кулер от блока питания, 12 вольт, первые 8 дней не задействован)
  }
}

void TIME()
{
  second++;
  if (second == 60)
  { second = 0;
    minutes++;
  }
  if (minutes == 60)
  { minutes = 0;
    hour++;
  }
  if (hour == 24)
  { hour = 0;
    day++;
  }


}
void SENSOR()
{
  // Подождите несколько секунд между измерениями.
  // Чтение температуры или влажности занимает около 250 миллисекунд!
  // Показания датчика считываем не чаще чем 1 раз в 2 секунды(это очень медленный датчик)
  h = dht.readHumidity();
  // Чтение температуры в градусах Цельсия (по умолчанию)
  t = dht.readTemperature();
  // Проверить, удалось ли выполнить чтение, и завершить работу раньше (чтобы повторить попытку).

  if (isnan(h) || isnan(t))
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(F("Failed sensor!"));
    return;
  }
}

void MONITOR()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(hour);
  lcd.setCursor(2, 0);
  lcd.print(":");
  lcd.setCursor(3, 0);
  lcd.print(minutes);
  lcd.setCursor(7, 0);
  lcd.print(pwm);

  lcd.setCursor(0, 1);
  lcd.print(t);
  lcd.setCursor(6, 1);
  lcd.print(h);

  lcd.setCursor(13, 1);
  lcd.print(power);


}
void PARAMETER()
{
  switch (day)
  { case 0:
      t_in = 38;
      h_in = 67;
      coup_period = 1;
      venting_period = 0;
      v_time = 0;
      break;
    case 4:
      t_in = 37.5;
      h_in = 55;
      coup_period = 1;
      venting_period = 12;
      v_time = 100;
      break;
    case 8:
      t_in = 37.8;
      h_in = 40;
      coup_period = 5;
      venting_period = 12;
      v_time = 240;
      break;
    case 12:
      t_in = 37.3;
      h_in = 75;
      coup_period = 5;
      venting_period = 8;
      v_time = 180;
      break;
    case 19:
      t_in = 37.8;
      h_in = 60;
      coup_period = 0;
      venting_period = 5;
      v_time = 240;
      break;
  }
}

void HEATER()     // ШИМ
{ pwm_timer++;
  if (t > t_in )                          // если температура больше установленой
  { pwm = 0;                              // выключаем нагреватель
    pwm_const = pwm_const - 1;            // декрементируем константу
    pwm_timer = 0;                        // обнуляем доп таймер
  }
  else if (t == t_in)                     // если температура равна установленой
  { pwm = pwm_const;
    pwm_timer = 0;                        // обнуляем доп таймер
  }
  else if (t_in - t <= 1)                 // если разница температур меньше 1 градуса
  { pwm = ((t_in - t) * 100) + pwm_const; // коректируем ШИМ исходя из разницы температур
  }
  else if (t_in - t > 1)                  // если разница температур больше 1 градуса
  { pwm_const = 150;                      // запускаем нагреватель на полную
    pwm = 100 + pwm_const;
    pwm_timer = 0;                        // обнуляем доп таймер
  }
  power = map(pwm, 0, 250, 0, 120);       // для вывода расчетной мощности нагревателя
  analogWrite(HEAT, pwm );

  if (pwm_timer == 30)                    // если доп таймер превысил 30 секунд
  { pwm_const = pwm_const + 3;            // значит нагреватель не прогревает до установки
    pwm_timer = 0;                        // инкрементируем константу, увеличивая таким образом мощность
  }                                       // и обнуляем таймер
}

void HUMITING()  // реле
{
  if (h < (h_in - 1))
  {
    digitalWrite(HUM, LOW);
    bitSet(flags, HUMINITY);
  }
  else
  {
    digitalWrite(HUM, HIGH);
  }
}

void COUPING()      //  реле
{ if (coup == hour)
  {
    if (coup_period > 0 && coup_timer < 16)
    { digitalWrite(MOTOR, LOW);
      coup_timer++;
    } else if (coup_timer == 16) {
      digitalWrite(MOTOR, HIGH);
      coup = coup + coup_period;
      if (coup >= 24)
      {
        coup = coup - 24;
      }
      coup_timer = 0;
    }
  }
}

void VENTING_ON()       // реле
{ if (venting == hour)
  {
    if (venting_period > 0 && venting_timer < v_time)
    { digitalWrite(VENT, HIGH);
      venting_timer++;
    } else if (venting_timer == v_time) {
      digitalWrite(VENT, LOW);
      venting = venting + venting_period;
      if (venting >= 24)
      {
        venting = venting - 24;
      }
      venting_timer = 0;
    }
  }
}

 

Jeterex
Offline
Зарегистрирован: 26.08.2020

Для справки - время бесперебойной работы перевалило за 13 часов. Вот теперь я вообще ничего не понимаю.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

выше уже писалось - отключить нагрузку, проверить минимум сутки на стабильность

повесить питание релейных модулей на отдельный БП, гальваническая развязка

https://aliexpress.ru/item/32610637345.html

 

Green
Offline
Зарегистрирован: 01.10.2015

Сначала повесить реле на отдельный БП. Или хотя бы на отдельный 7805.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Jeterex пишет:

Схемы нету, так как все собиралось "на ходу", в коментариях к коду постарался максимально подробно описать подключения.

Вот этого не надо. От слова "совсем". Нужна именно схема. Если ее пока нет, мы подождем, пока она появится.

А пока Вы будете рисовать схему, могу посоветовать запитать Ардутну и реле от разных БП и посмотреть, что зменится.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Jeterex пишет:

Схемы нету

Ну, значит, разбирайся сам.

Jeterex пишет:

все собиралось "на ходу"

Ну, это понятно по тому, как оно работает.

 

Jeterex
Offline
Зарегистрирован: 26.08.2020

С 1,00 ночи после последнего сбоя работает стабильно. Никаких изменений не вносилось

Вот схема:

Дополнения:

1 - блок питания 13 вольт 10 ампер

2 - лампа 12 вольт, 60 ватт

Jeterex
Offline
Зарегистрирован: 26.08.2020

Уважаемые Ворота, все ошибаются при освоении новых глубин, и когда нибудь Вы тоже столкнетесь с проблемой, которую сами решить не сможете.

Green
Offline
Зарегистрирован: 01.10.2015

Так проблема ведь у вас! И как помогать вслепую?
Одна лампа 60 вт? А БП по 12-ти 130 вт?
Наиболее вероятно, броски по питанию.
Если нет осциллографа, попробуйте методом исключения.

Jeterex
Offline
Зарегистрирован: 26.08.2020

2 лампы по 60 Вт.
Питание 13 вольт 10 ампер.

Расчетное потребление:
60 Вт /13 вольт = 4.6 Ампера
4.6 × 2 = 9..2 ампера

Мультиметр показал 8.5 Ампер и стабильных 13 вольт как при старте так и во время работы.

Шимом чутка ограничены на старте. После выхода на режим потребляют максимум 30 Вт на двоих. На данный момент вообще вышли на 4 Вт. Броски по питанию были при старте, проблема была решена 5 секундным прогревом на старте.

В начале я не нашел мощного блока питания и ставил два по 5 ампер в параллель, пока не нашел один мощный.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Jeterex, что то мне подсказывает что Вы не слышите что советуют - помехи это самое противное в МК, Вы протестировали без реле? Осциллографом проверили помехи? Нет. Ну и при чем тут БП.

Jeterex
Offline
Зарегистрирован: 26.08.2020

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

9.02, 27.08.20г

14 часов - полет нормальный. Поехал покупать 7805 для отдельного питания реле. Хотя она рассчитана на 1 ампер и должна была потянуть нормально. Но факт остаётся фактом...

Спасибо за совет.