Правильная передача массива

Тема в разделе "Arduino & Shields", создана пользователем Ghosty, 7 фев 2019.

Метки:
  1. Ghosty

    Ghosty Нерд

    Ребята помогите пожалуйста.
    Есть приемник и передатчик на модулях nRF24L01+ и ардуино нано, передача\прием работает, все настроено.
    НО принимаются только первые данные массива, а вторых не принимается.
    На порте (или в порту) передатчика все в норме - [0],[1] массива изменяются.
    В приемник приходят только данные с [0] массива, а в [1] стоит постоянно значение 16.
    Помогите что не так со скетчем почему не весь массив принимается.
    скрин портов(не синхронный) - передатчик слева
    Может что то с типами данных что то напутал ? массив byte а данные int, так можно ?
    Спасибо
    p.s. Я Нубоват в програмировании.

    Скетч:
    Код (C++):
    передатчик:

    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    RF24 radio(9, 10);
    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
    byte transmit_data[2];
    void setup() {
    Serial.begin(9600);
    radio.begin();
    radio.setAutoAck(0);
    radio.setRetries(0, 15);
    radio.enableAckPayload();
    radio.setPayloadSize(8);
    radio.openWritingPipe(address[0]);
    radio.setChannel(0x60);
    radio.setPALevel (RF24_PA_MAX);
    radio.setDataRate (RF24_250KBPS);
    radio.powerUp();
    radio.stopListening();
    }

    void loop() {
    int ster = analogRead(5);
    if (2005< ster <2018) transmit_data[0] = 105;
    if (ster >2020) transmit_data[0] = 250;
    if (ster <2000) transmit_data[0] = 25;
    int vpera = analogRead(1);
    if (1990< vpera <2020) transmit_data[1] = 0;
    if (vpera >2020) transmit_data[1] = 1;
    if (vpera <1990) transmit_data[1] = 2;
    Serial.print("first: ");
    Serial.println(transmit_data[0]);
    Serial.print("second: ");
    Serial.println(transmit_data[1]);
    radio.write(transmit_data, sizeof(transmit_data));
    }

    приемник:

    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <Servo.h>
    Servo ster;
    RF24 radio(9,10);
    byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};
    byte recieved_data[2];

    void setup(){
    ster.attach(5);
    Serial.begin(9600);
    radio.begin();
    radio.setAutoAck(0);
    radio.setRetries(0,15);
    radio.enableAckPayload();
    radio.setPayloadSize(8);

    radio.openReadingPipe(1,address[0]);
    radio.setChannel(0x60);

    radio.setPALevel (RF24_PA_MAX);
    radio.setDataRate (RF24_250KBPS);
    radio.powerUp();
    radio.startListening();
    }

    void loop() {
    byte pipeNo;
    while( radio.available(&pipeNo)){
    radio.read(recieved_data, sizeof(recieved_data) );

    ster.write(recieved_data[0]);
    Serial.print("first: ");
    Serial.println(recieved_data[0]);
    Serial.print("second: ");
    Serial.println(recieved_data[1]);
    }
    }
     

    Вложения:

    • порт.jpg
      порт.jpg
      Размер файла:
      93,9 КБ
      Просмотров:
      280
    Последнее редактирование: 7 фев 2019
  2. vvr

    vvr Инженерище

    щас кто нибудь точно скажет, што нужно правильно код вставлять на форуме и отправят во флудилку....
     
  3. b707

    b707 Гуру

    код, конечно, надо вставлять правильно
    По сути вопроса - вот в этой строке отправляется только первый элемент массива
    Код (C++):
    radio.write(transmit_data, sizeof(transmit_data));
    потому что конструкция sizeof(transmit_data)) вовсе не вычисляет размер массива, как вы наверно, думаете

    Кроме того, вот эти строчки - безграмотны с точки зрения С и работать не будут:
    Код (C++):
    if (2005< ster <2018) transmit_data[0] = 105;
    .....
    if (1990< vpera <2020) transmit_data[1] = 0;
    дальше этого места код не смотрел, может там и еще косяки есть
     
  4. Ghosty

    Ghosty Нерд

    сори, поправил
     
  5. vvr

    vvr Инженерище

    а ещё int ster = analogRead(5); выдаёт значения до 1023, а вы там в двух тыщах сравнения делаете.
     
  6. Ghosty

    Ghosty Нерд

    Строчки работают - приемник принимает их и исполняет.
    пробовал radio.write(&transmit_data, 2); - это как я понимаю указывает размер массива - нет изменений
     
  7. Ghosty

    Ghosty Нерд

    Вроде так должно быть но у меня - от 0 до 3900
     
  8. b707

    b707 Гуру

    ну вы бы не спорили. а книжку б какую-то почитали.
    Строчки "работают". только результат совсем не тот. как вы думаете.
    Повторяю - строчки безграмотные, проверка диапазона делается не так.
    Опять же - вместо того чтоб выдумывать. что это "размер массива" - посмотрите описание.
     
  9. b707

    b707 Гуру

    В общем. я смотрю что вы вроде за помощью пришли, а сами на каждое замечание спорите. Не хотите слушать - решайте проблему сами. Причину того. почему у вас не передается - я указал.
     
  10. Ghosty

    Ghosty Нерд

    Причину я прочитал - передается не весь массив, так помощи и прошу что б прояснили как передать его весь.
    И я не спорю,про грамотность кодов - констатирую что он работает.
    Подскажете как весь массив передать ?
     
    Tomasina нравится это.
  11. timon

    timon Гик

    Подскажите, как у вас вот это
    и это
    одновременно в голове уживается? ))
     
  12. b707

    b707 Гуру

    для начала откиньте все ваши странные условия и задайте элементы массива жестко, например
    Код (C++):
    transmit_data[0] = 105;
    transmit_data[1] = 205;
    потом выставите одинаковы размер в приемнике и передатчике
    Код (C++):
    //transmitter
    radio.write(transmit_data, 2);

    //receiver
    radio.read(received_data, 2);
    После этого у вас в приемнике должно напечататься 105 и 205

    далее уже разбирайтесь с учловиями и с размером данных analogRead(). если у вас Нано, диапазон с аналогового входа 0-1023. никаких 2000 там не может быть в принципе

    PS если у вас на плате или на контроллере написано Wavgat - все вышеизложенное можете не читать, у вас не Ардуино Нано и там все по другому
     
    arkadyf и Сусемьбек нравится это.
  13. Tomasina

    Tomasina Сушитель лампочек Модератор

    Он работает, но выполняется только первая половина сравнения.
    Это видимость работы.
     
  14. Ghosty

    Ghosty Нерд

    Все просто тут речь не о массиве и его передаче а о:
    А спрашивал:
    Т.е. вопрос: Как правильно передать\принять массив с двумя ячейками.Наполнение массива не важно
     
  15. Ghosty

    Ghosty Нерд

    Сделал все как написано
    порты во вложении
     

    Вложения:

    • порт.jpg
      порт.jpg
      Размер файла:
      46,9 КБ
      Просмотров:
      327
  16. Ghosty

    Ghosty Нерд

    ЧЁРТ там именно Wavgat AVGA328p- это плохо ?
     
    Последнее редактирование: 7 фев 2019
  17. b707

    b707 Гуру

    это китайский клон Атмега328. В отличии от других "китайских ардуино" Вавгатовские не копия оригинальных, а со своими вывертами. Кое в чем он даже круче, но главная засада с ним - многие ардуиновские библиотеки работают на этой плате неправильно.
    Вы для него специальное дополнение в Ардуино ИДЕ поставили?

    добавка - для новичков я бы очень не советовал покупать платы Wavgat. Вы никогда не будете знать, почему скетч не работает - потому что вы что-то накосячили в коде или потому что плата кривая.
     
    arkadyf нравится это.
  18. Ghosty

    Ghosty Нерд

    Да все поставил что продавец на али сказал, вроде шьется все. без проблем.
    Странно она работает, чисто инстинктивно понятно что массив отправляется, но приняться не может.
    А для нее нет каких то своих библиотек? Читаю и смотрю Вы на многих форумах о ней писали
    Вот засада с этой Wavgat - 2 дня мозгового штурма и такой не интересный вывод.
     
  19. b707

    b707 Гуру

    ну я на других форумах писал то же самое - просто что не рекомендую эту плату. не более того. У меня нет личного опыта работы с ней. Честно говоря. мне жалко тратить время на изучение очередной нестандартной китайской поделки.

    Если интересно вникнуть. на ардуино.ру есть пара веток про подобные клоны - там и ваша плата обсуждается (надеюсь модераторы не удалят ссылки на "конкурирующий" ресурс)
    http://arduino.ru/forum/apparatnye-voprosy/obzor-klona-megi328-lgt8f328p
    http://arduino.ru/forum/apparatnye-voprosy/klon-atmega328p-lgt8f328p-analogovyi-vkhod-12-bit
     
    arkadyf нравится это.
  20. Ghosty

    Ghosty Нерд

    Вообщем если интересно то -
    Победил я эту WAVGAT, короче та настройка или библиотека которую дает продавец, то ли кривая то ли что...
    поставил отсюда http://arduino.ru/forum/apparatnye-...duino-nano-trebuet-osobuyu-proshivku-pomogite пост №8.
    И все массив на приемнике. скетч рабочий.