Задача понятна. Таблицу, по которой нужно зажигать светодиоды на приемнике, вы не приложили. Ниже даю детальное решение-ориентир и готовые шаблоны кода, которые можно быстро адаптировать под вашу таблицу. После того как вы пришлёте саму таблицу, я подгоню код под конкретные значения.
- Что важно учесть по электрике
- Упит (питание цепи) = 5 В, Uсв (передовое напряжение светодиодов) ≈ 3 В.
- Светодиоды требуют ограничения тока. При прямом подключении к микроконтроллеру без резистора светодиоды быстро перегреются.
- Расчёт резистора: R = (Vпит - Vf_LED) / I_LED.
- Если I_LED ≈ 10 мА: R ≈ (5 - 3) / 0.010 = 200 Ω → используем 220 Ω.
- Если I_LED ≈ 5 мА: R ≈ (5 - 3) / 0.005 = 400 Ω → можно 390–470 Ω.
- Подключение: анод светодиода через резистор к выходному пину приемника, катод к GND. Общий нуль с передатчиком.
- По возможности используйте транзистор/оптрон для большего тока или чтобы исключить перегрузку выхода микроконтроллера. Но для 4 LED по 5–10 мА каждый прямого тока от выводов может быть достаточно, если суммарный ток не превышает допустимый.
- В каком формате может быть ваша задача
- В общем случае передатчик посылает пакет данных (один или несколько байт). Приемник получает код и подаёт на светодиоды соответствующую схему включения.
- Таблица обычно задаёт соответствие между получаемым кодом и состоянием каждого светодиода (например: код 0x01 — LED1, 0x02 — LED2, 0x04 — LED3, 0x08 — LED4; 0x0F — все включены и т.д.).
- Я дам два шаблона кода: A) простой битовый маск-режим: принял один байт, каждый бит управляет своим светодиодом. B) таблица соответствий: код из передачи ищется в таблице и устанавливает светодиоды по заранее заданной схеме.
- Готовые шаблоны кода (Arduino) Важно: замените константы и таблицу под вашу задачу, как только пришлёте таблицу.
A) Вариант 1: приемник получает один байт-маску (бит 0 → LED1, бит 1 → LED2, бит 2 → LED3, бит 3 → LED4) Это удобно, если ваша таблица соответствует простой битовой маске.
Шаблон приемника (Arduino) с использованием радиопередатчика 433 МГц и библиотеки RH_ASK
- Подключение светодиодов: D2, D3, D4, D5 через резисторы 220 Ω к GND.
- Точно так же подключите приемник RF модуля к пинам RX/TX приемника в зависимости от вашей библиотеки (ниже пример под RH_ASK).
Код приемника:
#include <RH_ASK.h> #include <SPI.h>
RH_ASK driver;
const int LED1 = 2; const int LED2 = 3; const int LED3 = 4; const int LED4 = 5;
void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT);
digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW);
if (!driver.init()) { // если не удалось инициализировать радиопередатчик/приёмник // можно вывести сообщение в Serial (если есть Serial) } }
void loop() { uint8_t buf[32]; uint8_t buflen = sizeof(buf);
if (driver.recv(buf, &buflen)) { // Ожидаем, что принятый payload 1 байт: command uint8_t cmd = buf[0];
// битовая маска: 0x01 — LED1, 0x02 — LED2, 0x04 — LED3, 0x08 — LED4
digitalWrite(LED1, (cmd & 0x01) ? HIGH : LOW);
digitalWrite(LED2, (cmd & 0x02) ? HIGH : LOW);
digitalWrite(LED3, (cmd & 0x04) ? HIGH : LOW);
digitalWrite(LED4, (cmd & 0x08) ? HIGH : LOW);
} }
Шаблон передатчика (для сравнения, отправляет байт-маску)
#include <RH_ASK.h> #include <SPI.h>
RH_ASK driver;
void setup() { if (!driver.init()) { // ошибка инициализации } }
void loop() { // пример: включить все LED uint8_t cmd = 0x0F; // 0000 1111 driver.send((uint8_t *)&cmd, 1); driver.waitPacketSent(); delay(1000); }
B) Вариант 2: приемник использует таблицу соответствий. Допустим, таблица говорит: если прийти код 0x10 — включить LED1; 0x11 — LED2; 0x12 — LED3; 0x13 — LED4; 0x1F — все включены; и т. д.
Шаблон приемника (Arduino) с таблицей соответствий:
#include <RH_ASK.h> #include <SPI.h>
RH_ASK driver;
const int LED1 = 2; const int LED2 = 3; const int LED3 = 4; const int LED4 = 5;
struct Pattern { uint8_t code; // код, приходящий по радио uint8_t mask; // битовая маска состояния LED'ов: 0x01 LED1, 0x02 LED2, 0x04 LED3, 0x08 LED4 };
// Таблица соответствий (пример, замените под вашу таблицу) Pattern table[] = { {0x10, 0x01}, // код 0x10 — включать LED1 {0x11, 0x02}, // код 0x11 — включать LED2 {0x12, 0x04}, // код 0x12 — включать LED3 {0x13, 0x08}, // код 0x13 — включать LED4 {0x1F, 0x0F}, // код 0x1F — все LED включены // добавьте остальные строки таблицы по задаче };
const int TABLE_SIZE = sizeof(table) / sizeof(table[0]);
void applyMask(uint8_t mask) { digitalWrite(LED1, (mask & 0x01) ? HIGH : LOW); digitalWrite(LED2, (mask & 0x02) ? HIGH : LOW); digitalWrite(LED3, (mask & 0x04) ? HIGH : LOW); digitalWrite(LED4, (mask & 0x08) ? HIGH : LOW); }
void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT);
digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW);
if (!driver.init()) { // обработка ошибки } }
void loop() { uint8_t buf[32]; uint8_t buflen = sizeof(buf);
if (driver.recv(buf, &buflen)) { uint8_t code = buf[0];
// поиск кода в таблице и применение соответствующей маски
bool found = false;
for (int i = 0; i < TABLE_SIZE; ++i) {
if (table[i].code == code) {
applyMask(table[i].mask);
found = true;
break;
}
}
// если код не найден, можно выключать все LED или сохранять предыдущее состояние
if (!found) {
// например, выключаем все
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
} }
- Как адаптировать под ваши параметры
- Пришлите таблицу (макет того, какие коды соответствуют каким состояниям LED). Я быстро подгоню код под точные пары код → состояние светодиодов.
- Если в вашей таблице LED не все 4, можно просто не использовать лишние пины и оставить их без изменения.
- Если в таблице заданы другие параметры (например, код состоит из 2 байт или нужен временной шаблон для мигания), скажите — расширю код под это.
- Практические советы по сборке
- Подберите резисторы под каждый светодиод. Обычно 220 Ω подходит для 5 В питания и 10 мА тока.
- Соберите схему так: перед каждым светодиодом резистор, затем светодиод к выходу микроконтроллера, а общий катод к GND.
- Общий GND приемника и передатчика должен быть общим.
- Если планируете ярко светящиеся LED или больше нагрузки, используйте транзистор на каждый светодиод и управляйте транзистором сигналом с микроконтроллера.
- Что ещё могу сделать после того как вы пришлёте таблицу
- Приведу точный код под вашу таблицу (полная адаптация), исключу лишний код и оставлю только необходимые части.
- Добавлю обработку ошибок передачи, таймауты, задержки и улучшения читаемости.
- При необходимости добавлю расширение на больше чем 4 LED, а также поддержку битовых масок большего размера и/или несколько байтов данных.
Если не хотите ждать — можно начать с варианта A (битовая маска) и затем заменим на соответствие из вашей таблицы. Присылайте таблицу (или хотя бы пример: какие коды какие LED должны зажигаться) — и я скорректирую конкретный готовый код под ваш случай.
