Nieuw lid + vraag over software omtrent luchtdrukmeter.

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

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor shooter » 30 Okt 2020, 11:20

ja koepel heeft daar gelijk in, echter neemt dan de snelheid af, het ligt er maar aan wat je meet, als het pulsen zijn dan vaak metingen verrichten en die bijvoorbeeld in een tabel zetten, en het is maar een klein, goedkoop ding dus een beetje veranderen is heel normaal.
paul deelen
shooter@home.nl

Advertisement

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

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Adriaan_VOLVO940 » 30 Okt 2020, 14:01

''Averageread was not declared in this scope'' Hoe zet ik een averageread in de code, dus de berekening om van een sample meerdere samples te nemen en vervolgens een averageread?

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
 
 // float average = analogRead(A0); //lezen van de waarde van de luchtdruksensor.
 // float voltage = (average) / 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(1);  //vertraging tusse metingen seriele monitor.

{
  Serial.print( "one sample = ");
  int raw = analogRead( A0);
  Serial.println( raw);

  Serial.print( "average    = ");
  float average = averageRead( A0);
  Serial.println( average);

  Serial.print( "voltage    = ");
  // use 1024 and the reference voltage that you use.
  float voltage = average / 1024.0 * 5.0;
  Serial.println( voltage);
  Serial.println();

  delay( 1000);
}

// --------------------------------------------
// averageRead()
// --------------------------------------------
// By using 'float' numbers for the average,
// it is possible to get more bits than
// the 10 or 12 bits that is returned by analogRead().
//
// The total of the samples is not done with float, because
// then bits could get lost.
// Only at the end, the floating point calculation is done.
//
// When the voltage is calculated, use 1024, not 1023.
// The "half a bit" is explained here: https://www.gammon.com.au/adc


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

float averageRead( int A0)
{
  unsigned long total = 0;

  for( int i=0; i<nSamples; i++)
  {
    total += (unsigned long) analogRead( A0);
  }

  total += nSamples / 2;   // add half a bit
 
  return( float( total) / float( nSamples));
}
  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(1);  //vertraging tusse metingen seriele monitor.

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

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

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Koepel » 31 Okt 2020, 01:00

Kijk nog eens naar die sketch: https://gist.github.com/Koepel/f7d625a6e5c0481fc4c7a9c530c643ef.
Het zijn drie afzonderdelijke functies: setup(), loop(), en averageRead().
Ik ga ze niet eerst door een blender halen om de compiler op de kast te jagen.

Het is in de taal 'c' niet toegestaan om een functie te maken en die zomaar ergens binnen een andere functie neer te zetten.

Het gaat mis bij je stijl van je tekst.
In de taal 'c' geldt niet een bepaalde stijl als de beste. Kies voor een stijl die je aanspreekt en blijf daar bij.

Hieronder zie je twee soorten stijlen:

cpp code
void loop() {
for (int i=0; i<8; i++) {
Serial.println("Hello");
}
}

void loop()
{
for( int i=0; i<8; i++)
{
Serial.println( "Hello");
}
}


Als je naar je sketch gaat, en je maakt het netjes, dan werkt het. Zet het inspringen, het gebruik van haakjes, iedere spatie en iedere komma goed.

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

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Adriaan_VOLVO940 » 01 Nov 2020, 21:32

Netter gemaakt en een gemiddelde toegevoegd. Nu geeft hij netjes 0.00 aan af en toe springt hij nog naar 0.01. Daar ben ik opzich tevreden genoeg mee. Het corrigeren van de atmosferische druk heb ik nu dus gedaan door simpelweg de 1.04 af te trekken van de berekende druk zie de regel: //float barCorr = (bar - 1.04);
Dit is denk ik niet de meest nauwkeurige manier maar het functioneert. Graag hoor ik of het geheel nu een beetje kloppend is en of er nog verbeteringen nodig/mogelijk zijn.

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.

// Define the number of samples to keep track of. The higher the number, the
// more the readings will be smoothed, but the slower the output will respond to
// the input. Using a constant rather than a normal variable lets us use this
// value to determine the size of the readings array.

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

const int numReadings = 4; //hoe hoger het getal hoe trager de response, maar hoe stabieler het signaal.

int readings[numReadings];      // the readings from the analog input
int readIndex = 0;              // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average

int inputPin = A0;

void setup() {

    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

Serial.begin(9600);
  // initialize all the readings to 0:
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {
 
  // subtract the last reading:
  total = total - readings[readIndex];
  // read from the sensor:
  readings[readIndex] = analogRead(inputPin);
  // add the reading to the total:
  total = total + readings[readIndex];
  // advance to the next position in the array:
  readIndex = readIndex + 1;

  // if we're at the end of the array...
  if (readIndex >= numReadings) {
    // ...wrap around to the beginning:
    readIndex = 0;
  }

  // calculate the average:
  average = total / numReadings;
  // send it to the computer as ASCII digits
  Serial.println(average);
  delay(1);        // delay in between reads for stability

  int rawADC = average; //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.
  float barCorr = (bar - 1.0350); //correctie van de atmosferische druk.
  Serial.println(barCorr); //kopieren naar seriele monitor.
  delay(1);

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

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

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Koepel » 02 Nov 2020, 11:23

Je hebt mijn averageRead() ingewisseld voor een rolling average :(
Om alleen de elektronische ruis weg te werken was mijn averageRead() voldoende.

Ik heb geschreven dat mijn averageRead() een 'float' terug geeft.
Normaal geeft de analogRead() een waarde van 0 ... 1023. Mijn averageRead() kan bijvoorbeeld ook 0.1 or 0.5 terug geven, mits je het niet meer omzet naar integers. Je hebt dan extra informatie. Door gebruik te maken van de ruis krijg je extra informatie en kun je nauwkeuriger meten dan de 10-bit van de microcontroller.

In jouw sketch gebruik je integers, terwijl je met die rolling average ook wat extra informatie hebt.
Als je goed weet wat de compiler doet en waar je de omzetting doet naar 'float', dan kun je die extra informatie behouden.

Een rolling average met 4 samples ? Pffft, dat is weinig. Kun je er 10 van maken ?

In setup() vul je het array met 0. Maar nul is maar nul ;)
Je zou het array kunnen vulling met analogRead() om een vliegende start te maken.

In je loop() staan twee delay(1), dat komt vreemd over samen met de Serial.println() en de baudrate van 9600.
Je kunt die delay(1) weghalen, en helemaal onder in de loop() een delay(50) of zo.
Je kunt de baudrate zetten op 115200, maar zet dan ook de seriële monitor van de Arduino IDE op 115200.

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

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Adriaan_VOLVO940 » 02 Nov 2020, 12:11

Koepel dank weer voor de input. Als ik de samples hoger maak dan 4 is de reactietijd dermate slecht dat de meting eigenlijk niet meer goed toe te passen is voor in de auto. Zelfs met een average van 4 is de response niet meer geweldig. Andere wijzigingen heb ik wel aangebracht. int veranderen naar float kom ik niet uit, deze rolling average is van het internet. Is het niet mogelijk om een beetje te vals te spelen en iets in te bouwen als: if barCorr = tussen de waardes -0.1 en 0.01 = 0? Ik weet niet hoe ik dit goed in de software moet zetten en mogelijk is het een idee van niks maar ik hoor daar graag jouw mening over. En mocht het dus wel een goed idee zijn hoor ik graag hoe ik die //if goed in moet vullen.

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.

// Define the number of samples to keep track of. The higher the number, the
// more the readings will be smoothed, but the slower the output will respond to
// the input. Using a constant rather than a normal variable lets us use this
// value to determine the size of the readings array.

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

const int numReadings = 4; //hoe hoger het getal hoe trager de response, maar hoe stabieler het signaal.

int readings[numReadings];      // the readings from the analog input
int readIndex = 0;              // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average

int inputPin = A0;

void setup() {

    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

Serial.begin(115200);
  // initialize all the readings to 0:
  for (int thisReading = analogRead(A0); thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {
 
  // subtract the last reading:
  total = total - readings[readIndex];
  // read from the sensor:
  readings[readIndex] = analogRead(A0);
  // add the reading to the total:
  total = total + readings[readIndex];
  // advance to the next position in the array:
  readIndex = readIndex + 1;

  // if we're at the end of the array...
  if (readIndex >= numReadings) {
    // ...wrap around to the beginning:
    readIndex = 0;
  }

  // calculate the average:
  average = total / numReadings;
  // send it to the computer as ASCII digits
  //Serial.println(average);
 
  int rawADC = average; //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.4000) / (4.65 - 0.4000)) * (250.00 - 20.00)) + 20.00; //berekeningen volgens Bosch datasheet
  float bar = (kPa / 100.0); //omrekenen van Kpa naar bar.
  float barCorr = (bar - 1.0350); //correctie van de atmosferische druk.
  Serial.println(barCorr); //kopieren naar seriele monitor.
  delay(1);

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

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

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Koepel » 03 Nov 2020, 03:44

De analoge waarde van 0 ... 1023 is de bron waarmee je verder gaat rekenen. Je begrijpt toch intussen wel dat ik daar niet mee wil rommelen ;)

Ik vind het niet erg als het getal op het scherm een beetje ruis laat zien. Dan weet je dat het werkt.

Een personenweegschaal probeert naar 0.0 te gaan als er niemand op staat.
Dat vertaald naar jouw situatie is dan de correctie van de atmosferische druk aanpassen.

Wil je de druk in bar weten ?
Dus je wilt geen barometer ?
Dan heb je de verkeerde sensor.

Op het moment dat je gaat delen, dan ga je informatie weggooien.

Hieronder geef ik de code, maar denk je er aan dat de 'average' nu een 'float' is en geen 'int', en dat die 'average' zo gebruik wordt zonder tussendoor naar 'int' om te zetten.

Code: Alles selecteren
float average;

...

// calculate the average:
average = float( total) / float( numReadings);

// send it to the computer as ASCII digits
//Serial.println(average);
 
float voltage = average / 1024.0 * 5.0;   // de waarde als VCC ook echt 5.0V zou zijn.

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

Re: Nieuw lid + vraag over software omtrent luchtdrukmeter.

Berichtdoor Adriaan_VOLVO940 » 03 Nov 2020, 15:06

average heb ik nu een float van gemaakt. Nu is de waarde netjes constant 0.00

De uiteindelijke functie van dit project is om de turbodruk van de motor te kunnen meten. Bij atmosferische druk moet de waarde dus 0 zijn en naarmate de turbo een druk of een vacuum creëert moet de waarde dus (zo snel mogelijk) mee veranderen.

Het enige wat nu nog op mijn wensenlijstje staat is een functie toevoegen die elke 10 seconde de hoogste waarde opslaat. Ik dacht aan iets zoals:

// if ((barCorr) > 0)
// display.setTextSize(1);
// display.setCursor(97, 20);
// display.println("PEAK");
// display.setTextSize(1);
// display.setCursor(97,05);
// display.println(peak);

Dit is nog niet compleet maar met mijn kennis kom ik niet verder.

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: zitupinav en 10 gasten