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



Скетч для приёмника на Arduino Mega. Управление двумя модулями по 16 реле, подключенные на пины с 22 по 53. Логика работы реле: Для нормально разомкнутых реле активное состояние означает, что реле замкнуто (LOW), а неактивное - разомкнуто (HIGH). Беспроводной модуль NRF24L01 подключен через модуль питания YL-105 к пинам 9(CE), 10(CSN), 11(MOSI), 12(MISO), 8(SCK), настроить уровень мощности передачи RF24_PA_HIGH, Выбрать скорость передачи данных RF24_1MBPS, который принимает сигнал от второго Arduino Mega с переключателями и джойстиками. Использовать адрес 0xAABBCCDD11LL, канал 35. Использовать светодиоды для индикации состояния связи. Модуль RGB светодиода состояния - если данные успешно приняты, можно зажечь зелёный светодиод pin 3, если нет - красный pin 2. Включение передатчика, начало прослушивания канала, на приёмнике активировать пин 52.
Скетч для передатчика на Arduino Mega. К пинам с 22 по 51 подключены переключатели и джойстики, Должна быть обеспечена возможность одновременного нажатия нескольких переключателей, пины, к которым подключены переключатели и джойстики, как входы с подтяжкой к питанию (INPUT_PULLUP), при отпущенном переключателе пин будет читать HIGH, а при нажатом - LOW. Если переключатель нажат (LOW), то реле должно замкнуться (LOW). Создать цикл, который будет читать состояние каждой кнопки и сохранять его в массиве или переменной. Отправлять состояния кнопок с передатчика на приёмник с помощью модуля NRF24L01. Беспроводной модуль NRF24L01 подключен через модуль питания YL-105 к пинам 9(CE), 10(CSN), 11(MOSI), 12(MISO), 8(SCK), Настроить уровень мощности передачи RF24_PA_HIGH, Выбрать скорость передачи данных RF24_1MBPS, который передаёт сигнал на первый Arduino Mega с двумя модулями по 16 реле. Использовать адрес 0xAABBCCDD11LL, канал 35. Модуль RGB светодиода состояния - если данные успешно приняты, можно зажечь зелёный светодиод pin 3, если нет - красный pin 2. Использовать динамический размер пакетов данных, чтобы оптимизировать передачу данных.
Добавить обработку ошибок и проверку связи между устройствами. Успешная связь - активировать выход 52.
После заливки скетча пробую щелкать переключателями и ничего не происходит, подключенные светодиоды у приёмника и передатчика моргают красным, на приёмнике 52 пин активен постоянно, не зависимо, есть связь с передатчиком или нет, Монитор порта пишет следующее:


Место нахождения Челябинск, место помощника не важно. )
Очень нуждаюсь в адекватной помощи )), на возмездной основе.
Начальная связь в ЛС, а там решим, как удобнее.
Нужна помощь в написании заново или корректировки моего скетча, мой первый опыт с Ардуино, нужно сделать пульт управления для работы с каналопромывочной машиной. Вот что у меня получилось на данный момент.
Схемы примерно такие:



