Druksensor uitlezen

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

Druksensor uitlezen

Berichtdoor doddema74 » 23 Jul 2017, 15:11

Hallo allen,

ben bezig om een druksensor uit te lezen dmv TWI / I2C maar heb het idee dat ik niet helemaal goed uitvoer!?
het type sensor is een HYB HPSD 3002 027m-d-o-p-s
Wie kan er even over mijn code heen kijken ??

Onderstaande in de voorbeeld code die ik bij de sensor vinden kan.

Code: Alles selecteren
 
byte msb, lsb; // 2 x 8bit values
int16 pressure; // 1 x 16bit value
// Set I2C unit to I2C master mode, clock speed 100 kHz and 7 bit addressing
configureI2C (I2C_MASTER | CLK_SPEED_100KHZ | ADDRESSING_7BIT);
// Set the target default slave address (0x78 = 120dec)
I2C_set_target(0x78);
// Send start condition (slave)
I2C_send_start_read();
// Read first data byte (msb) & answer with ACK (continue communication)
I2C_read (&msb, SEND_ACK);
// Read second data byte (lsb) and answer with NACK (end communication)
I2C_read (&lsb, SEND_NACK);
// Send stop condition
I2C_send_stop();
// Put both values together
pressure = ((int16)msb << 8) | lsb;


en heb het proberen te vertalen naar arduino code
Code: Alles selecteren
#include "Wire.h"
#define addrs 0x78 // I2C bus address

byte lobyte;
byte hibyte;
int Press;
//  int x = 0;

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  Serial.println("Starting");
}

void loop()
{

  Wire.beginTransmission(addrs);
  Wire.write(1);

  Wire.requestFrom(addrs, 2); // contents of your first two registers
  while (Wire.available() < 2 );         // Check for data from slave

  hibyte = Wire.read();       // Read high byte
  Serial.print("High Byte: ");
  Serial.print(hibyte, DEC);
  lobyte = Wire.read();      // Read low byte
  Serial.print(" Low Byte: ");
  Serial.print(lobyte, DEC);

  Press = (hibyte * 256 + lobyte) & 0x3FFF;
  Serial.print(" Pressure: ");
  Serial.println(Press);
  delay(1000);

}



alvast bedankt voor de moeite

Advertisement

Gebruikers-avatar
Berichten: 100
Geregistreerd: 23 Dec 2011, 00:11
Woonplaats: Enschede

Re: Druksensor uitlezen

Berichtdoor bigred » 23 Jul 2017, 17:10

Past Press wel in een int ?
Kun je ook de output van je serial prints posten zodat we kunnen zien wat er gebeurd (of mis gaat).

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

Re: Druksensor uitlezen

Berichtdoor Koepel » 23 Jul 2017, 18:38

Hoe krijg je het voor elkaar om zo'n vreemde druksensor te willen gaan gebruiken :o
Dit is de bladzijde over de 3000 serie van de fabrikant: http://hyb.si/series-3000.html
De application note is het meest interessante.
Er zit dus ook een temperatuur in, en er is een berekening nodig.

De voorbeeld code is eenvoudig, er kan niet naar de sensor geschreven worden, alleen 4 bytes lezen. Dat is alles.
Heb je die voorbeeld code uit de application note gekopieerd zonder ons te vertellen dat er een application note is :?

Kijk eerst eens of je contact met de sensor kunt maken, met de i2c scanner : https://playground.arduino.cc/Main/I2cScanner.
Laat die sketch eens draaien, en als het goed is vind je 0x78 of 0x3C.
Het I2C adres wat daar uit komt, dat ga je gebruiken.

Code: Alles selecteren
#include <Wire.h>

const int addrs  = 0x78;   // I2C bus address of sensor

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  Serial.println("Starting");
}

void loop()
{
  Wire.requestFrom(addrs, 4);       // read 4 bytes from sensor

  if( Wire.available() == 4)    // are 4 bytes received ?
  {
    int hibyte = Wire.read();       // Read high byte
    int lobyte = Wire.read();      // Read low byte
    uint16_t press = word(hibyte, lobyte);

    int hibyte = Wire.read();       // Read high byte
    int lobyte = Wire.read();      // Read low byte
    uint16_t temperature = word(hibyte, lobyte);

    Serial.print("Raw Pressure data: ");
    Serial.println(Press);
    Serial.print("Raw Temperature data: ");
    Serial.println(temperature);
  }
  else
  {
    Serial.println("Oeps, I2C ging fout");
  }

  delay(1000);
}

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

Re: Druksensor uitlezen

Berichtdoor doddema74 » 23 Jul 2017, 20:16

Bedankt Bigred & Koepel voor jullie reactie

De keuze voor deze sensoren is voor mij simpel, ik heb er een stuk of 10 van gekregen dus......
en inderdaad die voorbeeld code heb ik uit de application note gekopieerd
en het was inderdaad handig geweest deze bij te voegen.
trouwens als ik geen * 256 toevoeg achter mijn hibyte krijg ik ook geen juiste waarde.

in mijn eerste post kon ik de sensor op druk al in raw format uitlezen echter kwam ik niet op mijn 15 bit waardes uit.
Code: Alles selecteren
Press = (hibyte * 256 + lobyte) & 0x3FFF;


maar moest zonder toevoeging zijn

Code: Alles selecteren
Press = (hibyte * 256 + lobyte)


Heb met Koepels code mijn code aangepast en het lijkt erop dat ik de sensor nu goed in raw format goed kan uitlezen.

Code: Alles selecteren
#include "Wire.h"
#define addrs 0x78 // I2C bus address

int Press;
int Temp;

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  Serial.println("Starting");
}
void loop()
{
  Wire.requestFrom(addrs, 4); // contents of your first two registers
  while (Wire.available() < 4 );         // Check for data from slave

  int hipbyte = Wire.read();       // Read high byte
  int lopbyte = Wire.read();      // Read low byte
  uint16_t Press = word(hipbyte * 256 + lopbyte);

  int hitbyte = Wire.read();       // Read high byte
  int lotbyte = Wire.read();      // Read low byte
  uint16_t Temp = word(hitbyte * 256 + lotbyte);

  Serial.print("High Byte: ");
  Serial.print(hipbyte, DEC);
  Serial.print(" Low Byte: ");
  Serial.print(lopbyte, DEC);
  Serial.print(" High Byte: ");
  Serial.print(hitbyte, DEC);
  Serial.print(" Low Byte: ");
  Serial.print(lotbyte, DEC);
  Serial.print(" Pressure: ");
  Serial.print(Press);
  Serial.print(" Temp: ");
  Serial.println(Temp);
  delay(1000);
}


hier een sensor uitdraai met deze code

Code: Alles selecteren
High Byte: 12 Low Byte: 239 High Byte: 1 Low Byte: 8 Pressure: 3311 Temp: 264
High Byte: 12 Low Byte: 245 High Byte: 1 Low Byte: 8 Pressure: 3317 Temp: 264
High Byte: 12 Low Byte: 239 High Byte: 1 Low Byte: 8 Pressure: 3311 Temp: 264
High Byte: 12 Low Byte: 245 High Byte: 1 Low Byte: 8 Pressure: 3317 Temp: 264
High Byte: 12 Low Byte: 243 High Byte: 1 Low Byte: 4 Pressure: 3315 Temp: 260
High Byte: 12 Low Byte: 243 High Byte: 1 Low Byte: 12 Pressure: 3315 Temp: 268
High Byte: 12 Low Byte: 243 High Byte: 1 Low Byte: 0 Pressure: 3315 Temp: 256
High Byte: 12 Low Byte: 249 High Byte: 1 Low Byte: 8 Pressure: 3321 Temp: 264
High Byte: 12 Low Byte: 246 High Byte: 1 Low Byte: 0 Pressure: 3318 Temp: 256
High Byte: 12 Low Byte: 247 High Byte: 1 Low Byte: 8 Pressure: 3319 Temp: 264

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

Re: Druksensor uitlezen

Berichtdoor Koepel » 23 Jul 2017, 22:01

doddema74 schreef:ik heb er een stuk of 10 van gekregen dus......
Je kunt ze weggooien en meer gangbare druksensors kopen. Ik heb 10 doperwten, die ga ik ook niet aan een Arduino verbinden omdat ik ze heb liggen :lol:

Zou je deze regel weg willen halen ? Het hoort er niet. Er is niets om op te wachten.
doddema74 schreef:
Code: Alles selecteren
while (Wire.available() < 4 );         // Check for data from slave


Werkt de word(h,l); niet meer ? Dat zou toch echt nog moeten werken.
https://www.arduino.cc/en/Reference/WordCast
Kun je alsnog proberen om het te doen zoals ik deed ? Dus met een komma er tussen.

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

Re: Druksensor uitlezen

Berichtdoor doddema74 » 24 Jul 2017, 15:26

Hallo Koepel

over die Sensors, ik ben er blij mee heb een laag budget om te hobbyen en was redelijk simpel achteraf om hem uit te lezen..

maar idd de code van jouw werkt naar behoren

Code: Alles selecteren
#include "Wire.h"
#define addrs 0x78 // I2C bus address

float Press;


void setup()
{
  Wire.begin();
  Serial.begin(9600);
  Serial.println("Starting");
}
void loop()
{
  Wire.requestFrom(addrs, 2); // contents of your first four registers
  //  while (Wire.available() < 2 );         // Check for data from slave

  int hipbyte = Wire.read();       // Read high byte
  int lopbyte = Wire.read();       // Read low byte
  uint16_t Press = word(hipbyte, lopbyte);

  float s = (29491 - 3365) / 270;
  delay(500);
  float p = (Press - 3365) / s;
  delay(500);

  Serial.print("RAW Pressure: ");
  Serial.print(Press);
  Serial.print("Pressure: ");
  Serial.println(p);
  delay(100);
}


heb een BLAUWE LIJN S2601 als referentie/controle meter gebruikt en ik moet zeggen t'is zo goed als gelijkwaardige uitlezing.
al met al ben er tevreden mee.

bedankt voor de hulp..

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

Re: Druksensor uitlezen

Berichtdoor nicoverduin » 24 Jul 2017, 15:52

Die s kun je veranderen boven in als const s = en dan ff dat getal uitrekenen. Max 7 cijfers
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Druksensor uitlezen

Berichtdoor Koepel » 24 Jul 2017, 23:36

Kun je die regel:
Code: Alles selecteren
//  while (Wire.available() < 2 );         // Check for data from slave
helemaal weg halen ? Voor je het weet zit die er weer in.

Dus de fabrikant heeft de sensor in de fabriek goed gekalibreerd. Dat is mooi.

Na "float s" en "float p" heb je een delay van 500ms. Is dat om de Arduino te laten bijkomen van een floating point berekening :lol:

De temperatuur ook opvragen kost maar een klein beetje meer tijd. Ik zou die meteen meenemen. Als was het alleen maar als extra controle.

Als de sensor niet is aangesloten, dan ga je toch de druk berekenen. Je kunt een Wire.available() gebruiken om te kijken of het juiste aantal bytes hebt ontvangen. De variable "Press" heb je globaal en lokaal gedefinieerd als twee verschillende types. Kun je die globale verwijderen ?

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

Re: Druksensor uitlezen

Berichtdoor doddema74 » 25 Jul 2017, 20:53

Heb de code aangepast en kom nu op het volgende uit,
alles werkt nog steeds naar behoren maar als mijn RAW waarde onder de 3360 komt
gaat mijn druk uitlezing niet negatief aangeven maar iets van 677. nog wat.

ben druk hier mee bezig geweest om het uit te vogelen maar kom er niet achter.
hieonder de code en de serial dump

Code: Alles selecteren
#include "Wire.h"
#define addrs 0x78 // I2C bus address

const float s = 96.7814;      // s = (29491 - 3360) / 270;

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

    float p = (Press - 3360) / s;

    Serial.print("RAW Pressure: ");
    Serial.print(Press);
    Serial.print(" Pressure: ");
    Serial.print(p, 2);
    Serial.print(" Temp: ");
    Serial.println(Temp);
  }
  else
  {
    Serial.println("Oeps, I2C ging fout");
  }
  delay(1000);
}


Serial Dump

Code: Alles selecteren
RAW Pressure: 3365 Pressure: 0.05 Temp: 260
RAW Pressure: 3371 Pressure: 0.11 Temp: 260
RAW Pressure: 3359 Pressure: 677.14 Temp: 252
RAW Pressure: 3363 Pressure: 0.03 Temp: 256
RAW Pressure: 3359 Pressure: 677.14 Temp: 268
RAW Pressure: 3361 Pressure: 0.01 Temp: 260
RAW Pressure: 3369 Pressure: 0.09 Temp: 260
RAW Pressure: 3365 Pressure: 0.05 Temp: 264
RAW Pressure: 3359 Pressure: 677.14 Temp: 256
RAW Pressure: 3358 Pressure: 677.13 Temp: 268
RAW Pressure: 3363 Pressure: 0.03 Temp: 260
RAW Pressure: 3359 Pressure: 677.14 Temp: 260
RAW Pressure: 3369 Pressure: 0.09 Temp: 264
RAW Pressure: 3365 Pressure: 0.05 Temp: 260
RAW Pressure: 3361 Pressure: 0.01 Temp: 260
RAW Pressure: 3369 Pressure: 0.09 Temp: 260

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

Re: Druksensor uitlezen

Berichtdoor nicoverduin » 25 Jul 2017, 22:04

En als je van press een int maak of een long?
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 2 gasten