Meetfout?

Software die niet past in bovenstaande onderwerpen
Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Meetfout?

Berichtdoor benvo » 16 Feb 2018, 15:08

Er zit een fout in mijn software die zich niet laat ontdekken. De software is die voor een Aquariumcontroller die op zich goed werkt. Het kent echter een probleem in de PH meting. Tijdens mijn testrondes zie ik dat zodra de PH waarde oploopt, de getallen hoger worden als aangegeven door een gekochte meter, dat mijn getallen, in deze software juist lager worden! Andersom ook; de gekochte meter geeft lagere waardes aan terwijl mijn software meting juist oploopt. Zelf heb ik het vermoeden dat er iets niet goed gaat in het deel wat zorgt voor een middeling van de waardes zodat de meter niet op het neer springt. Dit deel komt af van de software die ik hier vond; https://www.arduino.cc/en/Tutorial/Smoothing. Zeker weten doe ik het niet. Al een tijd zoek ik naar de fout, tot nu toe zonder succes. Hopelijk is er hier iemand die mij kan helpen?

Bij voorbaat dank!

Groet,
Ben

cpp code
#include <Nextion.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <RTClib.h>
#include <ChannelManager.h>
#include <EEPROM.h>
#include <AnalogPHMeter.h>


//Data aansluiting is aangesloten op pin 7 on the Arduino.
#define ONE_WIRE_BUS 7

// Legt een oneWire aan om te communiceren met elk oneWire apparaat.
OneWire oneWire(ONE_WIRE_BUS);

// Verbind onze oneWire referentie aan Dallas Temperature.
DallasTemperature sensors(&oneWire);

AnalogPHMeter pHSensor(A0);


//Zet de meters in NexGauge pointer

NexGauge lichtrood = NexGauge(0, 1, "z0");
NexGauge lichtblauw = NexGauge(0, 2, "z1");
NexGauge lichtwit = NexGauge (0, 3, "z2");
NexGauge pH = NexGauge(0, 4, "z3");
NexGauge temp = NexGauge(0, 5, "z4");





// ----------------------- Constanten -----------------------

const int MaxChannels = 3; // Maximaal te gebruiken kanaalnummers, indien nodig te wijzigen naar meer of minder
const int MaxPoints = 25; // Maximaal te gebruiken en in te voeren licht intensiteits punten, indien nodig te wijzigen in meer of minder
const int TxPin = 16; //Tx ledPin op 16
const int numReadings = 10; //aantal afgelezen monsters van de pH sensor/electrode.

// RTC
RTC_DS3231 rtc;

// Time
DateTime CurrentTime;
unsigned int pHCalibrationValueAddress = 0;

unsigned long temperatuurMillis;
unsigned long tijdMillis;
unsigned long updateMillis;


// ----------------------- Variabelen -----------------------

int phInt = 0;
int readings [numReadings]; //aflezingen van analoge ingang A0.
int readIndex = 0; //Arraypositie van de huidige pH sensor aflezing.
int total = 0; //het lopende totaal aantal aflezingen.
int pHsensorPin = A0; //pin nummer verbonden met de Po uitgang van de pH sensormodule.

float average = 0; //het gemiddelde van de pH sensor aflezingswaarden.


int relaisPin = 8; //relais uitgang

float maxPH = 7.15; // Waarde hierboven zet de magneetklep open

float minPH = 7.05; //waarde hieronder sluit de magneetklep

float x = 0; //Wordt gebruikt om temperatuurmetingswaarde in op te slaan.



// ----------------------- Licht -----------------------

// Invul wijze (Uur, Minuut, Intensiteit)
// De verschillen in intensiteit tussen de ingegeven punten zullen gradueel toenemen of afnemen.


Channel Channels[MaxChannels];
Point Points[MaxChannels][MaxPoints];