Скетч для приёмника на Arduino Mega. Управление двумя модулями по 16 реле, подключенные на пины с 22 по 53. Логика работы реле: Для нормально разомкнутых реле активное состояние означает, что реле замкнуто (LOW), а неактивное - разомкнуто (HIGH). Беспроводной модуль NRF24L01 подключен через модуль питания YL-105 к пинам 9(CE), 10(CSN), 11(MOSI), 12(MISO), 8(SCK), настроить уровень мощности передачи RF24_PA_HIGH, Выбрать скорость передачи данных RF24_1MBPS, который принимает сигнал от второго Arduino Mega с переключателями и джойстиками. Использовать адрес 0xAABBCCDD11LL, канал 35. Использовать светодиоды для индикации состояния связи. Модуль RGB светодиода состояния - если данные успешно приняты, можно зажечь зелёный светодиод pin 3, если нет - красный pin 2. Включение передатчика, начало прослушивания канала, на приёмнике активировать пин 52.
Скетч для передатчика на Arduino Mega. К пинам с 22 по 51 подключены переключатели и джойстики, Должна быть обеспечена возможность одновременного нажатия нескольких переключателей, пины, к которым подключены переключатели и джойстики, как входы с подтяжкой к питанию (INPUT_PULLUP), при отпущенном переключателе пин будет читать HIGH, а при нажатом - LOW. Если переключатель нажат (LOW), то реле должно замкнуться (LOW). Создать цикл, который будет читать состояние каждой кнопки и сохранять его в массиве или переменной. Отправлять состояния кнопок с передатчика на приёмник с помощью модуля NRF24L01. Беспроводной модуль NRF24L01 подключен через модуль питания YL-105 к пинам 9(CE), 10(CSN), 11(MOSI), 12(MISO), 8(SCK), Настроить уровень мощности передачи RF24_PA_HIGH, Выбрать скорость передачи данных RF24_1MBPS, который передаёт сигнал на первый Arduino Mega с двумя модулями по 16 реле. Использовать адрес 0xAABBCCDD11LL, канал 35. Модуль RGB светодиода состояния - если данные успешно приняты, можно зажечь зелёный светодиод pin 3, если нет - красный pin 2. Использовать динамический размер пакетов данных, чтобы оптимизировать передачу данных.
Добавить обработку ошибок и проверку связи между устройствами. Успешная связь - активировать выход 52.
C++:
**Скетч для приёмника:**
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
// Пины для модуля NRF24L01
#define CE_PIN 9
#define CSN_PIN 10
// Пины для светодиодов
#define LED_GREEN 3
#define LED_RED 2
// Пин для активации передатчика
#define TRANSMITTER_PIN 52
// Настройки модуля NRF24L01
RF24 radio(9, 10); // CE, CSN
const byte address[6] = "0xAABBCCDD11LL";
const uint8_t channel = 0x75;
// Пины реле
const int relayPins[] = {6, 7, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49};
const int numRelays = sizeof(relayPins) / sizeof(relayPins[0]);
// Пины светодиодов
const int ledPinGreen = 3;
const int ledPinRed = 2;
const int ledPinStatus = 4;
void setup() {
// Инициализация Serial
Serial.begin(9600);
// Инициализация светодиодов
pinMode(LED_BUILTIN, OUTPUT); // initialize digital pin LED_BUILTIN as an output.
pinMode(ledPinGreen, OUTPUT);
pinMode(ledPinRed, OUTPUT);
pinMode(ledPinStatus, OUTPUT);
// Инициализация реле
for (int i = 0; i < numRelays; i++) {
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], HIGH); // Начальное состояние - реле выключено
}
// Инициализация радио модуля
radio.begin();
radio.setCRCLength(RF24_CRC_16); // Включение 16-битного CRC
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setPALevel(RF24_PA_HIGH); // Уровень мощности передачи
radio.setDataRate(RF24_1MBPS); // Скорость передачи данных
radio.openReadingPipe(1, address); // Открытие канала для чтения
radio.setChannel(channel); // Установка канала
radio.startListening(); // Начало прослушивания
// Индикация начала работы
digitalWrite(ledPinStatus, HIGH);
}
void loop() {
if (radio.available()) {
bool relayStates[numRelays];
radio.read(&relayStates, sizeof(relayStates));
Serial.println("Пакет принят успешно");
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], relayStates[i] ? LOW : HIGH); // Активное состояние - LOW (замкнуто)
}
digitalWrite(ledPinGreen, HIGH);
delay(100);
digitalWrite(ledPinRed, LOW);
} else {
Serial.println("Нет данных для приёма");
digitalWrite(ledPinGreen, LOW);
delay(100);
digitalWrite(ledPinRed, HIGH);
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000);
}
}
**Скетч для передатчика:**
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
// Пины для модуля NRF24L01
#define CE_PIN 9
#define CSN_PIN 10
// Пины для светодиодов
#define LED_GREEN 3
#define LED_RED 2
RF24 radio(CE_PIN, CSN_PIN);
const byte address[6] = "0xAABBCCDD11LL";
const uint8_t channel = 75;
// Пины кнопок
const int buttonPins[] = {6, 7, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49};
const int numButtons = sizeof(buttonPins) / sizeof(buttonPins[0]);
// Пины светодиодов
const int ledPinGreen = 3;
const int ledPinRed = 2;
const int ledPinStatus = 4;
void setup() {
// Инициализация Serial
Serial.begin(9600);
// Инициализация светодиодов
pinMode(ledPinGreen, OUTPUT);
pinMode(ledPinRed, OUTPUT);
pinMode(ledPinStatus, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT); // initialize digital pin LED_BUILTIN as an output.
// Инициализация кнопок
for (int i = 0; i < numButtons; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
// Инициализация радио модуля
radio.begin();
radio.setCRCLength(RF24_CRC_16); // Включение 16-битного CRC
radio.setPALevel(RF24_PA_HIGH);
radio.setDataRate(RF24_1MBPS);
radio.openWritingPipe(address); // Открытие канала для записи
radio.setChannel(channel); // Установка канала
radio.stopListening();
// Индикация начала работы
digitalWrite(ledPinStatus, HIGH);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000);
int relayStates[2] = {0, 0}; // Массив для состояний реле
bool buttonStates[numButtons];
for (int i = 0; i < numButtons; i++) {
buttonStates[i] = !digitalRead(buttonPins[i]); // Активное состояние - LOW
}
if (radio.write(&buttonStates, sizeof(buttonStates))) {
Serial.println("Пакет отправлен успешно");
digitalWrite(ledPinGreen, HIGH);
delay(100);
digitalWrite(ledPinRed, LOW);
} else {
Serial.println("Ошибка отправки пакета");
// Индикация ошибки отправки данных
digitalWrite(ledPinGreen, LOW);
delay(100);
digitalWrite(ledPinRed, HIGH);
}
}


Место нахождения Челябинск, место помощника не важно. )
Очень нуждаюсь в адекватной помощи )), на возмездной основе.
Начальная связь в ЛС, а там решим, как удобнее.
Изменено: