min and max functions giving inconsistent results

I have a HMC5843 that I can get the reading from just fine. The x y z values adjust and print as I move the sensor around.

I wanted to find out what are the min and max values from x, y, and z over time.

Here is my code which is failing. I have for xyz, the min max, and also val variables. I setup the [xyz]val variables to store copies of what is read from the HMC.getValues function as that function from the sample code used pointers and I wanted to rule pointers out as the possible cause of the min max failing.

#include <HMC.h>

int xmin = 0;
int xmax = 0;
int ymin = 0;
int ymax = 0;
int zmin = 0;
int zmax = 0;
int xval = 0;
int yval = 0;
int zval = 0;

        
void setup()
{
  Serial.begin(115200);
  delay(300); // The HMC5843 needs 5ms before it will communicate
  HMC.init();
}

void loop()
{
  int x,y,z;
  delay(1000); // There will be new values every 100ms
  HMC.getValues(&x,&y,&z);;
  Serial.print("x:");
  Serial.print(x);
  Serial.print(" y:");
  Serial.print(y);
  Serial.print(" z:");
  Serial.println(z);
  
  xval = x;
  yval = y;
  zval = z;
  Serial.print("x:");
  Serial.print(xval);
  Serial.print(" y:");
  Serial.print(yval);
  Serial.print(" z:");
  Serial.println(zval);
  
  xmin = min(xmin, x);
  xmax = max(xmax, x);
  ymin = min(xmin, y);
  ymax = max(xmax, y);
  zmin = min(xmin, z);
  zmax = max(xmax, z);
  
  Serial.print("x min: ");
  Serial.print(xmin);
  Serial.print(", max: ");
  Serial.println(xmax);
  Serial.print("y min: ");
  Serial.print(ymin);
  Serial.print(", max:");
  Serial.println(ymax);
  Serial.print("z min: ");
  Serial.print(zmin);
  Serial.print(", max:");
  Serial.println(zmax);
  Serial.println("");
}

Look at the y max value from sample output that has me confused. It should never go down. right?

x:-118 y:28 z:-627
x:-118 y:28 z:-627
x min: -118, max: 0
y min: -118, max:28
z min: -627, max:0

x:-116 y:30 z:-618
x:-116 y:30 z:-618
x min: -118, max: 0
y min: -118, max:30
z min: -618, max:0

x:-117 y:28 z:-620
x:-117 y:28 z:-620
x min: -118, max: 0
y min: -118, max:28
z min: -620, max:0

x:-117 y:34 z:-620
x:-117 y:34 z:-620
x min: -118, max: 0
y min: -118, max:34
z min: -620, max:0

x:-114 y:33 z:-622
x:-114 y:33 z:-622
x min: -118, max: 0
y min: -118, max:33
z min: -622, max:0

x:-117 y:28 z:-625
x:-117 y:28 z:-625
x min: -118, max: 0
y min: -118, max:28
z min: -625, max:0

x:-116 y:29 z:-621
x:-116 y:29 z:-621
x min: -118, max: 0
y min: -118, max:29
z min: -621, max:0

x:-117 y:29 z:-621
x:-117 y:29 z:-621
x min: -118, max: 0
y min: -118, max:29
z min: -621, max:0

x:-117 y:29 z:-615
x:-117 y:29 z:-615
x min: -118, max: 0
y min: -118, max:29
z min: -615, max:0

x:-116 y:32 z:-620
x:-116 y:32 z:-620
x min: -118, max: 0
y min: -118, max:32
z min: -620, max:0

x:-118 y:29 z:-622
x:-118 y:29 z:-622
x min: -118, max: 0
y min: -118, max:29
z min: -622, max:0

x:-116 y:32 z:-619
x:-116 y:32 z:-619
x min: -118, max: 0
y min: -118, max:32
z min: -619, max:0

x:-116 y:31 z:-622
x:-116 y:31 z:-622
x min: -118, max: 0
y min: -118, max:31
z min: -622, max:0

x:-55 y:43 z:-624
x:-55 y:43 z:-624
x min: -118, max: 0
y min: -118, max:43
z min: -624, max:0

x:-127 y:-65 z:-617
x:-127 y:-65 z:-617
x min: -127, max: 0
y min: -127, max:0
z min: -617, max:0

x:-157 y:-167 z:-598
x:-157 y:-167 z:-598
x min: -157, max: 0
y min: -167, max:0
z min: -598, max:0

x:-159 y:-171 z:-593
x:-159 y:-171 z:-593
x min: -159, max: 0
y min: -171, max:0
z min: -593, max:0

x:-121 y:-220 z:-588
x:-121 y:-220 z:-588
x min: -159, max: 0
y min: -220, max:0
z min: -588, max:0

x:-120 y:-217 z:-588
x:-120 y:-217 z:-588
x min: -159, max: 0
y min: -217, max:0
z min: -588, max:0

x:-123 y:-216 z:-590
x:-123 y:-216 z:-590
x min: -159, max: 0
y min: -216, max:0
z min: -590, max:0

x:-124 y:-219 z:-587
x:-124 y:-219 z:-587
x min: -159, max: 0
y min: -219, max:0
z min: -587, max:0

x:-125 y:-219 z:-582
x:-125 y:-219 z:-582
x min: -159, max: 0
y min: -219, max:0
z min: -582, max:0

x:-128 y:-219 z:-586
x:-128 y:-219 z:-586
x min: -159, max: 0
y min: -219, max:0
z min: -586, max:0

x:-123 y:-220 z:-586
x:-123 y:-220 z:-586
x min: -159, max: 0
y min: -220, max:0
z min: -586, max:0

x:-129 y:-222 z:-582
x:-129 y:-222 z:-582
x min: -159, max: 0
y min: -222, max:0
z min: -582, max:0

x:-130 y:-225 z:-584
x:-130 y:-225 z:-584
x min: -159, max: 0
y min: -225, max:0
z min: -584, max:0

The min values should only go lower, and the max values should only go higher... I don't get it.

The mistake is here:

  xmin = min(xmin, x);
  xmax = max(xmax, x);
  ymin = min(xmin, y);
  ymax = max(xmax, y);
  zmin = min(xmin, z);
  zmax = max(xmax, z);

you forgot to change the xmin and xmax to ymin/zmin and ymax/zmax.

Also when keeping track of minima and maxima it's better to initialise your variables to extreme values, ie:

int xmin = 10000;
int xmax = -10000;
int ymin = 10000;
int ymax = -10000;
int zmin = 10000;
int zmax = -10000;

Thanks you very much for the help and for the advise! It's working as expected now and the practice of initing the vars when tracking the minimum and maximum is great.

hej,

if it is work as you want can you take a video and explain what you did. thanks ::slight_smile: