Druksensor uitlezen
17 berichten
• Pagina 1 van 2 • 1, 2
Druksensor uitlezen
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.
en heb het proberen te vertalen naar arduino code
alvast bedankt voor de moeite
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
Re: Druksensor uitlezen
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).
Kun je ook de output van je serial prints posten zodat we kunnen zien wat er gebeurd (of mis gaat).
Re: Druksensor uitlezen
Hoe krijg je het voor elkaar om zo'n vreemde druksensor te willen gaan gebruiken
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.
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);
}
Re: Druksensor uitlezen
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.
maar moest zonder toevoeging zijn
Heb met Koepels code mijn code aangepast en het lijkt erop dat ik de sensor nu goed in raw format goed kan uitlezen.
hier een sensor uitdraai met deze code
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
Re: Druksensor uitlezen
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 liggendoddema74 schreef:ik heb er een stuk of 10 van gekregen dus......
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.
Re: Druksensor uitlezen
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
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..
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..
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Druksensor uitlezen
Die s kun je veranderen boven in als const s = en dan ff dat getal uitrekenen. Max 7 cijfers
Re: Druksensor uitlezen
Kun je die regel:
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
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 ?
- Code: Alles selecteren
// while (Wire.available() < 2 ); // Check for data from slave
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
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 ?
Re: Druksensor uitlezen
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
Serial Dump
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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Druksensor uitlezen
En als je van press een int maak of een long?
17 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Google Adsense [Bot] en 3 gasten