Comment avoir des décimales sur mesure de tension

Bonjour,

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.

 
   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); 
}
}

De plus comment faire pour avoir à la place d'une valeur 0 ou 1 pour l'état de data [1] ,par exemple fermé ou ouvert .

merci pour votre aide.

hello
sans le code entier..............
si tes variables ne sont pas du bon type......

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 .

Merci pour l'aide

Ç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.

struct payload{
  float batLevel;
  byte cale;
  byte roof;
} data;

tu remplirais la structure

  data.batLevel = vin;
  data.cale = digitalRead(Cale);
  data.roof = digitalRead(Roof);

Tu envoies avec

radio.write( (void *)data, sizeof(data) );

A la réception, il faut faire la même chose dans l'autre sens.

1 Like

Merci beaucoup pour les explications et exemples .Je teste ça

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.