void InitializeChannels(int channels) {


// Channel 0:
int channelNo = 0; // Kanaal 0 wordt in gebruik genomen
int redPin = 9; // Kanaal 0 gebruikt pin 9 voor de wit-rode balk
Channels[channelNo] = Channel(redPin, MaxPoints, fademode_linear, Points[channelNo]); // Initialiseerd kanaal en kiest de FadeMode
Channels[channelNo].AddPoint(8, 30, 0); // Voeg punt toe (Kunt ook decimale waarden gebruiken van 0 tot 1 als dat de voorkeur heeft)
Channels[channelNo].AddPoint(9, 0, 76);
Channels[channelNo].AddPoint(9 , 30, 204);
Channels[channelNo].AddPoint(18, 30, 204);
Channels[channelNo].AddPoint(20, 0, 76);
Channels[channelNo].AddPoint(20, 30, 25);
Channels[channelNo].AddPoint(21, 0, 10);
Channels[channelNo].AddPoint(23, 0, 0);




// Channel 1:In te voeren
channelNo = 1; // Kanaal 1 wordt in gebruik genomen
int bluePin = 10; // Kanaal 1 gebruikt pin 10 voor de wit-blauwe balk
Channels[channelNo] = Channel(bluePin, MaxPoints, fademode_linear, Points[channelNo]);
Channels[channelNo].AddPoint(9, 0, 0);
Channels[channelNo].AddPoint(9, 15, 76);
Channels[channelNo].AddPoint(9, 30, 204);
Channels[channelNo].AddPoint(18, 30, 204);
Channels[channelNo].AddPoint(19, 30, 127);
Channels[channelNo].AddPoint(20, 30, 51);
Channels[channelNo].AddPoint(22, 0, 25);
Channels[channelNo].AddPoint(23, 0, 0);



// Channel 2:
channelNo = 2; // Kanaal 2 wordt in gebruik genomen
int whitePin = 11; // Kanaal 2 gebruikt pin 11 voor de witte balk
Channels[channelNo] = Channel(whitePin, MaxPoints, fademode_linear, Points[channelNo]);
Channels[channelNo].AddPoint(9, 0, 0);
Channels[channelNo].AddPoint(9, 15, 102);
Channels[channelNo].AddPoint(9, 30, 204);
Channels[channelNo].AddPoint(17, 30, 204);
Channels[channelNo].AddPoint(17, 45, 102);
Channels[channelNo].AddPoint(18, 00, 10);
Channels[channelNo].AddPoint(18, 15, 0);




}

// ----------------------- Functies -----------------------


long lastUpdateTime = 0;

// Update licht intensiteit waarden

void UpdateLights(DateTime CurrentTime)
{
long now = Seconds(CurrentTime.hour(), CurrentTime.minute(), CurrentTime.second()); // Zet de huidige tijd naar seconden sinds middernacht
if (now != lastUpdateTime) // Geeft alleen een update als er een duidelijk waarneembaar verschil in tijd.
{
for (int channel = 0; channel < MaxChannels; channel++) // Voor elk kanaal
{
analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now)); // Krijgt de geupdate licht intensiteit en schrijft de waarde naar de desbetreffende pin
// update wordt uitgevoerd wanneer de waarde ingelezen wordt




//Bereken het percentage output gebaseerd op de huidige licht intensiteit.

{

int channel = 0;
float intensityNow = Channels[channel].GetLightIntensityInt(now);
float maxIntensity = 255;
float a = intensityNow / maxIntensity;
float currentPercent = a * 100;

//omrekening lichtwaarde naar naar graden voor lichtschaal
// licht in percentage is linear
//licht uit (0) angle=-45 degrees
//licht 100% aan angle=+225degrees
//range light % is 100
//range of angle is 270(225+45)
//float intensity
float angle = (currentPercent / 100.0 * 270.0) - 45.0;
if (angle < 0) //Als de stand lager is dan 0 en dus negatief wordt.
{
angle += 360; //maak een positief aantal graden voor de meter
}
int rood = int(angle);
lichtrood.setValue(rood);
}

{
int channel = 1;
float intensityNow = Channels[channel].GetLightIntensityInt(now);
float maxIntensity = 255;
float a = intensityNow / maxIntensity;
float currentPercent = a * 100;


//omrekening lichtwaarde naar naar graden voor lichtschaal
// licht in percentage is linear
//licht uit (0) angle=-45 degrees
//licht 100% aan angle=+225degrees
//range light % is 100
//range of angle is 270(225+45)
//float intensity
float angle = (currentPercent / 100.0 * 270.0) - 45.0;
if (angle < 0) //Als de stand lager is dan 0 en dus negatief wordt.
{
angle += 360; //maak een positief aantal graden voor de meter
}
int blauw = int(angle);
lichtblauw.setValue(blauw);
}

{
int channel = 2;
float intensityNow = Channels[channel].GetLightIntensityInt(now);
float maxIntensity = 255;
float a = intensityNow / maxIntensity;
float currentPercent = a * 100;

//omrekening lichtwaarde naar naar graden voor lichtschaal
// licht in percentage is linear
//licht uit (0) angle=-45 degrees
//licht 100% aan angle=+225degrees
//range light % is 100
//range of angle is 270(225+45)
//float intensity
float angle = (currentPercent / 100.0 * 270.0) - 45.0;
if (angle < 0) //Als de stand lager is dan 0 en dus negatief wordt.
{
angle += 360; //maak een positief aantal graden voor de meter
}
int wit = int(angle);
lichtwit.setValue(wit);
}
}
}
lastUpdateTime = now;
}


// Converteerd de uren:minuten naar seconden sinds middernacht

long Seconds(int hours, int minutes, int seconds) {
return ((long)hours * 60 * 60) + (minutes * 60) + seconds ;
}

//-------------------- pagina 1 -------------------------------

NexButton b0 = NexButton(0, 6, "b0"); //knop Instellingen
NexButton b2 = NexButton(1, 2, "b2"); //knop plus maximum pH
NexButton b3 = NexButton(1, 3, "b3"); //knop min maximum pH
NexButton b4 = NexButton(1, 4, "b4"); //knop plus minimum pH
NexButton b5 = NexButton(1, 5, "b5"); //knop min minimum pH
NexButton for_c = NexButton(1, 6, "b6"); //knop "Clear"
NexButton for_l = NexButton(1, 7, "b7"); //knop "pH 4.0"
NexButton for_m = NexButton(1, 8, "b8"); //knop "pH 7.0"
NexButton for_h = NexButton(1, 9, "b9"); //knop "pH 10.0"
NexButton for_s = NexButton(1, 10, "b10"); //knop "Save"



//Declaratie tekstvelden

//Op de homepagina 0

NexText t0 = NexText(0, 11, "t0"); //uren, minuten en seconden
NexText t1 = NexText(0, 12, "t1"); //dag, maand en jaar


//Op pagina 1

NexText t11 = NexText(1, 11, "t11"); //maximum pH
NexText t12 = NexText(1, 12, "t12"); //minimum pH
NexText t13 = NexText(1, 10, "t13"); //pH kalibratie waarde


//buffer definities

char buffer_pHtemp[10]; //buffer pH sensor
char buffer_maxPH[10]; //buffer pH maximum instel waardes
char buffer_minPH[10]; //buffer pH minimum instel waardes

// Registeer een button object op de touch event lijst.

NexTouch *nex_listen_list[] =
{
&b0,
&b2,
&b3,
&b4,
&b5,
&for_c,
&for_l,
&for_m,
&for_h,
&for_s,
&t0,
&t1,
&t11,
&t12,
&t13,
NULL
};





//------------ pagina 1 Instellingen en kalibratie pH ----------------
void b0PopCallback(void*ptr)
{
dtostrf(maxPH, 5, 2, buffer_maxPH); //drukt maxPH af.
t11.setText(buffer_maxPH);

dtostrf(minPH, 5, 2, buffer_minPH); //drukt minPH af.
t12.setText(buffer_minPH);
}

void t11PopCallback(void*ptr)
{
dtostrf(maxPH, 5, 2, buffer_maxPH); //drukt maxPH af.
t11.setText(buffer_maxPH);
}

void t12PopCallback(void*ptr)
{
dtostrf(minPH, 5, 2, buffer_minPH); //drukt minPH af.
t12.setText(buffer_minPH);
}

void b2PopCallback(void*ptr)
{
maxPH += 0.01;
dtostrf(maxPH, 5, 2, buffer_maxPH);
t11.setText(buffer_maxPH);
}

void b3PopCallback(void*ptr)
{
maxPH -= 0.01;
dtostrf(maxPH, 5, 2, buffer_maxPH);
t11.setText(buffer_maxPH);
}

void b4PopCallback(void*ptr)
{
minPH += 0.01;
dtostrf(minPH, 5, 2, buffer_minPH);
t12.setText(buffer_minPH);
}

void b5PopCallback(void*ptr)
{
minPH -= 0.01;
dtostrf(minPH, 5, 2, buffer_minPH);
t12.setText(buffer_minPH);
}

void PopCallback_c(void*ptr)
{
pHSensor.calibrationClear(); //Clear
}

void PopCallback_l(void*ptr)
{
pHSensor.calibrationLow(4.000f); //pH 4
}

void PopCallback_m(void*ptr)
{
pHSensor.calibrationMid(7.000f); //pH 7
}

void PopCallback_h(void*ptr)
{
pHSensor.calibrationHigh(10.000f); //pH 10
}

void PopCallback_s(void*ptr)
{
EEPROM.put(pHCalibrationValueAddress, pHSensor.getCalibrationValue()); //slaat Calibratiewaarde op in EEPROM
}








// ----------------------- Setup -----------------------
void setup()
{
Wire.begin();

// Klok
rtc.begin();


//Zet de baudrate nodig voor de communicatie met het Nextion scherm
nexInit();
//merkt de tekstvensters op.

t11.attachPop(t11PopCallback, &t11);
t12.attachPop(t12PopCallback, &t12);

//Merkt de losgelaten knop op.

b0.attachPop(b0PopCallback, &b0);
b2.attachPop(b2PopCallback, &b2);
b3.attachPop(b3PopCallback, &b3);
b4.attachPop(b4PopCallback, &b4);
b5.attachPop(b5PopCallback, &b5);

for_c.attachPop(PopCallback_c, &for_c);
for_l.attachPop(PopCallback_l, &for_l);
for_m.attachPop(PopCallback_m, &for_m);
for_h.attachPop(PopCallback_h, &for_h);
for_s.attachPop(PopCallback_s, &for_s);




//Pin is uitgang
pinMode(TxPin, OUTPUT); //TxPin wordt als uitgang gebruikt.
pinMode(relaisPin, OUTPUT); //relaisPin wordt als uitgang gebruikt


sensors.begin(); //Start de Temperatuurlibrary/sensor

struct PHCalibrationValue pHCalibrationValue;
EEPROM.get(pHCalibrationValueAddress, pHCalibrationValue);
pHSensor.initialize(pHCalibrationValue); //Start de pH sensor

for ( int thisReading = 0; thisReading < numReadings; thisReading ++) //initialiseer alle aflezingen op 0
{
readings[thisReading] = 0;
}
//Initialiseer de kanaal schema's
InitializeChannels(MaxChannels);

// rtc.adjust(DateTime(2018,2,15,12,45,0)); // Stelt de RTC tijd in op de sketch samenstelling, wordt gebruikt voor één run. De tijd wordt gereset op het moment dat een apparaat wordt gereset!


}


// ----------------------- Loop -----------------------


void loop(void)
{

nexLoop(nex_listen_list);


// Stelt in op de huidige tijd

CurrentTime = rtc.now();

//------------- temperatuurmeting -----------------

unsigned long huidigeTemp = millis();
if (huidigeTemp - temperatuurMillis >= 6000)
{
sensors.requestTemperatures(); // Zend het commando om de temperatuurmeting te halen.
x = sensors.getTempCByIndex(0); //Zet de verkregen waarde in x



//Omrekening waarde naar graden voor de temperatuurschaal
// Temperature (linear)
// temperature = 0, angle = -45 degrees
// temperature = 50, angle = +225 degrees.
// range of temperature is 50
// range of angle is 270 (225 + 45)
//float temperature;
float angle = (x / 50.0 * 270.0) - 45.0;
int degrees = int(angle);
temp.setValue(degrees);
if (angle < 0) //Als de stand lager is dan 0 en dus negatief wordt.
{
angle += 360; //maak een positief aantal graden voor de meter
}
temperatuurMillis = huidigeTemp;
}



//--------------------- pH waarden meting --------------------------

static unsigned long t = millis();
if (millis() - t > 1000)
{

total = total - readings[readIndex]; //Trek van de laatste pH sensor aflezing af.
float pHvalue = (pHSensor.singleReading().getpH()); //aflezen van de sensor


readings[readIndex] = pHvalue * 100; //Leest de pH waarde in.
total = total + readings[readIndex]; //Voeg de pH sensor aflezing toe aan het totaal.
readIndex = readIndex + 1; //Vooruit naar de volgende positie in de array.

if ( readIndex >= numReadings) //Als we aan het einde van de array staan...
{
readIndex = 0; //...ga terug naar het begin.
}
average = total / numReadings; //Bereken het gemiddelde.

pHvalue = average / 100;


dtostrf(pHvalue, 5, 2, buffer_pHtemp); //conversie pH value naar een string
t13.setText(buffer_pHtemp);

if (pHvalue >= maxPH) //Als de gemeten pH waarde groter is dan de maxPH waarde
{
digitalWrite(relaisPin, LOW); //relais is aangetrokken, magneetklep open. CO2 toevoer.
}

if (pHvalue <= minPH) //Als de gemeten pH waarde kleiner is dan de minPH waarde
{
digitalWrite(relaisPin, HIGH); //relais is open, magneetklep gesloten. Geen CO2 toevoer.
}


//omrekening naar ronde meter

phInt = pHvalue * 100; // alles met 100 vermenigvulden om een heel getal te hebben
signed int graden = map (phInt, 600, 850, -45, 225); // nu heb je de graden

if (graden < 0) // Als de stand lager is als nul en dus negatief wordt.
{
graden += 360; // maak een positief aantal graden voor de meter
}

pH.setValue(graden); //zet de meternaald
t = millis();
}


// Tijd en datum update
unsigned long huidigetijdMillis = millis();
if (huidigetijdMillis - tijdMillis > 1000)
{
DateTime now = rtc.now();
char tijdString[9];
static char vorigeTijd[9];

sprintf(tijdString, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());

if (strcmp(tijdString, vorigeTijd) != 0)
{
t0.setText (tijdString); //Tijd update
strcpy(vorigeTijd, tijdString); //Bewaar vorigeTijd voor de volgende vergelijking
}



char datumString[9];
static char vorigeDatum[9];

sprintf(datumString, "%02d-%02d-%02d", now.day(), now.month(), now.year());

if (strcmp(datumString, vorigeDatum) != 0)
{
t1.setText (datumString); //Datum update
strcpy(vorigeDatum, datumString); //Bewaar vorigeDatum voor de volgende vergelijking
}
tijdMillis = huidigetijdMillis;
}

// Update lights
unsigned long huidigeupdateMillis = millis();
if (huidigeupdateMillis - updateMillis > 10000)
{
UpdateLights(CurrentTime);
updateMillis = huidigeupdateMillis;
}
}

Advertisement

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

Re: Meetfout?

Berichtdoor nicoverduin » 16 Feb 2018, 16:28

En je hebt al getest via Serial of de metingen die via die ph sensor binnenkomen wel gelijk lopen met de gekochte meter. En je calibratie parameter is ook goed ?

En dit Gaat pas goed als je minstens 10 metingen heb gedaan
cpp code
average = total / numReadings;                             //Bereken het gemiddelde.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Meetfout?

Berichtdoor benvo » 16 Feb 2018, 17:47

Dank je voor je reactie, Nico.

Het klopt dat er 10 metingen gedaan moeten zijn alvorens er een gemiddelde berekend wordt. numReadings staan als constant int op 10. De calibratie is goed. De metingen zullen nooit exact gelijk zijn tussen de gekochte meter en mijn software meting. De gebruikte sensoren hebben onderling al een afwijking. Verder zitten er ook verschillen in de op de Arduino Mega aangesloten module en de interne module van het gekochte apparaat. Op zich is dat ook niet erg omdat ik dit kan corrigeren. Maar het kan natuurlijk niet dat een waarde zakt terwijl de andere stijgt! De correcte meting zit in elk geval in de gekocht meter omdat die gewoon doet wat logisch is, t.w., op het moment dat CO2 wordt toegevoegd moet de getalswaarde dalen. Dat gebeurd dus ook in de gekochte meter terwijl mijn waarden stijgen! Het lijkt wel of ik ergens iets verkeerd om gezet heb... Zelf heb ik het voel dat het ergens in die afvlakking moet zitten. Met name in dit deel, maar dat kan ik wel helemaal mis hebben. De code die ik gebruik komt als gezegd van de Arduino site. Voor de volledigheid heb ik deze er nog eens ondergezet. Ik zoek hoe dan ook verder en zal je suggestie uit proberen.

[code2=cpp][/
Code: Alles selecteren
 //--------------------- pH waarden meting  --------------------------

  static unsigned long t = millis();
  if (millis() - t > 1000)
  {

    total = total - readings[readIndex];                       //Trek van de laatste pH sensor aflezing af.
    float pHvalue = (pHSensor.singleReading().getpH());        //aflezen van de sensor     
    readings[readIndex] = pHvalue * 100;                       //Leest de pH waarde in.
    total = total + readings[readIndex];                       //Voeg de pH sensor aflezing toe aan het totaal.
    readIndex = readIndex + 1;                                 //Vooruit naar de volgende positie in de array.

    if ( readIndex >= numReadings)                             //Als we aan het einde van de array staan...
    {
      readIndex = 0;                                           //...ga terug naar het begin.
    }
    average = total / numReadings;                             //Bereken het gemiddelde.

    pHvalue = average / 100;


    dtostrf(pHvalue, 5, 2, buffer_pHtemp);                     //conversie pH value naar een string
    t13.setText(buffer_pHtemp);

    if (pHvalue >= maxPH)                                     //Als de gemeten pH waarde groter is dan de maxPH waarde
    {
      digitalWrite(relaisPin, LOW);                           //relais is aangetrokken, magneetklep open. CO2 toevoer.
    }

    if (pHvalue <= minPH)                                     //Als de gemeten pH waarde kleiner is dan de minPH waarde
    {
      digitalWrite(relaisPin, HIGH);                          //relais is open, magneetklep gesloten. Geen CO2 toevoer.
    }

code2]


/*
Smoothing

Reads repeatedly from an analog input, calculating a running average and
printing it to the computer. Keeps ten readings in an array and continually
averages them.

The circuit:
- analog sensor (potentiometer will do) attached to analog input 0

created 22 Apr 2007
by David A. Mellis <dam@mellis.org>
modified 9 Apr 2012
by Tom Igoe

This example code is in the public domain.

http://www.arduino.cc/en/Tutorial/Smoothing
*/

// 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.
const int numReadings = 10;

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() {
// initialize serial communication with computer:
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
}

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

Re: Meetfout?

Berichtdoor nicoverduin » 16 Feb 2018, 18:57

Je zal toch eerst moet verifiëren of je input goed is. Geen idee of dat ding een goede waarde geeft. Maar dat kan je zo controleren. Verder maak je allerlei kromme berekeningen in je moving average. Je maakt een tabel met integers terwijl je floats van de PH sensorkrijgt. Dat alleen al is een reden van afwijkingen. 1.99 wordt nog steeds 1. Verder is het mij niet duidelijk waarom je de PH waarden met 100 vermenigvuldigt. Dat zou alleen zin hebben als je met waarden rekent als bijv. 0.00345 oid.
Het algoritme is verders goed dus de fout zit vermoedelijk in het heen en weer schuiven tussen floats en integers....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Meetfout?

Berichtdoor benvo » 17 Feb 2018, 12:12

Je hebt gelijk. In het verschil float en integer heb ik een probleem. Daar had ik al over nagedacht en daarom ook maakte ik een vermenigvuldiging met 100 en later een, terug, deling met 100 om dat verschil te verkleinen. Maar het is inderdaad een belangrijk verschil. En zeker geen goede oplossing. Eerst zal ik dan ook eens zoeken of ik dit kan oplossen. Misschien een afronding ertussen naar integer? Of anders een andere middeling manier? Alvast erg veel dank voor het (mee-)denken!

Groet,
Ben.

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

Re: Meetfout?

Berichtdoor nicoverduin » 17 Feb 2018, 12:56

Waarom maak je van die array niet gewoon floats?????
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Meetfout?

Berichtdoor benvo » 17 Feb 2018, 19:24

nicoverduin schreef:Waarom maak je van die array niet gewoon floats?????


Dat heb ik nu gedaan. Eigenlijk hoef je alleen de readings van int naar float om te zetten. Dat maakt dat de daling nog sneller verloopt wanneer de echte waardes stijgen. Maar mogelijk heeft het laatste ook als reden dat men correcties heeft uitgevoerd in de libraries. Een paar deletes en toevoegingen lees ik op Github. Deze laatste library heb ik nu gebruikt, het maakt geen verschil. Hier vond ik ze:

https://github.com/frdteknikelektro/Ana ... r/releases

Het blijft dus nog zoeken!

Het lijkt me in ieder geval een goed idee om het pH meet programma te isoleren, zie onderstaand, van de rest om te zien wat er precies gebeurd. Dat zal ik nu als eerste doen. Wordt vervolgt!

[code2=cpp][/
Code: Alles selecteren

#include <Nextion.h>
#include <EEPROM.h>
#include <AnalogPHMeter.h>

AnalogPHMeter pHSensor(A5);
unsigned int pHCalibrationValueAddress = 0;


// -------- Declare Buttons ----------

NexButton for_c = NexButton(1, 6, "b6");
NexButton for_l = NexButton(1, 7, "b7");
NexButton for_m = NexButton(1, 8, "b8");
NexButton for_h = NexButton(1, 9, "b9");
NexButton for_s = NexButton(1, 10, "b10");

// -------- Declare Textfield ---------

NexText t13 = NexText(1, 13, "t13");

char buffer_pHtemp[10];


NexTouch *nex_listen_list[] =
{
  &for_c,
  &for_h,
  &for_l,
  &for_m,
  &for_s,
  &t13,
  NULL
};

void PopCallback_c(void *ptr)
{
  pHSensor.calibrationClear();           // Clear
}

void PopCallback_m(void *ptr)
{
  pHSensor.calibrationMid(7.000f);        // pH 7 single point calibration
}

void PopCallback_l(void *ptr)
{
  pHSensor.calibrationLow(4.000f);        // pH 4 single point calibration
}

void PopCallback_h(void *ptr)
{
  pHSensor.calibrationMid(10.000f);       // pH 10 single point calibration
}

void PopCallback_s(void*ptr)
{
  EEPROM.put(pHCalibrationValueAddress, pHSensor.getCalibrationValue());  //slaat Calibratiewaarde op in EEPROM
}



void setup(void)
{
  Serial.begin(9600);




  struct PHCalibrationValue pHCalibrationValue;
  EEPROM.get(pHCalibrationValueAddress, pHCalibrationValue);
  pHSensor.initialize(pHCalibrationValue);                                   //Start de pH sensor


  nexInit();
  for_c.attachPop(PopCallback_c, &for_c);
  for_h.attachPop(PopCallback_h, &for_h);
  for_l.attachPop(PopCallback_l, &for_l);
  for_m.attachPop(PopCallback_m, &for_m);
  for_s.attachPop(PopCallback_s,  & for_s);

}


void loop(void)
{
  static unsigned long t = millis();
  if (millis() - t > 1000)
  {
    float pHvalue = (pHSensor.singleReading().getpH());
    dtostrf(pHvalue, 5, 2, buffer_pHtemp);                     //conversion pH value to string
    t13.setText(buffer_pHtemp);
    t = millis();
  }


  nexLoop(nex_listen_list);
}

code2]
Laatst gewijzigd door benvo op 17 Feb 2018, 19:53, in totaal 1 keer gewijzigd.

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

Re: Meetfout?

Berichtdoor nicoverduin » 17 Feb 2018, 19:47

Zodra je een keer via de serial de echte waardes hier neerzet zie ik hel wel..... heb er genoeg keer om gevraagd dus zonde om hier nog verder energie in te steken

En je hebt alleen die array aangepast en de rest van je berekeningen niet? Want dan is het wederom een zinloze actie geweest.....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Meetfout?

Berichtdoor benvo » 17 Feb 2018, 19:57

Ten overvloede;

Als ik via Serial de waardes afdruk, heb ik dus gedaan(!), zie ik precies wat ik ook op mijn meter zie, een hele rij teruglopende waardes.
De rest van de berekeningen ben ik dus nu aan het nagaan, zie mijn vorige bericht.

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

Re: Meetfout?

Berichtdoor nicoverduin » 17 Feb 2018, 20:30

Dat is nu een heel essentieel antwoord. Nu moet je nog alles waar je naar int zit te converteren in die moving average opfloat houden en ook dat vermenigvuldigen met 100 en later weer delen door 100 de nek omdraaien. Laat daarna je laatste sketch hier zien
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Overige Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten