Пульт управления каналопромывкой

deman_chel

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

Схемы примерно такие:
передатчик.jpg
Приёмник.jpg
таблица пинов.jpg
Скетч для приёмника на 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);
}
}
После заливки скетча пробую щелкать переключателями и ничего не происходит, подключенные светодиоды у приёмника и передатчика моргают красным, на приёмнике 52 пин активен постоянно, не зависимо, есть связь с передатчиком или нет, Монитор порта пишет следующее:
СОМ3-ошибка.jpg
СОМ4-ошибка.jpg
Место нахождения Челябинск, место помощника не важно. )

Очень нуждаюсь в адекватной помощи )), на возмездной основе.

Начальная связь в ЛС, а там решим, как удобнее.
 
Изменено: