Led костюмы - помощь в оптимизации кода

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Здравствуйте!

Собрал макет управляемых 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

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Все работает  замечательно . Сейчас занимаюсь изготовлением костюмов . Их будет 2. По готовности покажу . 

Кому интересно - полная схема приемников . 

 

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Еще немного видео 

https://youtu.be/uV5pWElTY6g

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

простая замена жирных 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++) {

Было:

Скетч использует 1 002 байт (3%) памяти устройства. Всего доступно 32 256 байт.
Глобальные переменные используют 38 байт (1%) памяти, оставляя 2 010 байт для локальных переменных. 

Стало:

Скетч использует 882 байт (2%) памяти устройства. Всего доступно 32 256 байт.
Глобальные переменные используют 24 байт (1%) памяти, оставляя 2 024 байт для локальных переменных.

Насколько хватает дальности NRF?

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Tomasina пишет:

простая замена жирных int на const byte дает экономию 1% памяти. На скорость не влияет, но память МК невелика, особвенно если ее заполнить спецэффектами ;)


Насколько хватает дальности NRF?

Спасибо , я это уже сделал.

По дальности непрямая видимость - 20 метров . Препятствие - бетонная стена . Дальше не проверял . Думаю более чем хорошо  .

Собранный модуль приемника

 

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Первый пошел !

https://youtu.be/RV4l8zcjPNs

b707
Offline
Зарегистрирован: 26.05.2017

mobistrike, отлично!

Жаль картинка со схемой слишком ужата, надписей почти не разобрать.

Что за провод идет в центр ардуины. для чего он?

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

Что за провод идет в центр ардуины. для чего он?

A4/A5

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

sadman41 пишет:

b707 пишет:

Что за провод идет в центр ардуины. для чего он?

A4/A5

Верно А4 и А5 . Это pro mini .

Вот схема https://yadi.sk/i/THQSCVjp3Nnvuj

sadman41
Offline
Зарегистрирован: 19.10.2016

mobistrike пишет:

Вот схема https://yadi.sk/i/THQSCVjp3Nnvuj

1117 при таком включении может прижарить носителя.

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

sadman41 пишет:

mobistrike пишет:

Вот схема https://yadi.sk/i/THQSCVjp3Nnvuj

1117 при таком включении может прижарить носителя.

Не понял . Это ж ее стандартное включение .

sadman41
Offline
Зарегистрирован: 19.10.2016

mobistrike пишет:

Не понял . Это ж ее стандартное включение .

Начиная с #6 - http://arduino.ru/forum/apparatnye-voprosy/ams1117 (обратите внимание, что на радиомодуле стоит керамика).

Сам попадал в эту ловушку.

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Почитал . Познавательно . Правда сам никогда не наступал на эти грабли.

И еще - NRF24 обязательно паяю конденсатор  вот так 

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

 

 

 

 

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Окончательная проверка . Все работает прекрасно !

Вот https://youtu.be/xq0bhQRGzlc

 

ЗЫ.. Модераторы , закройте плиз тему !

valera678
Offline
Зарегистрирован: 04.11.2016

закрыто

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

нифига ;)