Зависания Arduino Mega

GuentEm

✩✩✩✩✩✩✩
24 Янв 2026
4
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,926
622
46
И осциллографа у вас конечно же нет, чтобы посмотреть что творится по питанию в момент отключения?
 

poty

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

Sana956

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

Sana956

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

EugeneFrol

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

poty

★★★★★★★
19 Фев 2020
3,593
1,026

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

GuentEm

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

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

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

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

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

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

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

GuentEm

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

SlavaZagaynov

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

Геннадий П

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

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

IgorNV

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

GuentEm

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

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

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

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

Геннадий П

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

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

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