ARDUINO NRF24L01 + NRF24L01

10.08.2019
8
2
3
#1
Товарищи, подскажите пожалуйста. Мне нужно передать с одной NRF24L01 на другую данные. Все хорошо, все передается, НО!!! Мне нужны данные с двумя цифрами после запятой, а все числа округляются до целых, даже точнее не округляются, а отсекаются. В передатчике а=3,76 , в мониторе порта 3,76. А в приемнике на дисплее ОЛЕД а=3.
Как победить проблему??? Писал и float и double.
Как такое решается?// Ps/ передаю напряжение батареи.
Pps/ пока решил проблему так, что добавил отображение процентов. Разделил,умножил :), то есть просто отображается 3 и 95% это значит около 3,75 в . Пока так, ищу решение...
 
Последнее редактирование:
#4
Умножал и на 100 и на 100.0 и на 100.00 :(. Но на приемной не делил ещё.
Скетчи на работе в компе. Буду на работе, скину код.
За основу взял скетч Alexgyver радиоуправление с телеметрией. Добавил то что мне нужно было. Сделал катер на управлении. В пульте дисплей, на него передается температура, влажность и батарея катера. Температура не особо точная это не страшно тdht11( просто контроль нагрева двигателя, потому что пока без ШИМ), а вот напряжение мне нужно знать хотя бы одну цифру после запятой.
Искал в интернете... И конечно не нашел ни одного скетча управления с обратной связью , где напряжение со знаками после запятой, что бы сравнить.
 
Последнее редактирование:
#8
Интересный вопрос . Даже не задумывался что библиотеки могут не поддерживать типы. То есть изучить библиотеки, классы и тд...??? ууууу , это я долго буду изучать, ткните хотя бы на хороший справочник :)
pss\\ в скетче библиотеки
SPI.h
nRF24L01.h
RF24.h
iarduino _OLED_txt.h
если это библиотека, я думаю это библиотека дисплея.
 
Последнее редактирование:
#9
извиняюсь, не знаю как нормально код вставить.

//****************************************************************
//************** СКЕТЧ ПРИЁМНИКА ***********************
//****************************************************************
#define CH_NUM 0x60
#define SIG_POWER RF24_PA_LOW
#define SIG_SPEED RF24_2MBPS
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>
#include <dht11.h>
#define pin 2
dht11 term;
RF24 radio(9, 10);
byte pipeNo;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
//------------------------------------------------------------
//--------------------- ПЕРЕМЕННЫЕ ----------------------
//------------------------------------------------------------
float data_V1 ;
float data_V2 ;
float data_H ;
float data_T ;
float volt=A2;

int AA1 = 3; // мотор движения
int AA2 = 5; // мотор движения
int BB1 = 6; // мотор поворота
int BB2 = 7; // мотор поворота
int led1=A3;
int led2=A4;
int led3=A5;
int led4=8;
int lamp =3;
Servo myservo0;
Servo myservo1;
int RX_data[1];
int telemetry[1];

void setup() {

// Serial.begin(9600);
pinMode (volt, INPUT);

pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(lamp, OUTPUT);

pinMode(AA1, OUTPUT);
pinMode(AA2, OUTPUT);
pinMode(BB1, OUTPUT);
pinMode(BB2, OUTPUT);
myservo0.attach(A0);
myservo1.attach(A1);

radioSetup();
}

