Светодиодная лента не реагируют на команды при подключение через Ethernet shield

Реализую свой проект, подключил к ардуино уно Ethernet shield, к шилду подключил адресную светодиодную ленту. При помощи шилда подключаю ардунино к wi-fi.
Пользователь отправляет на ардуино json файл в котором указаны диоды которые должны быть подсвечены. Но почему-то лента не хочет работать
Помогите разобраться в чем проблема

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <ArduinoJson.h>
#include <FastLED.h>

// Настройки Ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);
EthernetServer server(80);

// Настройки LED
#define LED_PIN 6
#define LED_COUNT 40
CRGB leds[LED_COUNT];

// Размер буфера для JSON
const int CONFIG_SIZE = 512;

void setup() {
  // Инициализация Ethernet
  Serial.begin(9600);
  while (!Serial) { ; }

  Ethernet.begin(mac, ip);
  Serial.println("Ethernet подключен");
  Serial.print("IP address: ");
  Serial.println(Ethernet.localIP());

  // Запускаем сервер
  server.begin();
  Serial.println("Сервер запущен");

  // Инициализация LED
  FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, LED_COUNT);
  for (int i = 0; i < LED_COUNT; i++) {
    leds[i] = CRGB::Black;
  }
  FastLED.show();
}

void loop() {
  EthernetClient client = server.available();
  if (client) {
    Serial.println("Новый клиент подключен");

    String currentLine = "";
    String requestBody = "";
    boolean isPostRequest = false;

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (c == '\n' && currentLine.length() == 0 && isPostRequest) {
          while (client.available()) {
            requestBody += client.read();
          }
          break;
        }

        if (c == '\n') {
          if (currentLine.startsWith("POST")) {
            isPostRequest = true;
          }
          currentLine = "";
        } else if (c != '\r') {
          currentLine += c;
        }
      }
    }

    if (isPostRequest && requestBody.length() > 0) {
      Serial.println("Получено тело POST-запроса:");
      Serial.println(requestBody);

      DynamicJsonDocument doc(CONFIG_SIZE);
      DeserializationError error = deserializeJson(doc, requestBody);
      if (error) {
        Serial.print(F("Ошибка парсинга JSON: "));
        Serial.println(error.f_str());
        client.println("HTTP/1.1 400 Bad Request");
        client.println("Content-Type: text/plain");
        client.println();
        client.println("Invalid JSON");
      } else {
        processLEDCommands(doc);
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/plain");
        client.println();
        client.println("LED command processed");
      }
    } else {
      client.println("HTTP/1.1 405 Method Not Allowed");
      client.println("Content-Type: text/plain");
      client.println();
      client.println("Only POST method is allowed");
    }

    client.stop();
    Serial.println("Клиент отключен");
  }
}

// Функция для обработки команд управления светодиодами
void processLEDCommands(DynamicJsonDocument& doc) {
  for (int i = 1; i <= 4; i++) {
    String key = "op" + String(i);
    if (doc.containsKey(key)) {
      JsonArray array = doc[key];
      for (JsonVariant value : array) {
        String command = value.as<String>();
        if (command.startsWith("A-1-")) {
          int ledIndex = command.substring(4).toInt() - 1;
          if (ledIndex >= 0 && ledIndex < LED_COUNT) {
            switch (i) {
              case 1:
                leds[ledIndex] = CRGB::White;
                break;
              case 2:
                leds[ledIndex] = CRGB::Red;
                break;
              case 3:
                leds[ledIndex] = CRGB::Blue;
                break;
              case 4:
                leds[ledIndex] = CRGB::Green;
                break;
            }
          }
        }
      }
    }
  }

  if (doc.containsKey("off")) {
    JsonArray array = doc["off"];
    bool allOff = false;
    for (JsonVariant value : array) {
      String command = value.as<String>();
      if (command == "ALL") {
        allOff = true;
        break;
      }
      if (command.startsWith("A-1-")) {
        int ledIndex = command.substring(4).toInt() - 1;
        if (ledIndex >= 0 && ledIndex < LED_COUNT) {
          leds[ledIndex] = CRGB::Black;
        }
      }
    }
    if (allOff) {
      for (int i = 0; i < LED_COUNT; i++) {
        leds[i] = CRGB::Black;
      }
    }
  }

  if (doc.containsKey("on")) {
    JsonArray array = doc["on"];
    bool allOn = false;
    for (JsonVariant value : array) {
      String command = value.as<String>();
      if (command == "ALL") {
        allOn = true;
        break;
      }
    }
    if (allOn) {
      for (int i = 0; i < LED_COUNT; i++) {
        leds[i] = CRGB::White;
      }
    }
  }

  FastLED.show();
}

Начните со схемы, включая источник/и питания

Питания ленты к 5в, землю к земле, логику к 6 пину

Питаю от юсб 3.0

Один светодиод кушает до 60 мА. 40 могут кушать до 2.4 А, в то время как USB 3.0 обеспечивает только 0.9 А, что почти втрое меньше.
Начните с того, что запитать ленту от трехамперного блока питания.

Вот и проверяйте, приходят ли на ленту плюс и минус, и звонится ли управляющий вход ленты на управляющий пин ардуины. Может на шилде этот пин на что другое занят

Неплохо бы расшифровать, что это значит?
В зависимости от ответа на этот вопрос дальнейшее может быть не совсем актуально, но просятся две очевидные проверки.

  1. Можете ли Вы без всякой передачи данных извне зажечь определённые, прописанные прямо в скетче диоды?
  2. Вы много чего в сериал выводите, кроме самого нужного - собственно полученных номеров светодиодов. Может там фигня полная?

@Kvant
Вы свой Json сохраняете дважды - один раз в String, а потом в буфер 512 байт… Да плюс ещё эзернет библиотека… И Фастлед…
вы не забыли, что на Уно всего 2к памяти?

прозваниваются

Сейчас я вручную отправляю данные в монитор порта
вот такое :
{
“op1”: [“A-1-1”, “A-1-2”],
“op2”: [“A-1-3”]
}

Но я же не все сразу зажигаю

но до отправки значений в монитор порта приходит
Ethernet подключен
19:29:22.802 → IP address: 192.168.1.177
19:29:22.921 → Сервер запущен

Глобальные переменные используют 1075 байт (52%) динамической памяти, оставляя 973 байт для локальных переменных. Максимум: 2048 байт.

Сделал так диоды не зажглись

#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <ArduinoJson.h>
#include <FastLED.h>

// Настройки Ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Замените на свой MAC-адрес
IPAddress ip(192, 168, 1, 177); // Установите статический IP
EthernetServer server(80); // Порт для веб-сервера

const int CONFIG_SIZE = 512; // Размер буфера для JSON

// Настройки светодиодной ленты
#define DATA_PIN    6 // Пин, к которому подключена лента
#define LED_TYPE    WS2812B // Тип светодиодов
#define COLOR_ORDER GRB // Порядок цветов
#define NUM_LEDS    3 // Количество светодиодов на ленте
CRGB leds[NUM_LEDS];

void setup() {
  // Начинаем последовательную связь
  Serial.begin(9600);
  while (!Serial) {
    ; // Ждем, пока не будет готов серийный порт
  }

  // Запуск Ethernet с фиксированным IP
  Ethernet.begin(mac, ip);
  Serial.println("Ethernet подключен");
  Serial.print("IP address: ");
  Serial.println(Ethernet.localIP());

  // Запускаем сервер
  server.begin();
  Serial.println("Сервер запущен");

  // Инициализация светодиодной ленты
  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(64);
  FastLED.clear();
  FastLED.show();

  // Включаем три первых светодиода
  leds[0] = CRGB::Red;
  leds[1] = CRGB::Green;
  leds[2] = CRGB::Blue;
  FastLED.show();
}

void loop() {
  // Ожидание клиента
  EthernetClient client = server.available();
  if (client) {
    Serial.println("Новый клиент подключен");

    String currentLine = ""; // Сохранение данных от клиента
    String requestBody = "";
    boolean isPostRequest = false;

    // Чтение данных от клиента
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        // Проверка на POST-запрос
        if (c == '\n' && currentLine.length() == 0 && isPostRequest) {
          // После заголовков идет тело запроса
          while (client.available()) {
            char bodyChar = client.read();
            requestBody += bodyChar;
          }
          break;
        }

        // Проверка на конец строки
        if (c == '\n') {
          if (currentLine.startsWith("POST")) {
            isPostRequest = true; // Указываем, что это POST-запрос
          }
          currentLine = "";
        } else if (c != '\r') {
          currentLine += c;
        }
      }
    }

    // Обработка POST-запроса
    if (isPostRequest && requestBody.length() > 0) {
      Serial.println("Получено тело POST-запроса:");
      Serial.println(requestBody);

      // Обработка JSON
      DynamicJsonDocument doc(CONFIG_SIZE);
      DeserializationError error = deserializeJson(doc, requestBody);
      if (error) {
        Serial.print(F("Ошибка парсинга JSON: "));
        Serial.println(error.f_str());
        client.println("HTTP/1.1 400 Bad Request");
        client.println("Content-Type: text/plain");
        client.println();
        client.println("Invalid JSON");
      } else {
        serializeJsonPretty(doc, Serial); // Вывод JSON в консоль
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/plain");
        client.println();
        client.println("Configuration data saved");
      }
    } else {
      // Отправляем ответ клиенту (если запрос не POST)
      client.println("HTTP/1.1 405 Method Not Allowed");
      client.println("Content-Type: text/plain");
      client.println();
      client.println("Only POST method is allowed");
    }

    // Закрываем соединение с клиентом
    client.stop();
    Serial.println("Клиент отключен");
  }
}

Уберите ленту, проверьте получится ли управлять светодиодом на 13 пине?

1 лайк