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% памяти. На скорость не влияет, но память МК невелика, особвенно если ее заполнить спецэффектами ;)
Было:
Стало:
Насколько хватает дальности 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
ЗЫ.. Модераторы , закройте плиз тему !
закрыто
нифига ;)