Nieuw lid + vraag over software omtrent luchtdrukmeter.

Arduino specifieke Software
Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Koepel » 16 Okt 2020, 14:58

Oh nee :o je hebt het belangrijkste weggelaten.
Het noemen waar de getallen vandaan komen is belangrijker dan de code zelf.
Ik had er beter nog bij kunnen schrijven: "// Volgens de Bosch datasheet:".
En met "4.65 - 0.40" bedoel ik een "min", dus het bereik van het voltage is (4.65-0.4) = 4.25V.
Maar die "4.25V" gebruik ik niet, laat de compiler dat maar uitzoeken, het is belangrijker om de getallen uit de datasheet te laten zien.

Kun je dit boven de berekening zetten ?

Code: Alles selecteren
// Bosch DS-S2
// -----------------
// Volgens de Bosch datasheet:
// 5V, 20 kPa = 0.40V, 250 kPa = 4.65V.
// Voltage range = 4.65 - 0.40   (4.65V minus 0.40V)
// Pressure range = 250 - 20  (250 kPa minus 20 kPa)
//
// Verwijder de offset, leg het bereik op elkaar en tel de nieuwe offset er weer bij op.
// Het bereik op elkaar leggen is delen door het voltagebereik en vermenigvuldigen met het bereik van de druk.
// Door te delen met het voltage, verdwijnt het voltage.
// Door te vermenigvuldigen met de druk, wordt de druk geintroduceerd.


De getallen voor druk (in kPa) en voltage (in V) zijn 20, 0.40, 250, 4.65V.
Die komen dus uit de datasheet.

Als het resultaat er een beetje naast zit, kun na al de gewone berekeningen een correctie doen. Een beetje "tunen" is wel vaker nodig.

Je kunt meerdere samples nemen om de ruis weg te werken.
Een functie daarvoor staat bijvoorbeeld hier: https://gist.github.com/Koepel/f7d625a6e5c0481fc4c7a9c530c643ef.
Ik zou geen 1000 samples nemen, maar iets tussen de 5 en 100.
Bijvoorbeeld 20:
Code: Alles selecteren
const int nSamples = 20;   // Usually from 5 to 10000


Die functie geeft een 'float' terug, en geen integer zoals de analogRead(). Het is beter om dat dan ook niet in een integer te stoppen, want dan zou er extra informatie verloren kunnen gaan.

Bijvoorbeeld met een variabele 'adcValue'.
Code: Alles selecteren
float adcValue = averageRead(A0);    //lezen van de waarde van de luchtdruksensor.
float voltage = adcValue / 1024.0 * 5.0; //waarde als VCC 5volt zou zijn.


De regel om het voltage te berekenen heb je gewijzigd, nu staat er heel wat anders. Waarom die wijziging ? Volgens mij kun je daarmee geen druk meten.

Advertisement

Berichten: 15
Geregistreerd: 14 Okt 2020, 12:57

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Adriaan_VOLVO940 » 23 Okt 2020, 15:10

Helaas kom ik toch niet echt verder. De formule had ik aangepast omdat die in de vorm zoals jij hem had neergezet een foutcode opleverde bij het uploaden.

Code: Alles selecteren
// 15-10-2020
// fake arduino nano
// Luchtdruksensor 0 281 002 593 aangesloten op A0
// Bosch DS-S2
// -----------------
// Volgens de Bosch datasheet:
// 5V, 20 kPa = 0.40V, 250 kPa = 4.65V.
// Voltage range = 4.65 - 0.40   (4.65V minus 0.40V)
// Pressure range = 250 - 20  (250 kPa minus 20 kPa)
// Verwijder de offset, leg het bereik op elkaar en tel de nieuwe offset er weer bij op.
// Het bereik op elkaar leggen is delen door het voltagebereik en vermenigvuldigen met het bereik van de druk.
// Door te delen met het voltage, verdwijnt het voltage.
// Door te vermenigvuldigen met de druk, wordt de druk geintroduceerd.


void setup() {
  // put your setup code here, to run once:

  Serial.begin(9600);

}

void loop() {
// put your main code here, to run repeatedly:

//int BoostsensorValue = analogRead(A0); //lezen van de waarde van de luchtdruksensor
//Serial.println(BoostsensorValue); //weergeven van de analoge waarde in de seriele monitor
//delay(1); //vertraging tussen de metingen van de seriele monitor

//  const int nSamples = 20;   // Usually from 5 to 10000

 // float adcValue = averageRead(A0);    //lezen van de waarde van de luchtdruksensor.
//  float voltage = adcValue / 1024.0 * 5.0; //waarde als VCC 5volt zou zijn.

  int rawADC = analogRead(A0); //lezen van de waarde van de luchtdruksensor.
  float voltage = float( rawADC) / 1024; * 5.0;   // de waarde als VCC ook echt 5.0V zou zijn.
  float kPa = (((voltage-0.40) / (4.65 - 0.40)) * (250.0 - 20.0)) + 20; //onbekend voor mij waar de waardes vandaan komen?
  float bar = (kPa / 100.0); //omrekenen van Kpa naar bar.
  Serial.println(bar); //kopieren naar seriele monitor.
  delay(1);
}

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

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Koepel » 23 Okt 2020, 16:19

De compiler geeft precies aan waar hij tegenaan loopt.
Je kunt eventueel de uitgebreide uitvoer aanzetten bij de instellingen.

De knip links van de Upload-knop is de Verify-knop. Dan kun je het compileren proberen zonder te uploaden.

Dit zegt de compiler:
plain code
testsketch.ino: In function 'void loop()':
testsketch:36:44: error: invalid type argument of unary '*' (have 'double')
float voltage = float( rawADC) / 1024; * 5.0; // de waarde als VCC ook echt 5.0V zou zijn.
^~~


Oeps :oops: Sorry, ik heb daar in mijn voorbeeld een ';' halverwege de regel gezet.
Kun je die ';' na de 1024 weghalen en er "1024.0" van maken ?

Dus dan wordt het:
Code: Alles selecteren
float voltage = float( rawADC) / 1024.0 * 5.0;

Berichten: 15
Geregistreerd: 14 Okt 2020, 12:57

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Adriaan_VOLVO940 » 24 Okt 2020, 15:49

Bedankt Koepel, dat was dus het probleem. seriele monitor geeft nu netjes alles weer en reageert op druk/vacuum. Echter Zit er nog geen atmosferische correctie ingebouwd. Hij geeft nu 1,04 aan en af en toe 1,05. Op dit moment is volgens mijn telefoon de atmosferische druk 1,0047 bar. welke getallen kan ik ''tunen'' om te zorgen dat die netjes overeenkomt de de atmosferische druk. En hoe zet ik hem vervolgens op 0. Simpelweg de huidige atmosferische druk eraf halen? Dat zou wel resulteren in minder nauwkeurige metingen omdat de atmosferische druk verandert. Ik hoor graag van je. Code is nu trouwens als volgt:

Code: Alles selecteren
// 15-10-2020
// fake arduino nano
// Luchtdruksensor 0 281 002 593 aangesloten op A0
// Bosch DS-S2
// -----------------
// Volgens de Bosch datasheet:
// 5V, 20 kPa = 0.40V, 250 kPa = 4.65V.
// Voltage range = 4.65 - 0.40   (4.65V minus 0.40V)
// Pressure range = 250 - 20  (250 kPa minus 20 kPa)
// Verwijder de offset, leg het bereik op elkaar en tel de nieuwe offset er weer bij op.
// Het bereik op elkaar leggen is delen door het voltagebereik en vermenigvuldigen met het bereik van de druk.
// Door te delen met het voltage, verdwijnt het voltage.
// Door te vermenigvuldigen met de druk, wordt de druk geintroduceerd.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
int OLED_RESET = 4;
Adafruit_SSD1306 display(OLED_RESET);

void setup() {
  // put your setup code here, to run once:

  Serial.begin(9600);

    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.clearDisplay() ;
    display.setTextColor(WHITE);
    display.setTextSize(3) ;
    display.setCursor(15,10) ; //positie Hallo
    display.print("Hallo") ;
    display.display();
    delay(2000) ; //vertraging tussen weergeven Hallo en Volvo 940 TURBO
    display.clearDisplay();
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.setCursor(0,0); //positie Volvo 940 TURBO
    display.print("Volvo 940 TURBO");
    display.display();
    delay(5000); //vertraging tussen weergeven Volvo 940 TURBO en boost
 
}

