Зависания Arduino Mega

GuentEm

✩✩✩✩✩✩✩
24 Янв 2026
6
0
Доброго времени суток!

Нужна помощь со следующей проблемой. Хотели сделать коптильню, а все управление через ардуино, однако столкнолись с постоянными зависаниями скетча. Чтобы упростить поиск ошибки, все железо было убрано. Осталось только по минимуму:

Сама плата, датчик SHT35, стандартный модуль реле для ардуино и реле для печки на 3кв.

Работает все следующим образом: Каждые 5 секунд на 5 секунд подаются на модуль сигнал, который открывает питание на индустриальное реле, которое запускает печку. Во время отключения печки выполнение программы зависает. Скетч банальный, схема простая до безобразия, но решения так и не могу найти. Если убрать печку и оставить работать реле "в холостую", все работает часами. Как только добавляется печка, все зависает после двух-трех циклов.


Bildschirmfoto 2026-01-23 um 23.23.37.png

Скетч:
#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"

#define HEATER_ONE 22     //PIN for heater one

bool enableHeater = false;
int loopCnt = 0;
bool r_on_off = false;

Adafruit_SHT31 sht31 = Adafruit_SHT31();

void setup() {
  Serial.begin(9600);

  Serial.println("SHT31 test");
  if (! sht31.begin(0x44)) {   // Set to 0x45 for alternate i2c addr
    Serial.println("Couldn't find SHT31");
  }

Wire.setClock(100000);

  Serial.print("Heater Enabled State: ");
  if (sht31.isHeaterEnabled())
    Serial.println("ENABLED");
  else
    Serial.println("DISABLED");

  pinMode(HEATER_ONE, OUTPUT); digitalWrite(HEATER_ONE, HIGH);    //Steam generator
}

unsigned long now_millis = 0;
unsigned long current_millis = 0;

void loop() {

  float t = sht31.readTemperature();
  float h = sht31.readHumidity();

  if (! isnan(t)) {  // check if 'is not a number'
    Serial.print("Temp *C = "); Serial.print(t); Serial.print("\t\t");
  } else {
    Serial.println("Failed to read temperature");
  }
 
  if (! isnan(h)) {  // check if 'is not a number'
    Serial.print("Hum. % = "); Serial.println(h);
  } else {
    Serial.println("Failed to read humidity");
  }

Serial.println("TEST");

  now_millis = millis();

  if(now_millis - current_millis >= 5000){

    if(!r_on_off){     
      digitalWrite(HEATER_ONE, HIGH);    //Steam generator
      r_on_off = true;
    } else {
      digitalWrite(HEATER_ONE, LOW);    //Steam generator
      r_on_off = false;
  }
      current_millis = now_millis;
    }

    

  }
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,932
624
46
И осциллографа у вас конечно же нет, чтобы посмотреть что творится по питанию в момент отключения?
 

poty

★★★★★★★
19 Фев 2020
3,609
1,027
@GuentEm, питание через V-IN, неизвестные реле, возможное отсутствие подавления импульса обратной полярности у индуктивной нагрузки... Соглашусь с @Геннадий П, проблема, скорее, в питании.
Решит ли проблему предложение @SlavaZagaynov ? Наверное, в таком минимальном подключении - решит, но добавление чего-нибудь ещё может снова вызвать ту же проблему.
 

Sana956

★✩✩✩✩✩✩
5 Мар 2022
93
27
@GuentEm, проблема, скорее, в питании.
Проблема скорее всего не в питании. Проблема прилетает по воздуху, а ловят ее провода к датчикам, одновременно выполняющие функцию антенн. В любом случае стоит проверить, запустив ардуину от батареи.
Если твердотельного реле нет, можно попробовать начать с сетевого снаббера.
 

Sana956

★✩✩✩✩✩✩
5 Мар 2022
93
27
Ну напрмер SHT35, указанный автором. Да и к реле D22 тоже подключен проводом, Нет?
И на схеме их есть. D20, D21.
 
Изменено:

EugeneFrol

✩✩✩✩✩✩✩
17 Апр 2024
64
9
50
Да. ТТР должна решить проблему. У них свой снаббер:
1769257762329.png
И к тому же включают нагрузку при переходе фазы через 0. Помех в сети не создают.
 

poty

★★★★★★★
19 Фев 2020
3,609
1,027

@Sana956, SHT35, конечно, датчик, D22 - нет. SHT35 передаёт данные по I2C, который подтянут к положительной шине относительно низкоимпедансными резисторами. Провода идут рядом, сомневаюсь, что помехи способны в них создать на относительно коротких расстояниях существенные дифференциальные помехи, как минимум, приводящие к сбоям МП.
D22 - это реле, судя по способу подключения - имеет либо развязку от цифрового пина, либо включается через транзистор. Наводки на этот провод могут влиять на реле, но не на МП (на цифровой выход).
 

GuentEm

✩✩✩✩✩✩✩
24 Янв 2026
6
0
Доброго времени суток! Благодарю за ответы. ТС никуда не пропал, ТС наконец дотянулся до компа.

Я использую стандартный модуль реле для Arduino (изначально 4-канальный с опторазвязкой). Это реле управляет вторым реле (можно сказать, промышленным, большой мощности). Схему нарисовал на коленке.

Проблема в том, что когда мощный потребитель отключается, Arduino будто теряет связь (даже с ПК). Видно дугу; я пытался с ней бороться, но без особого результата. Пробовал решить это программно, но проблема тогда проявляется не каждые 10 секунд, а в течение пары минут. Конденсатор на питании результата не дает, из чего я сделал вывод, что дело не в питании.

Сбой всегда происходит перед чтением датчика по I2C либо OneWire (которого в схеме нет). В одной из версий я добавил «прочистку» I2C — проблема стала появляться реже, но не исчезла.

В целом такое ощущение, что при размыкании контактов чувствительные пины «забиваются».

Что касается чтения датчиков, это тестовый код (причем оригинальный, как автор библиотеки его предоставляет). Если читать каждые 2-5 секунд, то проблема встречается реже, но встречается.

По поводу твердотельных реле, то я тоже расматриваю данный вариант, но в крайнем случаи. Хотелось бы понять в чем в целом проблема. Неужели ардуино на столько чувствительная плата?
 

GuentEm

✩✩✩✩✩✩✩
24 Янв 2026
6
0
@SlavaZagaynov, в печке есть двигатель - асихронный на 30 ватт, но основной потребитель это ТЭН на 3кв.
 

SlavaZagaynov

★✩✩✩✩✩✩
27 Ноя 2019
236
42
www.youtube.com
@GuentEm, раскрученный электродвигатель после обесточивания превращается в генератор и стреляет молниями 😀. Твердотельное реле поможет. Сам мучался с вентиляторами вентиляции и насосами рециркуляции гвс на esp32.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,932
624
46
раскрученный электродвигатель после обесточивания превращается в генератор и стреляет молниями 😀
Асинхронные и с электромагнитом на роторе не генерируют. Но это не означает что они не имеют реактивную ЭДС. :rolleyes:

Конденсатор на питании результата не дает,
Какой конденсатор? Куда подключали физически? Что с экранированием (нормальным, а не пару слоев непонятной алюминиевой фольги)?
 

IgorNV

✩✩✩✩✩✩✩
4 Янв 2026
6
0
@GuentEm,
попробуйте снабберы на контактах реле работающих с индуктивной нагрузкой. Для начала 0.1мкФ 350В последовательно с резистором 100Ом. +-трамвай.
 

GuentEm

✩✩✩✩✩✩✩
24 Янв 2026
6
0
@SlavaZagaynov, наврятли двигатель на 30 ватт будет создавать такую серьезную обратку. 🤷‍♂️

@Геннадий П, Подключал к питанию самой платы, ибо было предположение, что проседает питание. Подключал 470микро и паралельно еще на 100 нано. Провода с экранированием пробовал, но только частично, на датчики.

@IgorNV, уже пробовал, у меня дома как раз на 100 нано валялись, но не помогло.Гдето вычитал, что на 3кв нужно на 220 нано брать конденсатор.. но я еще не пробовал

И осциллографа у вас конечно же нет, чтобы посмотреть что творится по питанию в момент отключения?
кстати, еще не пробовал. Но сегодня закажу и завтра ужу проверю.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,932
624
46
наврятли двигатель на 30 ватт будет создавать такую серьезную обратку.
Может, еще как может. Дело не в мощности, а в индуктивности.

и паралельно еще на 100 нано
Надеюсь, керамика?

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

GuentEm

✩✩✩✩✩✩✩
24 Янв 2026
6
0
Изза отсуствия времени, только сегодня смог поэксперементировать. Короче, проблему создает двигатель. Я полностью отключил ТЭНы и начал запускать только двигатель. Повесил на контакты самый дешманский снаббер и проблемы как будто и не было. Отключил снаббер - тут же зависание.

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

Всем большое спасибо за помощь и идеи!
 

SlavaZagaynov

★✩✩✩✩✩✩
27 Ноя 2019
236
42
www.youtube.com
@GuentEm, А снаббер это что такое? Это как твердое реле? Если нет, то можно мне схему снаббера. Ну и .... "я же говорил" .... Я не просто так тебя сразу спрашивал, есть ли в нагрузке двигатель. 😉
 
Изменено:

poty

★★★★★★★
19 Фев 2020
3,609
1,027
Snubber (снаббер) — устройство, которое подавляет определённые явления, например, перепады напряжения в электрических системах, перепады давления в системах с жидкостями или избыточные силы или быстрые движения в механических системах.
 

GuentEm

✩✩✩✩✩✩✩
24 Янв 2026
6
0
@GuentEm, А снаббер это что такое? Это как твердое реле? Если нет, то можно мне схему снаббера. Ну и .... "я же говорил" .... Я не просто так тебя сразу спрашивал, есть ли в нагрузке двигатель. 😉


Вот, базавая схема. Обычно еще варистор стоит паралельно контактам. Единственное, нужно правильно подобрать компоненты. Простые китайские, что продают, для мощностей не более 1кв. Но выше по теме есть ссылки, где подробнее эта тема поднимается.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,932
624
46
@SlavaZagaynov, Номиналы снаббера рассчитываются под конкретное устройство. Первый попавшийся снаббер может не работать как нужно.
 

SlavaZagaynov

★✩✩✩✩✩✩
27 Ноя 2019
236
42
www.youtube.com
@Геннадий П, кстати, идея эксперимента ролилася.
А фто будет если включать и выключать нагрузку типа мотора, {от которого ардуина зависает} через реле не напрямую, а через сетевой фильтр-удлинитель с варистором внутри? Как думаешь теоретически поможет это от зависания?
Есть у меня один древний фильтр "дефендер", он должен быть со схемой защиты от перегрузок и повышенного напряжения, думаю и снабер там тоже есть.