Druksensor uitlezen
17 berichten
• Pagina 2 van 2 • 1, 2
Re: Druksensor uitlezen
Hallo Nico,
ben er al achter, heb simpelweg een .0 moeten plaatsen om in de min te kunnen komen.
oude situatie
naar
werkt nu zo te zien 100%
ben er al achter, heb simpelweg een .0 moeten plaatsen om in de min te kunnen komen.
oude situatie
- Code: Alles selecteren
float p = (Press - 3360) / s;
naar
- Code: Alles selecteren
float p = (Press - 3360.0) / s;
werkt nu zo te zien 100%
Advertisement
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Druksensor uitlezen
Voor het goede zou je ook een float van press moeten maken. Casting heet dat
Re: Druksensor uitlezen
Hallo Nico,
Ik ben gisteren en vanochtend nog even aan het stoeien en zoeken geweest naar hetgeen je hebt vertelt,
maar tot mijn spijt heb ik geen flauw idee
kan je mij een hint in de richting geven hoe ik van mijn press en float kan maken ?
alvast bedankt.
Ik ben gisteren en vanochtend nog even aan het stoeien en zoeken geweest naar hetgeen je hebt vertelt,
maar tot mijn spijt heb ik geen flauw idee
kan je mij een hint in de richting geven hoe ik van mijn press en float kan maken ?
alvast bedankt.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Druksensor uitlezen
Stel variabele is int i=3;
Als je er dit van maakt
float x = (float)i;
Is x een float met de waarde van i.
En dat kan je met meerdere type variabelen doen.
Als je er dit van maakt
float x = (float)i;
Is x een float met de waarde van i.
En dat kan je met meerdere type variabelen doen.
Re: Druksensor uitlezen
Wanneer je met integers gaat rekenen, dan kan een vermenigvuldiging te hoog uitvallen, en een deling te laag.
Dus ik ben het met Nico eens, om alles met 'float' te berekenen.
Maar ik verschil met Nico waar het de 'voor'berekening betreft. Ik zou de berekening in de datasheet zo overnemen in de source code, en de compiler het rekenwerk laten doen.
De sensor geeft een 15 bit integer. Dus eigenlijk maakt het niet uit of je dat met een 'signed' of 'unsigned' integer doet. Een 'unsigned' lijkt me logischer. En om duidelijk aan te geven dat het een 16 bits variabele is, koos ik: 'uint16_t'.
Die waarde zo snel mogelijk omzetten naar float.
Vervolgens het rekenwerk met 'float', daarom schrijf ik alle vaste getallen als floating point getallen op. Een '270' is namelijk een integer en een '270.0' is een floating point getal.
Je mag casten/converteren op twee manieren:
Tot zover wat achtergronden van hoe de compiler er mee om gaat. Ik hoop dat het duidelijk is
Dus ik ben het met Nico eens, om alles met 'float' te berekenen.
Maar ik verschil met Nico waar het de 'voor'berekening betreft. Ik zou de berekening in de datasheet zo overnemen in de source code, en de compiler het rekenwerk laten doen.
De sensor geeft een 15 bit integer. Dus eigenlijk maakt het niet uit of je dat met een 'signed' of 'unsigned' integer doet. Een 'unsigned' lijkt me logischer. En om duidelijk aan te geven dat het een 16 bits variabele is, koos ik: 'uint16_t'.
Die waarde zo snel mogelijk omzetten naar float.
Vervolgens het rekenwerk met 'float', daarom schrijf ik alle vaste getallen als floating point getallen op. Een '270' is namelijk een integer en een '270.0' is een floating point getal.
Je mag casten/converteren op twee manieren:
- Code: Alles selecteren
float x = (float) a;
float x = float( a);
- Code: Alles selecteren
uint16_t de_ruwe_druk_van_de_sensor = word(hipbyte, lopbyte);
// kies een van de twee
const float s = 96.7814; // s = (29491 - 3360) / 270; // optie 1
const float s = (29491.0 - 3360.0) / 270.0; // optie 2
float p = float( de_ruwe_druk_van_de_sensor) - 3360.0) / s; // let op, 3360.0 is met .0 er achter
Tot zover wat achtergronden van hoe de compiler er mee om gaat. Ik hoop dat het duidelijk is
Re: Druksensor uitlezen
Heb beide opties geprobeerd en in 1 sketch samengevoegd beiden geven me het zelfde resultaat
hopelijk heb ik het goed interpreteert
serieel uitvoer?
hopelijk heb ik het goed interpreteert
- Code: Alles selecteren
#include "Wire.h"
#define addrs 0x78 // I2C bus address
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("Starting");
}
void loop()
{
Wire.requestFrom(addrs, 4); // contents of your first four registers
if ( Wire.available() == 4) // are 4 bytes received ?
{
int hipbyte = Wire.read(); // Read high byte
int lopbyte = Wire.read(); // Read low byte
uint16_t Press = word(hipbyte, lopbyte);
int hitbyte = Wire.read(); // Read high byte
int lotbyte = Wire.read(); // Read low byte
uint16_t Temp = word(hitbyte, lotbyte);
// Koepels way
const float s = (29491.0 - 3360.0) / 2700.0; // sensor heeft meetbereik van 2700 pa
float p = float(Press - 3360.0) / s;
// Nico's way
float n = (float) Press;
n = (Press - 3360.0) / s;
Serial.print("RAW Pressure: ");
Serial.print(Press);
Serial.print(" Pressure Nico: ");
Serial.print(n, 1);
Serial.print(" Pressure Koepel: ");
Serial.print(p, 1);
Serial.print(" Temp: ");
Serial.println(Temp);
}
else
{
Serial.println("Oeps, I2C ging fout");
}
delay(1000);
}
serieel uitvoer?
- Code: Alles selecteren
RAW Pressure: 3360 Pressure Nico: 0.0 Pressure Koepel: 0.0 Temp: 524
RAW Pressure: 3356 Pressure Nico: -0.4 Pressure Koepel: -0.4 Temp: 512
RAW Pressure: 3357 Pressure Nico: -0.3 Pressure Koepel: -0.3 Temp: 524
RAW Pressure: 3366 Pressure Nico: 0.6 Pressure Koepel: 0.6 Temp: 524
RAW Pressure: 3358 Pressure Nico: -0.2 Pressure Koepel: -0.2 Temp: 512
RAW Pressure: 3362 Pressure Nico: 0.2 Pressure Koepel: 0.2 Temp: 520
RAW Pressure: 3362 Pressure Nico: 0.2 Pressure Koepel: 0.2 Temp: 516
RAW Pressure: 3362 Pressure Nico: 0.2 Pressure Koepel: 0.2 Temp: 520
RAW Pressure: 3366 Pressure Nico: 0.6 Pressure Koepel: 0.6 Temp: 520
RAW Pressure: 3351 Pressure Nico: -0.9 Pressure Koepel: -0.9 Temp: 516
RAW Pressure: 3362 Pressure Nico: 0.2 Pressure Koepel: 0.2 Temp: 520
RAW Pressure: 3360 Pressure Nico: 0.0 Pressure Koepel: 0.0 Temp: 524
Re: Druksensor uitlezen
Ik had in mijn voorbeeld een haakje teveel staan.
Dus je kunt dit doen:
of dit:
of zo:
Het gaat er dus om dat je de integer (hier een 'uint16_t') eerst omzet naar een float, en pas daarna er mee gaat rekenen.
De compiler doet het vaak automatisch al, maar het is goed om tegen de compiler te vertellen om de integer eerst naar een float om te zetten.
Dus je kunt dit doen:
- Code: Alles selecteren
float p = float(Press) - 3360.0 / s;
of dit:
- Code: Alles selecteren
float n = float(Press);
float m = n - 3360.0 / s;
of zo:
- Code: Alles selecteren
float n = (float) Press;
float m = n - 3360.0 / s;
Het gaat er dus om dat je de integer (hier een 'uint16_t') eerst omzet naar een float, en pas daarna er mee gaat rekenen.
De compiler doet het vaak automatisch al, maar het is goed om tegen de compiler te vertellen om de integer eerst naar een float om te zetten.
17 berichten
• Pagina 2 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten