Прошу помощи в отладке Arduino Mega 2560

@BABOS , ты даже не нашел шутку, которую я сотворил в одном из скетчей. Поэтому делаю вывод, что ты даже не смотрел код.

Вот она.

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

А может просто лентяй?

Бинго!!! :sweat_smile:

однозначно лентяй! но все таки код не смотрю потому что не уверен что вы зайдете слишком далеко… или что это поможет…
более того может показаться что глумлюсь над вами, но я просто задаю уточняющие вопросы,(которые может помогут и вам) а потом может подключусь, делать все одному тяжко, но легче, чем объяснять))) но если справитесь, выведи те развитие проекта на esp на новый уровень, добавив какую то ясность может быть, что можно в конце получить… будите мега человечищем!)))

я просто пока что не понимаю что вы делаете…

Напомню, что ТС планировал запустить свою самоделку к этому отопительному сезону. Последние 100 сообщений заставляют сильно сомневаться. Осталось месяц-полтора, а он к реальным испытаниям даже не приступал. С одним только кодом 4 месяца возился и еще не закончил. А отладка на железе и борьба с помехами - это куда сложнее написания первоначального кода.

Думаю обсуждения переезда на ЕСП32 или Расбери Пико в этой ситуации не имеют никакого отношения к реальности.

щас его еще в ассемблер затащут и тада точно замерзнет.

И с его тупого жала сочился свежий Йад)))
Это “дривероф” атрят, чистый тополь-дерево.

По датаЩам от 3 до 5.5 должны работать…
Кто с вас прав… Даллас врет? Ау?

Проблема в том, что на форуме мало специалистов, которые не подсказчики, а реально сами делают и могут спланировать работа. А для некоторых - пример того, как код писать, который можно продать. Мне еще всегда интересно - а многие ли реально работали с различными схемными решениями? Я не упоминаю 485-го владыку @WladDrakula , поскольку он бы явно помог в решении связи нано и меги. И опыт подобного решения с мешалкой никто не вспомнил, а там просто скорость передачи снизили. Я начинал, когда уходили лампы и уже появились транзисторы, а чуть позже микросборки и микросхемы. В то время было много разных решений передачи сигналов от всяких датчиков, как бороться с помехами и т.д. Если вы уж взялись делать железку, а она вдруг при прикосновении пальцем умирает, то наверно стоит задуматься - почему так?

Тут некоторые хотели поучаствовать, но похоже слились в ожидание решения… Ну да ладно. Это будет пример выполнения кода. Весь код будет написан ИИ, который я буду направлять.

Мне нужно начинать с простейшего
Проблем, связанных именно с передачей данных - выявлено на практике не было.
Весной - система поработала. В общем-то - поработала… под конец прохладной погоды - она могла успешно работать примерно на протяжении суток.
По моим предположениям - те проблемы, которые были тогда - связаны былим с тем, что сильноточные цепи находились близко к контроллеру, а также длинная линия от датчиков, вдоль силовых проводов. В этом направлении и двинулся - расположил контроллер nano так - чтобы он был подальше от силовых линий, поближе к датчикам. Но - в неудобном месте в плане доступа - то есть, дисплей там не расположить.
В связи с тем, что дисплей нужен в удобном месте доступа - и появилась линия связи RX/TX. Но к данному моменту - ещё не удалось выяснить, насколько подвержена сбоям эта линия. BABOS вообще говорил о том, что проверку CRC именно для передачи данных - возможно, делать не стоит. Вероятность ошибок не велика.
Сейчас упоминается “485” - я так понимаю, речь о передаче данных RS485. Возможно - это избыточно, возможно оно не потребуется, возможно - нормально отработает RX/TX.
Я на оборудование, типа насосы, компрессор - потратил гораздо больше денег, чем на то, что касается Ардуино. В этом плане - не зазорно купить очередную относительно недорогую плату типа ESP32, или что ещё тут советуют. Но проблема в том - что эти платы - это даже не 10% решения проблемы, на мой взгляд. Главное понимать - для чего оно, и как с ними работать. Как писать код.

А я вот, например - до сих пор так и не смог понять, чем появление ESP32 будет отличать работу системы от, например - nano, Mega. Много памяти… два ядра… Вай-Фай… - моей голове не понятно - какие реально это даёт преимущества?
А вот ответ “Алисы” на вопрос чем отличается nano от ESP32 … кроме прочего “ESP32 менее надёжна в работе чем nano” - вот это мне понятно. И это для меня - перечёркивает с лихвой всё остальное.

Я написал код для nano (по сути - скопировав код BABOS, указывал выше, выкладывал).
Сейчас делаю для Mega, аналогично.
Затем - буду пытаться грузить их в микроконтроллеры и пытаться налаживать их работу.
Да, - это будет не быстро. Это будет неказисто. Но это будет - с моим собственным пониманием. А это - гораздо важнее всего остального. Ведь эксплуатировать мне. И когда возникнет большая проблема - тех из форумчан в этой ветке, что сейчас активно помогают в составлении кодов - может не оказаться тут.