void loop() {

//  const int nSamples = 20;   // Usually from 5 to 10000 //functie voor mij nog onbekend?
//  float adcValue = averageRead(A0);    //lezen van de waarde van de luchtdruksensor.
//  float voltage = adcValue / 1024.0 * 5.0; //waarde als VCC 5volt zou zijn.

  int rawADC = analogRead(A0); //lezen van de waarde van de luchtdruksensor.
  float voltage = float( rawADC) / 1024.0 * 5.0;   // de waarde als VCC ook echt 5.0V zou zijn.
  float kPa = (((voltage-0.40) / (4.65 - 0.40)) * (250.0 - 20.0)) + 20; //berekeningen volgens Bosch datasheet
  float bar = (kPa / 100.0); //omrekenen van Kpa naar bar.
  Serial.println(bar); //kopieren naar seriele monitor.
  delay(5);
 
    display.display();
    display.clearDisplay();
    display.setTextSize(3);
    display.setCursor(0, 10);
    display.println(bar);  //weergeven luchtdruk op oled
 
}

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor shooter » 24 Okt 2020, 19:29

de 0.40 wat preciezer definieren bijv 0.4002 en dan kun je de getallen dus preciezer hebben. je hebt 0.1 % precisie maximaal.
dat kun je dus ook doen voor die 4.65 maak daar eens 4.651 van enzovoort.
zet al die getallen in variabelen boven de setup dan kun je ze makkelijker vervangen.
je kunt ook de drukken wijzigen natuurlijk, maar dan moet je meten zoals die 20 veranderen in 20.001.
als je de begindruk weet zoals 1.0047 dan kun je die gebruiken door die in te vullen als nulpunt.
paul deelen
shooter@home.nl

Berichten: 15
Geregistreerd: 14 Okt 2020, 12:57

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Adriaan_VOLVO940 » 25 Okt 2020, 17:00

Hallo Shooter, bedankt voor je reactie. Ik heb beide getallen aangepast, naar 0,4000 en 4,6500 nu is de waarde netjes constant op 1,04. Het is mij nog niet duidelijk hoe ik deze waarde goed kan corrigeren. Hoe maak ik een nulpunt aan?

Berichten: 15
Geregistreerd: 14 Okt 2020, 12:57

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Adriaan_VOLVO940 » 28 Okt 2020, 14:11

Niemand die mij verder kan helpen? Hoe zorg ik ervoor dat de waarde gecorrigeerd wordt met de atmosferische druk? Zoals Shooter aangeeft met een 0 punt, maar hoe zet ik dat in het software?

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor shooter » 29 Okt 2020, 12:10

die 0.4000 is dus de waarde die bij 0 bar hoort bijvoorbeeld. maak er eens 0.41 van en zo tot 0.5
of maak er eens een negatief getal van. zoals -0.1001 dat kan als het een float is. (en dat is zo).
je maakt een omrekening van een getal (tot 1023) naar een andere waarde en dat kan ook direct dus bijvoorbeeld 12 is 0 bar en 987 is 2 bar, maar dat mag je zelf uitpuzzelen want daar leer je van en dat is de hele opzet van arduino
paul deelen
shooter@home.nl

Berichten: 15
Geregistreerd: 14 Okt 2020, 12:57

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Adriaan_VOLVO940 » 29 Okt 2020, 17:49

Bedankt shooter voor je reactie. Ik heb een nieuwe regel toegevoegd in de code. De correctie van 400.75 heb ik berekend aan de hand van de bestaande formules. De meter geeft nu netjes 0.0 aan maar flikkert nog wel een beetje van -0.00 naar 0.01. Kan ik dit er nog beter uitfilter?

Code: Alles selecteren
// 15-10-2020
// fake arduino nano
// Luchtdruksensor 0 281 002 593 aangesloten op A0
// Bosch DS-S2
// -----------------
// Volgens de Bosch datasheet:
// 5V, 20 kPa = 0.40V, 250 kPa = 4.65V.
// Voltage range = 4.65 - 0.40   (4.65V minus 0.40V)
// Pressure range = 250 - 20  (250 kPa minus 20 kPa)
// Verwijder de offset, leg het bereik op elkaar en tel de nieuwe offset er weer bij op.
// Het bereik op elkaar leggen is delen door het voltagebereik en vermenigvuldigen met het bereik van de druk.
// Door te delen met het voltage, verdwijnt het voltage.
// Door te vermenigvuldigen met de druk, wordt de druk geintroduceerd.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
int OLED_RESET = 4;
Adafruit_SSD1306 display(OLED_RESET);

//barpeak = bar;
//int barpeakReset = 10000 ;


void setup() {
  // put your setup code here, to run once:

    Serial.begin(9600);
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.clearDisplay() ;
    display.setTextColor(WHITE);
    display.setTextSize(3) ;
    display.setCursor(15,10) ; //positie Hallo
    display.print("Hallo") ;
    display.display();
    delay(2000) ; //vertraging tussen weergeven Hallo en Volvo 940 TURBO
    display.clearDisplay();
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.setCursor(0,0); //positie Volvo 940 TURBO
    display.print("Volvo 940 TURBO");
    display.display();
    delay(5000); //vertraging tussen weergeven Volvo 940 TURBO en boost
 
}

void loop() {

   const int nSamples = 20;   // Usually from 5 to 10000 //functie voor mij nog onbekend?


   int rawADC = analogRead(A0); //lezen van de waarde van de luchtdruksensor.
   float corADC = ( rawADC - 400.75); //atmosferische correctie.
   float voltage = float( corADC) / 1024.0 * 4.78 ;   // VCC gemeten op arduino is 4.78.
   float kPa = (((voltage-0.4000) / (4.6500 - 0.4000)) * (250.0 - 20.0)) + 20; //berekeningen volgens Bosch datasheet
   float bar = (kPa / 100.0); //omrekenen van Kpa naar bar.
   Serial.println(voltage); //kopieren naar seriele monitor.
   delay(1);  //vertraging tussen metingen seriele monitor.

  //weergeven luchtdruk op oled
    display.display();
    display.clearDisplay();
    display.setTextSize(3);
    display.setCursor(0, 10);
    display.println(bar); 

   // if ((bar) > 0) {
   // display.setTextSize(1);
   // display.setCursor(97, 20);
   // display.println("PEAK");
   // display.setTextSize(1);
   // display.setCursor(97,05);
   // display.println(barpeak);
   }
 


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

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Koepel » 29 Okt 2020, 19:42

Als die sensor ratiometric is, dan moet je de berekening doen met 5.0 V. Was dat al duidelijk of was dat nog onduidelijk ? Is die sensor ratiometric of niet :?
Nu heb je daar 4.78V voor gebruikt, maar dan kloppen de gegevens uit de datasheet niet meer met de berekening. De gegevens van de datasheet zijn bij 5V. Als je die berekening doet met 5V, dan valt die 5V weg uit de berekening.

De ruis kun je er uit filteren door het gemiddelde te nemen van meerdere samples.
Het is gebruikelijk om dat te doen bij een analoog signaal.

Met het gemiddelde van slechts 5 samples krijg je al een goede verbetering. Misschien kun eerst 20 samples proberen.
Tel ze allemaal bij elkaar op, delen door 20 dan heb je het gemiddelde.

Als je wilt, dan kun je mijn "averageRead()" functie gebruiken, die heeft ook nog een halve bit correctie.
https://gist.github.com/Koepel/f7d625a6e5c0481fc4c7a9c530c643ef.
(Ik heb ditzelfde pas nog zitten typen, maar ik kan het niet meer vinden).
[Aanvulling] Oh, het staat hierboven al in mijn bericht van 16 Okt 2020, 14:58.

Die functie geeft een 'float' terug, dus die niet omzetten naar een 'int', want dan verlies je informatie.
Ik zou het aantal op 20 zetten: const int nSamples = 20;

Code: Alles selecteren
// oud
int rawADC = analogRead(A0); // lezen van de waarde van de luchtdruksensor.
float voltage = float( rawADC) / 1024.0 * 5.0;   // VCC gemeten op arduino is 4.78.

// nieuw
float average = averageRead( A0);
float voltage = average / 1024.0 * 5.0;  // The 5.0 is the virtual 5.0V for the calculation


Een atmospherische correctie hoort in kPa te zijn. Je gaat nu de ADC waarde wijzigen nog voordat er een berekening is gedaan. Die ADC waarde is de bron van alle gegevens, dus daar kun je beter niet aan rommelen. Helemaal op het eind als je de waarde in kPa weet, dan kun je er een bepaalde offset af halen.

[Aanvulling]
Ratiometric betekent dat het signaal (de uitgangsspanning) van de sensor in verhouding staat tot de 5V spanning. Dus als de 5V 20% lager zou zijn, dan wordt ook het signaal van de sensor 20% lager.
Bij een Arduino pakt dat goed uit. Stel dat de ruwe ADC waarde 256 is, dus 1/4 van de 5V. De Arduino heeft de 5V als referentie. Dus als de 5V 20% lager is dan is het 4.0V. De sensor geeft ook een signaal dat 20% lager is, dan meet de ADC nog steeds 1/4 van de 4.0V en is de ADC waarde nog steeds 256.
De ruwe ADC waarde blijft hetzelfde, ook als de 5V varieert.

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 28 gasten