Druksensor uitlezen

algemene C code
Berichten: 10
Geregistreerd: 02 Mrt 2014, 11:38
Woonplaats: Winschoten

Re: Druksensor uitlezen

Berichtdoor doddema74 » 25 Jul 2017, 23:05

Hallo Nico,

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

Gebruikers-avatar
Berichten: 4608
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Druksensor uitlezen

Berichtdoor nicoverduin » 25 Jul 2017, 23:33

Voor het goede zou je ook een float van press moeten maken. Casting heet dat
Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 10
Geregistreerd: 02 Mrt 2014, 11:38
Woonplaats: Winschoten

Re: Druksensor uitlezen

Berichtdoor doddema74 » 26 Jul 2017, 09:24

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.

Gebruikers-avatar
Berichten: 4608
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Druksensor uitlezen

Berichtdoor nicoverduin » 26 Jul 2017, 11:07

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.
Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 1452
Geregistreerd: 06 Aug 2016, 01:03

Re: Druksensor uitlezen

Berichtdoor Koepel » 26 Jul 2017, 15:48

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:
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 :roll:

Berichten: 10
Geregistreerd: 02 Mrt 2014, 11:38
Woonplaats: Winschoten

Re: Druksensor uitlezen

Berichtdoor doddema74 » 29 Jul 2017, 13:23

Heb beide opties geprobeerd en in 1 sketch samengevoegd ;) beiden geven me het zelfde resultaat
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

Gebruikers-avatar
Berichten: 1452
Geregistreerd: 06 Aug 2016, 01:03

Re: Druksensor uitlezen

Berichtdoor Koepel » 29 Jul 2017, 19:56

Ik had in mijn voorbeeld een haakje teveel staan.

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.

Vorige

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten