Je suis entrain de me faire un montage afin de surveiller via un Nrf24 pour mon bateau au mouillage.
Je souhaite pouvoir mesurer la tension batterie, niveau d'eau dans la cale ,etc...
La transmission se passe bien ,par contre je n'arrive pas à avoir les décimales pour la mesure de la batterie.
Dans le port série ,je n'ai que le chiffre rond.
Effectivement c'est peut être un problème de variables
L'émetteur
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define CE_PIN 7
#define CSN_PIN 8
#define Batterie A1
#define Roof 3
#define Cale 2
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
byte data[3]; // depending on the number of sensors used
// for the voltage sensor 0-25V
float correctionfactor = -0.03;
float vout = 0.00;
float vin = 0.00;
// two resistors 30K and 7.5k ohm used in the voltage sensor
float R1 = 30000.0; //
float R2 = 7500.0; //
float value1 = 0.00;
#define SCREEN_WIDTH 128 // ORelay display width, in pixels
#define SCREEN_HEIGHT 64 // ORelay display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define ORelay_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, ORelay_RESET);
void setup()
{
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);
radio.setPALevel(RF24_PA_HIGH);
radio.setDataRate(RF24_250KBPS);
pinMode(Batterie,INPUT);
pinMode(Cale, INPUT_PULLUP);
pinMode(Roof,INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);
}
void loop()
{
// read the value at analog input
value1 = analogRead(Batterie);
vout = (value1 * 5.00) / 1023.00;
vin = vout / (R2/(R1+R2));
vin = vin - correctionfactor;
data[0] = vin;
if(digitalRead(Cale) == LOW)
{
data[1] = 0;
}
if(digitalRead(Cale) == HIGH)
{
data[1] = 1;
if(digitalRead(Roof) == LOW)
{
data[2] = 0;
}
if(digitalRead(Roof) == HIGH)
{
data[2] = 1;
}
radio.write( data, sizeof(data) );
Serial.print("INPUT V= ");
Serial.println(vin,2);
display.clearDisplay();
display.setCursor(10,20);
display.setTextSize(3);
display.setTextColor(WHITE);
display.print(String(vin)+"V");
display.display();
delay(500);
et le récepteur
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define CE_PIN 7
#define CSN_PIN 8
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
byte data[3]; // depending on the number of sensors used
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;
#define SCREEN_WIDTH 128 // ORelay display width, in pixels
#define SCREEN_HEIGHT 64 // ORelay display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define ORelay_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, ORelay_RESET);
void setup()
{
Serial.begin(9600);
delay(1000);
Serial.println("Nrf24L01 Receiver Starting");
radio.begin();
radio.setPALevel(RF24_PA_HIGH);
radio.setDataRate(RF24_250KBPS);
radio.openReadingPipe(1,pipe);
radio.startListening();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);
resetData();
}
void loop()
{
if ( radio.available() )
{
bool done = false;
while (!done)
{
radio.read( data, sizeof(data) );
lastReceiveTime = millis(); // At this moment we have received the data
Serial.println("tension batterie:");
Serial.println(data[0]);
Serial.println("porte roof:");
Serial.println(data[1]);
Serial.println("niveau cale:");
Serial.println(data[2]);
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,10);
display.print("tension:"+String(data[0]));
display.setTextSize(2);
display.setCursor(0,30);
display.print("roof:"+String(data[1]));
display.setTextSize(2);
display.setCursor(0,50);
display.print("cale:"+String(data[2]));
display.display();
delay(500);
}
}
else
{
currentTime = millis();
if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection
resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone has a throttle up and we lose connection, it can keep flying unless we reset the values
}
}
}
void resetData()
{
// we are going to place our default code over here.
Serial.println("Connection Lost");
}
Le problème vient du côté recepteur,où je n'ai pas les décimales .
Ça ne peut pas fonctionner comme ça.
data stocke des byte et tu mets dedans un float.
Lorsque tu fais data[0] = vin; le compilateur fait implicitement une conversion de type et ton flottant est converti en byte, donc une valeur entière entre 0 et 255.
Le plus simple serait de passer par une structure qui contiendrait les données à transmettre.