Led костюмы - помощь в оптимизации кода
- Войдите на сайт для отправки комментариев
Пнд, 14/08/2017 - 12:42
Здравствуйте!
Собрал макет управляемых led костюмов на nrf24l01 . Сейчас это один передатчик и два приемника (в перспективе 5).
В силу нехватки знаний в программировании за основу был взят код из и сети и переделан под себя.
Все работает но чувствуется несинхронность. Уверен что можно ускорить работу .
Обращаюсь к знатокам , помогите плиз оптимизировать код
Передатчик
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#define MAX_CHANNELS 28
RF24 radio(9, 10);
// Network uses that radio
RF24Network network(radio);
int Data[] = {4, 5, 6, 7, 8, 14, 15, 16, 17, 18};
int state;
int ch;
int chVal[MAX_CHANNELS] = {0};
int NODE01[MAX_CHANNELS / 2] = {0}; //массив для NODE01
int NODE02[MAX_CHANNELS / 2] = {0}; //массив для NODE02
enum states
{
IDLE,
DELIM,
READ,
DISP
};
void setup(void)
{
Serial.begin(57600);
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
SPI.begin();
radio.begin();
network.begin(/*channel*/ 90, /*node address*/ 00); // канал и адрес узла
{
state = IDLE;
ch = 0;
Serial.begin(57600);
}
delay(1000);
}
void loop(void)
{
// Pump the network regularly
network.update(); // нужно постоянно запускать, чтобы транслировались
if (Serial.available())
{
switch (state)
{
case IDLE:
ch = 0;
if (Serial.read() == '+')
{
state = DELIM;
}
else
{
state = IDLE;
}
break;
case DELIM:
ch = 0;
if (Serial.read() == '>')
{
state = READ;
}
else
{
state = IDLE;
}
break;
case READ:
chVal[ch++] = Serial.read();
if (ch >= MAX_CHANNELS)
{
ch = 0;
state = DISP;
}
break;
case DISP:
state = IDLE;
//Serial.print("Sending...");
// Готовим массив для NODE 01---
for (int n01 = 0; n01 < MAX_CHANNELS / 2; n01++) {
NODE01[n01] = chVal[n01];
}
//------------------------------
//------------------------------
// Готовим массив для NODE 02---
for (int n02 = 14; n02 < MAX_CHANNELS; n02++) {
NODE02[n02 - 14] = chVal[n02];
}
//------------------------------
// Передача на NODE 01 ------
RF24NetworkHeader header01(/*to node*/ 01); // тут указываем на какое устройство отправляем данные
//bool ok = network.write(header,&NODE01,sizeof(NODE01)); // передаем, функция возвращает статус
network.write(header01, &NODE01, sizeof(NODE01)); // передаем, функция не возвращает статус
//----------------------------
// Передача на NODE 02 ------
RF24NetworkHeader header02(/*to node*/ 02); // тут указываем на какое устройство отправляем данные
//bool ok = network.write(header,&NODE02,sizeof(NODE02)); // передаем, функция возвращает статус
network.write(header02, &NODE02, sizeof(NODE02)); // передаем, функция не возвращает статус
//----------------------------
digitalWrite(8, !digitalRead(8));
// if (ok) // смотрим на статус и отписываемся в Serial
// Serial.println("ok.");
//else
// Serial.println("failed.");
// break;
}
}
}
Приемники
/// приемник с реле
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#define MAX_CHANNELS 14
int ch;
int chVal[MAX_CHANNELS] = {0};
int data[MAX_CHANNELS];
RF24 radio(7, 8);
RF24Network network(radio);
#define ID 02 // ID устройства
//****************Переменные пинов светодиодов
int l1 = 1;
int l2 = 2;
int l3 = 19;
int l4 = 4;
int l5 = 5;
int l6 = 6;
int l7 = 9;
int l8 = 10;
int l9 = 14;
int l10 = 15;
int l11 = 16;
int l12 = 17;
int l13 = 18;
int l14 = 3;
//**************************
int lp[] = {l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14}; // массив пинов светодиодов
const char inv_off = LOW ; //LOW для макета, HIGH для костюма с транзисторами
const char inv_on = HIGH ; // HIGH для макета, LOW для костюма с транзисторами
void setup(void)
{
//Serial.begin(57600);
for (int i = 0; i < 14; i++) {
pinMode(lp[i], OUTPUT);
digitalWrite(lp[i], inv_on);
}
SPI.begin();
radio.begin();
network.begin(/*channel*/ 90, /*node address*/ ID);
//radio.setAutoAck(false); // отключаем подтверждение приема пакетов
}
void loop(void)
{
// Pump the network regularly
network.update(); // нужно постоянно запускать, чтобы транслировались
// данные между узлами
// Is there anything ready for us?
while ( network.available() ) // если пришли данные
{
// If so, grab it and print it out
RF24NetworkHeader header;
network.read(header, &data, sizeof(data)); // читаем данные
//Serial.println(data); // отправляем в сериал для отладки
for (ch = 0; ch < MAX_CHANNELS; ch++) {
//digitalWrite(relayPin,!digitalRead(relayPin));
//Serial.print(data[ch]);
//Serial.print(" ");
digitalWrite(lp[ch], !data[ch]);
}
// Serial.println(" ");
// Serial.println("______________________________________");
//digitalWrite(l1, !data[0]);
//digitalWrite(l2, !data[1]);
//digitalWrite(l3, !data[2]);
//digitalWrite(l4, !data[3]);
//analogWrite(l5, data[4]);
//analogWrite(l6, data[5]);
//analogWrite(l7, data[6]);
//analogWrite(l8, data[7]);
//digitalWrite(l9, !data[8]);
//digitalWrite(l10, !data[9]);
//digitalWrite(l11, !data[10]);
//digitalWrite(l12, !data[11]);
//digitalWrite(l13, !data[12]);
//analogWrite(l14, data[13]);
}
}
Вот как это выглядит на видео https://youtu.be/Cza3q-HZ_gc
Все работает замечательно . Сейчас занимаюсь изготовлением костюмов . Их будет 2. По готовности покажу .
Кому интересно - полная схема приемников .
Еще немного видео
https://youtu.be/uV5pWElTY6g
простая замена жирных int на const byte дает экономию 1% памяти. На скорость не влияет, но память МК невелика, особвенно если ее заполнить спецэффектами ;)
/// приемник с реле #include <SPI.h> #define MAX_CHANNELS 14 byte ch; byte chVal[MAX_CHANNELS] = {0}; byte data[MAX_CHANNELS]; #define ID 02 // ID устройства // <<<<<< не 02, а 2, т.к. ведущий ноль переводит счисление в бинарное, //****************Переменные пинов светодиодов const byte l1 = 1; const byte l2 = 2; const byte l3 = 19; const byte l4 = 4; const byte l5 = 5; const byte l6 = 6; const byte l7 = 9; const byte l8 = 10; const byte l9 = 14; const byte l10 = 15; const byte l11 = 16; const byte l12 = 17; const byte l13 = 18; const byte l14 = 3; //************************** const byte lp[] = {l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14}; // массив пинов светодиодов const boolean inv_off = LOW ; //LOW для макета, HIGH для костюма с транзисторами const boolean inv_on = HIGH ; // HIGH для макета, LOW для костюма с транзисторами void setup(void) { //Serial.begin(57600); for (byte i = 0; i < 14; i++) {Было:
Стало:
Насколько хватает дальности NRF?
простая замена жирных int на const byte дает экономию 1% памяти. На скорость не влияет, но память МК невелика, особвенно если ее заполнить спецэффектами ;)
Насколько хватает дальности NRF?
Спасибо , я это уже сделал.
По дальности непрямая видимость - 20 метров . Препятствие - бетонная стена . Дальше не проверял . Думаю более чем хорошо .
Собранный модуль приемника
Первый пошел !
https://youtu.be/RV4l8zcjPNs
mobistrike, отлично!
Жаль картинка со схемой слишком ужата, надписей почти не разобрать.
Что за провод идет в центр ардуины. для чего он?
Что за провод идет в центр ардуины. для чего он?
A4/A5
Что за провод идет в центр ардуины. для чего он?
A4/A5
Верно А4 и А5 . Это pro mini .
Вот схема https://yadi.sk/i/THQSCVjp3Nnvuj
Вот схема https://yadi.sk/i/THQSCVjp3Nnvuj
1117 при таком включении может прижарить носителя.
Вот схема https://yadi.sk/i/THQSCVjp3Nnvuj
1117 при таком включении может прижарить носителя.
Не понял . Это ж ее стандартное включение .
Не понял . Это ж ее стандартное включение .
Начиная с #6 - http://arduino.ru/forum/apparatnye-voprosy/ams1117 (обратите внимание, что на радиомодуле стоит керамика).
Сам попадал в эту ловушку.
Почитал . Познавательно . Правда сам никогда не наступал на эти грабли.
И еще - NRF24 обязательно паяю конденсатор вот так
Окончательная проверка . Все работает прекрасно !
Вот https://youtu.be/xq0bhQRGzlc
ЗЫ.. Модераторы , закройте плиз тему !
закрыто
нифига ;)