тебе никаких. А вот у некоторых вавка в голове, что у каждого девайся, включая унитазный бачок, должен быть вифи и веб-страничка. Иначе это говно, а не проект, так ведь?

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

Делириум тременс! Ну, или в процессе :grinning_face:
“А выпить музыканту нужно литров пять,
Чтобы хотя бы в ноты немного попадать.”(с)

больше памяти если что, должно хватить на все,(если проект будет и дальше улучшаться, и будет куча условий автоматизации и проверок)

не надо собирать половину модулей, и искать проблемы в них)))

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

наверное лишняя там esp32, но если вы и дальше будите что то там добавлять, то лучше ее взять, потому что мне кажется тогда все советы по улучшению написания вашего кода вам будет сложно понять, (если будет память, код не фига не экономно сможет выдать ии может, где много чего будет учтено ) или надо наоборот упрощать код… а если есть желание еще что то добавлять в проект, то лучше уже брать и делать на esp32

вообще наверное каждый совет полезен по своему, они делятся опытом, не факт что он окажется полезным для вас, вы нас слушайте конечно, но решайте сами, а как ориентироваться в советах, и какие не очень полезны именно для вас, понятия не имею)))

если у Diskless получится зайти дальше чем мне, понять ТЗ и скинуть уже что то более готовое, больше чем основа, возможно стоит вернуться к вопросу esp32)))

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

в целом не очень хорошая идея собирать на ардуино вообще, а купить готовое, вообще на всякий, но иногда авось работает!)))

ну и так же есть курс https://xn–18-6kcdusowgbt1a4b.xn–p1ai/%D1%80%D0%BE%D0%B1%D0%BE%D1%82%D0%BE%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0-%D0%B0%D1%80%D0%B4%D1%83%D0%B8%D0%BD%D0%BE/ при повторении которого (даже если вам кажется что вы знаете что будет лучше повторить каждый проект) станет понятно что такое ардуино…

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

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

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <HTTPClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// ==========================================
// 1. НАСТРОЙКИ ДЛЯ КЛИЕНТА (ИСПРАВИТЬ ПРИ ПРОШИВКЕ)
// ==========================================
const char* ssid     = "Ваша_Сеть_WiFi";
const char* password = "Ваш_Пароль";

const char* target_ip = "192.168.1.100"; // IP-адрес Модуля 2 (Панели)
const int target_port = 80;               // Порт Модуля 2
const char* target_path = "/update"; 
// ==========================================

// Пины для 3-х линий датчиков DS18B20
const int BUS_1_PIN = 15;
const int BUS_2_PIN = 4;
const int BUS_3_PIN = 16;

// Пины управления силовыми выходами
const int PIN_TEN_1   = 17;
const int PIN_TEN_2   = 18;
const int PIN_PUMP_1  = 19;
const int PIN_PUMP_2  = 21;
const int PIN_PUMP_3  = 22;
const int PIN_PUMP_4  = 23;
const int PIN_FAN     = 25;

// Массив пинов для удобного перебора при управлении
const int RELAY_PINS[] = {PIN_TEN_1, PIN_TEN_2, PIN_PUMP_1, PIN_PUMP_2, PIN_PUMP_3, PIN_PUMP_4, PIN_FAN};

// --- ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ ДЛЯ СОГЛАСОВАНИЯ КОМАНД ---
int targetRelayStates[7] = {0, 0, 0, 0, 0, 0, 0}; // Массив для хранения принятых состояний реле
volatile bool newCommandReceived = false;         // Флаг того, что пришла новая команда от Модуля 2

OneWire oneWire1(BUS_1_PIN);
OneWire oneWire2(BUS_2_PIN);
OneWire oneWire3(BUS_3_PIN);

DallasTemperature sensors1(&oneWire1);
DallasTemperature sensors2(&oneWire2);
DallasTemperature sensors3(&oneWire3);

AsyncWebServer server(80);

unsigned long lastSendTime = 0;
const unsigned long sendInterval = 60000; 

// HTML-страница панели мониторинга
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Мониторинг и Управление</title>
    <style>
        body { font-family: Arial, sans-serif; background-color: #f4f6f9; color: #333; text-align: center; padding: 20px; }
        .container { max-width: 500px; margin: 0 auto; background: white; padding: 20px; border-radius: 10px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); }
        h1 { color: #2c3e50; font-size: 20px; margin-bottom: 25px; }
        .bus-title { font-weight: bold; color: #3498db; text-align: left; margin-top: 15px; border-bottom: 2px solid #3498db; padding-bottom: 3px; }
        .sensor { display: flex; justify-content: space-between; padding: 10px 0; font-size: 1.1em; border-bottom: 1px solid #eee; }
        .temp { font-weight: bold; color: #e74c3c; }
    </style>
</head>
<body>
    <div class="container">
        <h1>Панель датчиков температуры</h1>
        
        <div class="bus-title">Линия 1 (GPIO15)</div>
        <div class="sensor"><span>Датчик 0:</span> <span class="temp" id="t0">%TEMP_0%</span> &deg;C</div>
        <div class="sensor"><span>Датчик 1:</span> <span class="temp" id="t1">%TEMP_1%</span> &deg;C</div>
        <div class="sensor"><span>Датчик 2:</span> <span class="temp" id="t2">%TEMP_2%</span> &deg;C</div>

        <div class="bus-title">Линия 2 (GPIO4)</div>
        <div class="sensor"><span>Датчик 3:</span> <span class="temp" id="t3">%TEMP_3%</span> &deg;C</div>
        <div class="sensor"><span>Датчик 4:</span> <span class="temp" id="t4">%TEMP_4%</span> &deg;C</div>
        <div class="sensor"><span>Датчик 5:</span> <span class="temp" id="t5">%TEMP_5%</span> &deg;C</div>

        <div class="bus-title">Линия 3 (GPIO16)</div>
        <div class="sensor"><span>Датчик 6:</span> <span class="temp" id="t6">%TEMP_6%</span> &deg;C</div>
        <div class="sensor"><span>Датчик 7:</span> <span class="temp" id="t7">%TEMP_7%</span> &deg;C</div>
        <div class="sensor"><span>Датчик 8:</span> <span class="temp" id="t8">%TEMP_8%</span> &deg;C</div>
        <div class="sensor"><span>Датчик 9:</span> <span class="temp" id="t9">%TEMP_9%</span> &deg;C</div>
    </div>

    <script>
        function refreshTemp(id, bId) {
            fetch('/get?id=' + bId)
                .then(response => response.text())
                .then(text => { document.getElementById(id).innerHTML = text; });
        }
        function updateAll() {
            refreshTemp('t0', '0'); refreshTemp('t1', '1'); refreshTemp('t2', '2');
            refreshTemp('t3', '3'); refreshTemp('t4', '4'); refreshTemp('t5', '5');
            refreshTemp('t6', '6'); refreshTemp('t7', '7'); refreshTemp('t8', '8'); refreshTemp('t9', '9');
        }
        setInterval(updateAll, 5000);
    </script>
</body>
</html>
)rawliteral";

String readSensorString(int id) {
  float t = DEVICE_DISCONNECTED_C;
  if (id >= 0 && id <= 2) { sensors1.requestTemperatures(); t = sensors1.getTempCByIndex(id); } 
  else if (id >= 3 && id <= 5) { sensors2.requestTemperatures(); t = sensors2.getTempCByIndex(id - 3); } 
  else if (id >= 6 && id <= 9) { sensors3.requestTemperatures(); t = sensors3.getTempCByIndex(id - 6); }
  if (t == DEVICE_DISCONNECTED_C || t < -50.0) return "0.0";
  return String(t, 1);
}

String processor(const String& var) {
  if (var == "TEMP_0") return readSensorString(0);
  if (var == "TEMP_1") return readSensorString(1);
  if (var == "TEMP_2") return readSensorString(2);
  if (var == "TEMP_3") return readSensorString(3);
  if (var == "TEMP_4") return readSensorString(4);
  if (var == "TEMP_5") return readSensorString(5);
  if (var == "TEMP_6") return readSensorString(6);
  if (var == "TEMP_7") return readSensorString(7);
  if (var == "TEMP_8") return readSensorString(8);
  if (var == "TEMP_9") return readSensorString(9);
  return String();
}

// Функция обработки пришедшей команды (выполняет физическое переключение пинов)
void processRelayCommands() {
  Serial.println("Выполнение логики управления силовыми выходами...");
  for (int i = 0; i < 7; i++) {
    digitalWrite(RELAY_PINS[i], targetRelayStates[i] == 1 ? HIGH : LOW);
  }
}

void setup() {
  Serial.begin(115200);
  
  for (int i = 0; i < 7; i++) {
    pinMode(RELAY_PINS[i], OUTPUT);
    digitalWrite(RELAY_PINS[i], LOW);
  }

  sensors1.begin();
  sensors2.begin();
  sensors3.begin();

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) { delay(500); }
  Serial.print("IP-адрес платы исполнителей: ");
  Serial.println(WiFi.localIP());

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });

  server.on("/get", HTTP_GET, [](AsyncWebServerRequest *request){
    if (request->hasParam("id")) {
      int id = request->getParam("id")->value().toInt();
      request->send(200, "text/plain", readSensorString(id));
    } else {
      request->send(400, "text/plain", "Bad Request");
    }
  });

  // СОГЛАСОВАНО: Прием CSV-строки и сохранение параметров в общей области
  server.on("/update", HTTP_POST, [](AsyncWebServerRequest *request){}, NULL, 
    [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) {
      
      String body = "";
      for (size_t i = 0; i < len; i++) { body += (char)data[i]; }
      body.trim();

      int startIdx = 0;
      for (int i = 0; i < 7; i++) {
        int nextComma = body.indexOf(',', startIdx);
        String valStr = (nextComma == -1) ? body.substring(startIdx) : body.substring(startIdx, nextComma);
        valStr.trim();
        
        if (valStr.length() > 0) {
          targetRelayStates[i] = valStr.toInt(); // Сохраняем состояние в общую глобальную переменную
        }
        
        if (nextComma == -1) break;
        startIdx = nextComma + 1;
      }
      
      newCommandReceived = true; // Устанавливаем флаг поступления новой команды
      request->send(200, "text/plain", "OK");
  });

  server.begin();
}

void loop() {
  // Проверяем флаг поступления новой команды управления реле
  if (newCommandReceived) {
    newCommandReceived = false; // Сбрасываем флаг перед обработкой
    // вызов функции обработки пришедшей команды
    processRelayCommands();
  }

  // Отправка CSV-температур на Модуль 2 раз в минуту
  if (millis() - lastSendTime >= sendInterval) {
    lastSendTime = millis();
    if (WiFi.status() == WL_CONNECTED) {
      HTTPClient http;
      String url = "http://" + String(target_ip) + ":" + String(target_port) + String(target_path);
      
      String payload = "";
      for (int i = 0; i < 10; i++) {
        payload += readSensorString(i);
        if (i < 9) payload += ",";
      }

      http.begin(url);
      http.addHeader("Content-Type", "text/plain");
      int httpResponseCode = http.POST(payload);
      
      if (httpResponseCode > 0) {
        Serial.print("Успешная отправка температур. Код: "); Serial.println(httpResponseCode);
      } else {
        Serial.print("Ошибка отправки температур: "); Serial.println(http.errorToString(httpResponseCode).c_str());
      }
      http.end();
    }
  }
}

Попробую рассказать. Вкратце.
В 2021 году я, под руководством тогдашнего моего коллеги - понадёргал код (кусочки кодов). В том числе - обращался сюда на форум ардуино (ещё старая версия форума). Тогда мне удалось организовать работу и всё успешно работало. Принцип был такой же - nano собирала значения от датчиков (только температуры, 4 шт.), передавала их по RX/TX на UNO. А UNO в свою очередь - передавала на nano битовую маску для реле. Но реле - было 6 шт. Всё это проработало, получается, более 5 лет. Успешно. Из исполнительных органов были: два ТЭНа (через контакторы), электропривод шарового крана, три насоса.
Но наступила эта зима… я решился попробовать соорудить так называемый “тепловой насос”. По сути - это кондиционер работающий на тепло, но греет не воздухом - а подаёт горячую воду в батареи.
Короче говоря - с “железом” теплового насоса (наружный блок, теплообменник и др.) - мне удалось сладить. Для первой работы - я выдрал плату управления из внутреннего блока штатного (который у меня сейчас валяется ненужным) и подключил его. То есть - автоматика была штатная. И это устройство - работало, кое-как, параллельно с моей старой системой (отдельно, независимо). Но со штатной кондиционерной платой автоматики - эффективность этой штуковины была сомнительной. Реально получалось тепла - в полтора раза больше чем потребление электричества. Это мало, это неэффективно.
И вот тут я и возомнил… вспомнил “себя ардуинщика” пять лет назад. И купил Mega с дисплеем. Думал - за пару месяцев накидаю код и всё будет зашибись.
Понатукал датчиков температуры, убрал штатную кондиционерную плату управления и начал пытаться управлять с Mega… При этом - Mega с дисплеем располагалась рядом с силовыми проводами. Промучился больше месяца. Ничего не получилось… - а именно сталкивался с различными сбоями по части Mega. Обратился сюда. Постепенно, начиная с питания Mega - удалось с помощью форумчан наладить так, чтобы всё работало, повторюсь, в конце - в течение примерно суток, без сбоев.
Так вот, та ситуация “часто отваливается при срабатывании соленоида” - была тогда, когда всё что связано с тепловым насосом - управлялось контроллером Mega. Отваливалась Mega.
А nano в связке с UNO - продолжали работать параллельно, не связано, в старом режиме, без сбоев.
Теперь же у меня задача - объединить эти две системы (старый обогрев и новый - с тепловым насосом).

Тут у меня есть понимание, поскольку с другом занимался ими. А случаем коллегу Вашего не Иваном звали?