void loop() {
int refe = term.read(pin);
while (radio.available(&pipeNo)) {
radio.read( &RX_data, sizeof(RX_data));
//---------------------------------------------------------------------------------------
//----------------- ДВИЖЕНИЕ ВПЕРЕД НАЗАД ------
//---------------------------------------------------------------------------------------
if (RX_data[0] >=123 && RX_data[0] <=255){
digitalWrite (AA1, LOW),
digitalWrite (AA2, HIGH);}
if (RX_data[0] >=233 && RX_data[0] <=100){
digitalWrite (AA1, HIGH),
digitalWrite (AA2, LOW);}
if (RX_data[0] >123 && RX_data[0] <145){
digitalWrite (AA1, LOW),
digitalWrite (AA2, LOW);}
//---------------------------------------------------------------------------------------
//----------------- ДВИЖЕНИЕ ПРАВО ЛЕВО МОТОРОМ -----------
//---------------------------------------------------------------------------------------
if (RX_data[1] >=123 && RX_data[1] <=100){
digitalWrite (BB1, LOW),
digitalWrite (BB2, HIGH);}
if (RX_data[1] >=123 && RX_data[1] <=255){
digitalWrite (BB1, LOW),
digitalWrite (BB2, HIGH);}
if (RX_data[1] >123 && RX_data[1] <145){
digitalWrite (BB1, LOW),
digitalWrite (BB2, LOW);}

// -------------------
myservo0.write(RX_data[2]);
myservo1.write(RX_data[3]);
digitalWrite(lamp, RX_data[4]);
digitalWrite(led1, RX_data[5]);
digitalWrite(led2, RX_data[6]);
digitalWrite(led3, RX_data[7]);
digitalWrite(led4, RX_data[8]);

//-----------------------------------------------------------------------------------
//-------- формируем телеметрию ------------------------
//-----------------------------------------------------------------------------------


data_H = (term.humidity); // DHT11 на моторе
data_T = (term.temperature); // DHT11 на моторе
data_V1 = analogRead(volt)/1023.0*5.0;
data_V2= map((analogRead(volt)/1023.0*5.0),0.0,5.0,0.0,123.0);
// Serial.println (data_V2);
// Serial.println (volt);
telemetry[0] = data_T; // температура DHT11
telemetry[1] = data_H; // влажность DHT11
telemetry[2] = data_V1;
telemetry[3] = data_V2;
//Serial.print ("V1 ");
//Serial.println (data_V1);
//Serial.print ("V2 ");
//Serial.println (data_V2);
//Serial.print ("T ");
//Serial.println (data_T);
radio.writeAckPayload(pipeNo, &telemetry, sizeof(telemetry));//отправляем телеметрию
data_T = 0;
data_H = 0;
}
}

void radioSetup() { // настройка радио
radio.begin(); // активировать модуль
radio.setAutoAck(1); // режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); // (время между попыткой достучаться, число попыток)
radio.enableAckPayload(); // разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); // размер пакета, байт
radio.openReadingPipe(1, address[0]); // хотим слушать трубу 0
radio.setChannel(CH_NUM); // выбираем канал (в котором нет шумов!)
radio.setPALevel(SIG_POWER); // уровень мощности передатчика
radio.setDataRate(SIG_SPEED); // скорость обмена
// должна быть одинакова на приёмнике и передатчике!
// при самой низкой скорости имеем самую высокую чувствительность и дальность!!

radio.powerUp(); // начать работу
radio.startListening(); // начинаем слушать эфир, мы приёмный модуль
}







//**********************************************************************
//************** ЭТО СКЕТЧ ПЕРЕДАТЧИКА!!! *********************
//**********************************************************************

#define CH_NUM 0x90
#define SIG_POWER RF24_PA_LOW
#define SIG_SPEED RF24_1MBPS
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <iarduino_OLED_txt.h>
iarduino_OLED_txt myOLED(0x3C);
extern uint8_t MediumFontRus[];
extern uint8_t SmallFontRus[];

RF24 radio(9, 10);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
int button0 = 6;
int button1 = 8;
int button2 = 7;
int sw1 = 5;
int sw2 = 4;
int potent1 = A3;
int potent0 = A2;
int joy1X = A0;
int joy1Y = A1;
int vol_joy1;
int vol_joy2;


int TX_data[1];
int telemetry[1];
byte rssi;
int trnsmtd_pack = 1, failed_pack;
unsigned long RSSI_timer;



void setup() {
// Serial.begin(9600);
pinMode(joy1X, INPUT);
pinMode(joy1Y, INPUT);
pinMode(sw1, INPUT_PULLUP);
pinMode(sw2, INPUT_PULLUP);
pinMode(button0, INPUT_PULLUP);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(potent1, INPUT);
pinMode(potent0, INPUT);
}
void loop() {


TX_data[0] = map(analogRead(joy1X), 0, 123, 0, 255);
TX_data[1] = map(analogRead(joy1Y), 0, 123, 1, 180);
TX_data[2] = map(analogRead(potent0), 0, 123, 0, 180);
TX_data[3] = map(analogRead(potent1), 0, 123, 0, 180);// если рулевая серва, тогда здесь 255
TX_data[4] = !digitalRead(sw1), // инвертированный (!) сигнал с выключателя
TX_data[5] = !digitalRead(sw2); // инвертированный (!) сигнал с выключателя
TX_data[6] = !digitalRead(button0);
TX_data[7] = !digitalRead(button1);
TX_data[8] = !digitalRead(button2);
vol_joy1 = TX_data[0];
vol_joy2 = TX_data[1];

myOLED.setFont(SmallFontRus);
myOLED.print( ( TX_data[0] ), 19, 0);
myOLED.print( ( TX_data[1] ), 96, 0);

if (radio.write(&TX_data, sizeof(TX_data))) { // отправка пакета TX_data
trnsmtd_pack++;
if (!radio.available()) {
// если получаем пустой ответ
myOLED.clrScr();
} else {
while (radio.available() ) { // если в ответе что-то есть
radio.read(&telemetry, sizeof(telemetry)); // читаем
//---------------------------------------------------------
//---- получили телеметрию от приёмника -------
//---------------------------------------------------------
myOLED.setFont(SmallFontRus);
myOLED.print("ТЕМПЕРАТУРА", OLED_L, 2);
myOLED.print( ( telemetry[0]), OLED_R, 2);
myOLED.print("ВЛАЖНОСТЬ", OLED_L, 3);
myOLED.print( ( telemetry[1]), OLED_R, 3);
myOLED.print("БАТАРЕЯ- V", OLED_L, 5);
myOLED.print( ( telemetry[2]), OLED_R, 5);
myOLED.print("БАТАРЕЯ- %", OLED_L, 6);
myOLED.print( ( telemetry[3]), OLED_R, 6);

}
}
} else {
failed_pack++;
myOLED.clrScr();
myOLED.setFont(MediumFontRus);
myOLED.print( "НЕТ" , OLED_C, 2);
myOLED.print("СЕТИ", OLED_C, 4);
myOLED.clrScr();
}

if (millis() - RSSI_timer > 1000) { // таймер RSSI

// расчёт качества связи (0 - 100%) на основе числа ошибок и числа успешных передач
rssi = (1 - ((float)failed_pack / trnsmtd_pack)) * 100;
myOLED.clrScr();
myOLED.setFont(SmallFontRus);
myOLED.print( ( rssi ), 62, 0);
//******** сбросить значения ********
failed_pack = 0;
trnsmtd_pack = 0;
RSSI_timer = millis();
}
}
void radioSetup() {
radio.begin();
radio.setAutoAck(1);
radio.setRetries(0, 15);
radio.enableAckPayload();
radio.setPayloadSize(32);
radio.openWritingPipe(address[0]);
radio.setChannel(CH_NUM);
radio.setPALevel(SIG_POWER);
radio.setDataRate(SIG_SPEED);
radio.powerUp();
radio.stopListening();
}

PS ! Важно ! что бы школьники хоть немного думали, в скетче нужно посмотреть дефайны канала и скорости радиомодуля. изменить массивы передаваемых данных и цифры в "IF"
 
#10
Нашел решение !
Кому интересно : в приемнике /1023,0*500,0
в пульт добавляем : float volts= telemetry[2]/100;
в строке myOLED.print( ( telemetry[2]), OLED_R, 5);
не нужно лепить к правому борту, точка и знаки за запятой уходят за экран !
меняем на : myOLED.print( ( volts), 105, 5);
и все! есть и точка, и две цифры после точки !!!
 
Последнее редактирование: