Передача текста в nrf24l01
- Войдите на сайт для отправки комментариев
Сб, 06/01/2018 - 17:20
Здравствуйте. Помогите разобраться с передачей текста.
Передатчик:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
void setup() {
Serial.begin(9600);
radio.begin();
radio.setAutoAck(1);
radio.setRetries(0, 15);
radio.enableAckPayload();
radio.setPayloadSize(32);
radio.openWritingPipe(address[0]);
radio.setChannel(0x60);
radio.setPALevel (RF24_PA_MAX);
radio.setDataRate (RF24_250KBPS);
radio.powerUp();
radio.stopListening();
}
char text[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '#'};
void loop() {
radio.write(&text, sizeof(text));
delay(1000);
}
Приемник:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9,10);
byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};
void setup(){
Serial.begin(9600);
radio.begin();
radio.setAutoAck(1);
radio.setRetries(0,15);
radio.enableAckPayload();
radio.setPayloadSize(32);
radio.openReadingPipe(1,address[0]);
radio.setChannel(0x60);
radio.setPALevel (RF24_PA_MAX);
radio.setDataRate (RF24_250KBPS);
radio.powerUp();
radio.startListening();
}
void loop() {
char gotByte[8];
byte pipeNo;
while( radio.available(&pipeNo)){
radio.read(&gotByte, sizeof(gotByte) );
}
for (byte i = 0; i < sizeof(gotByte); i++) {
Serial.print(gotByte[i]);
}
Serial.println();
}
В мониторе порта приемника получаю ересть
а если так
http://www.industrialnets.ru/files/misc/ascii.pdf
Я вас не поняла.
попробуйте таблицу символов использовать, передавать цифры, используя таблицу, а на приемнике декодировать
Проверьте скорость порта монитора. 9600 она или другая.
Ну и вот этот массив неправильно объявлен
chartext[8] = {'a','r','d','u','i','n','o','#'};Не знаю как там write реализован в этой библиотеке возможно с указанием длины все работает и так.
Прием
void loop() { char gotByte[9]; byte pipeNo; while( radio.available(&pipeNo)){ radio.read(&gotByte, sizeof(gotByte) ); for (byte i = 0; i < sizeof(gotByte); i++) { Serial.print(gotByte[i]); } Serial.println(); }}Передача
char qwe[9] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '#', '!'}; void loop() { radio.write(&qwe, sizeof(qwe)); delay(1000); }Работает
Проблема снята?
Как бы рабоатет. Может посоветуете как сделать лучше, правильнее?
Да, тут много всего, но боюсь, будет всё как всегда - любое замечание воспринимается как наезд и вызывает резкую реакцию.
Ну, для начала мелочь - зачем Вам нужна переменная pipeNo, если Вы её нигде не используете? Если удалить строку 3, а строке 4 вместо &pipeNo написать NULL - ничего не изменится, только не будет этой переменной и будет чуть быстрее работать.
Продолжать? Или Вам уже скучно?
Конечно же продолжать, переменная осталась от неких экспериментов, забыла удалить)
1. Попробуйте заменить while на if в строке 4. Должно нормально работать. Скажите как получилось. Но это верно только до тех пор, пока длина Вашего пакета меньше payload_size. Если больше, то чтение становится сложнее. Вы знаете про payload_size?
2. В строка 5 и 6 у Вас написано
radio.read(&gotByte, sizeof(gotByte) ); for (byte i = 0; i < sizeof(gotByte); i++) {Вы понимаете, что sizeof(gotByte) здесь совершенно разные вещи? В строке 5 это общая длина масива - всех элементов, а в строке 6 - это количество элементов?
Численно они у Вас совпали только потому, что это массив типа char, а длина char - 1 байт. Будь там массив типа int. например, была бы беда. Не привыкайте так писать. там где нужно количество элементов массива, всегда пишите именно количество элементов (т.е. общий размре массива, поделённый на размер одного элемента). Сделайте это привычкой и никогда не будете ошибаться. Т.е. правильно было бы так:
radio.read(&gotByte, sizeof(gotByte) ); for (byte i = 0; i < sizeof(gotByte) / sizeof(gotByte[0]); i++) {Передатчик
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9, 10); byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; void setup() { Serial.begin(9600); radio.begin(); radio.setAutoAck(1); radio.setRetries(0, 15); radio.enableAckPayload(); radio.setPayloadSize(32); radio.openWritingPipe(address[0]); radio.setChannel(0x60); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_250KBPS); radio.powerUp(); radio.stopListening(); } char message[9] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '#', '!'}; void loop() { if (radio.write(&message, sizeof(message))) { Serial.println("Принял"); } else { Serial.println("Не принял"); } delay(10); }Приемник
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9,10); byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; void setup(){ Serial.begin(9600); radio.begin(); radio.setAutoAck(1); radio.setRetries(0,15); radio.enableAckPayload(); radio.setPayloadSize(32); radio.openReadingPipe(1,address[0]); radio.setChannel(0x60); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_250KBPS); radio.powerUp(); radio.startListening(); } void loop() { char gotByte[9]; if( radio.available()){ radio.read(&gotByte, sizeof(gotByte) ); for (byte i = 0; i < sizeof(gotByte) / sizeof(gotByte[0]); i++) { Serial.print(gotByte[i]); } Serial.println(); }}Не знаю.
Serial.println("Не принял");Почему-то модуль всегда отвечает этим сообщением, хотя второй модуль прекрансо принимает.
Захотела организовать ответ если сообщение принято
Передатчик:
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9, 10); byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; int message[2]; int otvet; void setup() { Serial.begin(9600); radio.begin(); radio.setAutoAck(1); radio.setRetries(0, 15); radio.enableAckPayload(); radio.setPayloadSize(32); radio.openWritingPipe(address[0]); radio.setChannel(0x60); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_1MBPS); radio.powerUp(); radio.stopListening();//Передаем message[0]=1011;//true message[1]=1010;//false } void loop() { radio.write(&message[0], sizeof(message[0])); Serial.print("Отправили: "); Serial.print(message[0]); Serial.println(""); if (!radio.available()) { Serial.println("Пусто"); }else{ while (radio.available() ) { radio.read(&otvet, sizeof(otvet)); Serial.print("Приняли: "); Serial.print(otvet); Serial.println(""); }} delay(3000); }Приёмник:
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9,10); byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; byte pipeNo; void setup(){ Serial.begin(9600); radio.begin(); radio.setAutoAck(1); radio.setRetries(0,15); radio.enableAckPayload(); radio.setPayloadSize(32); radio.openReadingPipe(1,address[0]); radio.setChannel(0x60); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_1MBPS); radio.powerUp(); radio.startListening();//Слушаем } int message; void loop() { if( radio.available(&pipeNo)){ radio.read(&message, sizeof(message) ); Serial.print("Приняли: "); Serial.print(message); Serial.println(); radio.writeAckPayload(&pipeNo,&message, sizeof(message)); Serial.print("Ответили: "); Serial.print(message); Serial.println(); }}Приемник принимает 1011 и отправляет 1011
Передатчик отправляет 1011 и выволит сообщение Пусто
Не знаю.
Эта библиотека всегда отправляет пакет фиксированного размера. Размер равен payload_size. По умолчанию - 32 байта. Можно установить больше (но, не меньше) при помощи функции setPayloadSize.
Если Вы отправляете меньший (чем payload_size) пакет, она дополнит его нулями, а если больший, то обрежет. Об этом надо помнить и если нужно передать больше, то разбивать на куски.
Вы посмотрите исходный текст библиотеки. Там очень много комментариев, да и код в целом понятный - узнаете много интересного - это не простая библиотека, там много всего наворочено.
Serial.println("Не принял");Почему-то модуль всегда отвечает этим сообщением, хотя второй модуль прекрансо принимает.
Что Вы имеете в виду - просто заменяеете один модуль другим или пытаетесь передать сразу на два (один передатчик - два приёмника)?
35 строкой в передатчик добавить
Irinka, у нас тут как-то дискуссия возникла о сексизме в программировании. Мы (я и те, кто разделяет моё мнение) там в меньшинстве оказались, если Вам интересно, может Вы там что-нибудь прокомментируете?
Один модуль передает, другой принимает.
35 строкой в передатчик добавить
Я так пробовала.
Irinka, у нас тут как-то дискуссия возникла о сексизме в программировании. Мы (я и те, кто разделяет моё мнение) там в меньшинстве оказались, если Вам интересно, может Вы там что-нибудь прокомментируете?
Да-да, отвечу)))
Ура, заработало!!!
Передатчик
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9, 10); byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; int message[2]; int otvet; void setup() { Serial.begin(9600); radio.begin(); radio.setAutoAck(1); radio.setRetries(0, 15); radio.enableAckPayload(); radio.setPayloadSize(32); radio.openWritingPipe(address[0]); radio.setChannel(0x60); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_1MBPS); radio.powerUp(); radio.stopListening();//Передаем message[0]=1011;//true message[1]=1010;//false } void loop() { if (radio.write(&message[0], sizeof(message[0]))) { Serial.print("Отправили: "); Serial.println(message[0]); Serial.println("Приемник получил пакет"); if (!radio.available()) { //if (!radio.isAckPayloadAvailable()) { Serial.println("Пусто"); }else{ while (radio.available() ) { radio.read(&otvet, sizeof(otvet)); Serial.print("Приняли: "); Serial.print(otvet); Serial.println(""); }} }else{ Serial.println("Приемник НЕ получил пакет"); } delay(3000); }Приёмник
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9,10); byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; void setup(){ Serial.begin(9600); radio.begin(); radio.setAutoAck(1); radio.setRetries(0,15); radio.enableAckPayload(); radio.setPayloadSize(32); radio.openReadingPipe(1,address[0]); radio.setChannel(0x60); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_1MBPS); radio.powerUp(); radio.startListening();//Слушаем } int message; int otvet=9999; void loop() { if( radio.available()){ radio.read(&message, sizeof(message) ); Serial.print("Приняли: "); Serial.print(message); Serial.println(); delay(100); radio.writeAckPayload(1,&otvet, sizeof(otvet)); //radio.write(&message, sizeof(message)); Serial.print("Ответили: "); Serial.print(otvet); Serial.println(); }}Выручайте:
Я назначаю пины так:
Но не работает. Почему? Как сделать?
Я это к чему...подключила к atmega128 к 14 и 15 пину
т.е.
14 пин атмеги-это 12 в скетче
15 пин атмеги-это 13 в скетче
неудобно.....