MS5611 support
This commit is contained in:
@@ -0,0 +1,294 @@
|
||||
/*
|
||||
MS5611 Barometric Pressure & Temperature Sensor. Processing for MS5611_processing.ino
|
||||
Read more: http://www.jarzebski.pl/arduino/czujniki-i-sensory/czujnik-cisnienia-i-temperatury-ms5611.html
|
||||
GIT: https://github.com/jarzebski/Arduino-MS5611
|
||||
Web: http://www.jarzebski.pl
|
||||
(c) 2014 by Korneliusz Jarzebski
|
||||
*/
|
||||
|
||||
import processing.serial.*;
|
||||
|
||||
Serial myPort;
|
||||
|
||||
// Data samples
|
||||
int actualSample = 0;
|
||||
int maxSamples = 70;
|
||||
int sampleStep = 10;
|
||||
boolean hasData = false;
|
||||
|
||||
// Charts
|
||||
PGraphics pgChart;
|
||||
int[] colors = { #ff4444, #33ff99 };
|
||||
String[] compareSeries = { "No compensate", "Compensate" };
|
||||
|
||||
// Data for compare
|
||||
float[][] pressureValues = new float[2][maxSamples];
|
||||
float[][] temperatureValues = new float[2][maxSamples];
|
||||
float[][] altitudeValues = new float[2][maxSamples];
|
||||
|
||||
void setup ()
|
||||
{
|
||||
size(770, 670, P2D);
|
||||
background(0);
|
||||
|
||||
// Serial
|
||||
myPort = new Serial(this, Serial.list()[0], 115200);
|
||||
myPort.bufferUntil(10);
|
||||
}
|
||||
|
||||
void drawChart(String title, String[] series, float[][] chart, int x, int y, int h, boolean symmetric, boolean fixed, int fixedMin, int fixedMax, int hlines)
|
||||
{
|
||||
int actualColor = 0;
|
||||
|
||||
int maxA = 0;
|
||||
int maxB = 0;
|
||||
int maxAB = 0;
|
||||
|
||||
int min = 0;
|
||||
int max = 0;
|
||||
int step = 0;
|
||||
int divide = 0;
|
||||
|
||||
if (fixed)
|
||||
{
|
||||
min = fixedMin;
|
||||
max = fixedMax;
|
||||
step = hlines;
|
||||
} else
|
||||
{
|
||||
if (hlines > 2)
|
||||
{
|
||||
divide = (hlines - 2);
|
||||
} else
|
||||
{
|
||||
divide = 1;
|
||||
}
|
||||
|
||||
if (symmetric)
|
||||
{
|
||||
maxA = (int)abs(getMin(chart));
|
||||
maxB = (int)abs(getMax(chart));
|
||||
maxAB = max(maxA, maxB);
|
||||
step = (maxAB * 2) / divide;
|
||||
min = -maxAB-step;
|
||||
max = maxAB+step;
|
||||
} else
|
||||
{
|
||||
min = (int)(getMin(chart));
|
||||
max = (int)(getMax(chart));
|
||||
|
||||
if ((max >= 0) && (min <= 0)) step = (abs(min) + abs(max)) / divide;
|
||||
if ((max < 0) && (min < 0)) step = abs(min - max) / divide;
|
||||
if ((max > 0) && (min > 0)) step = (max - min) / divide;
|
||||
|
||||
if (divide > 1)
|
||||
{
|
||||
min -= step;
|
||||
max += step;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pgChart = createGraphics((maxSamples*sampleStep)+50, h+60);
|
||||
|
||||
pgChart.beginDraw();
|
||||
|
||||
// Draw chart area and title
|
||||
pgChart.background(0);
|
||||
pgChart.strokeWeight(1);
|
||||
pgChart.noFill();
|
||||
pgChart.stroke(50);
|
||||
pgChart.rect(0, 0, (maxSamples*sampleStep)+49, h+59);
|
||||
pgChart.text(title, ((maxSamples*sampleStep)/2)-(textWidth(title)/2)+40, 20);
|
||||
|
||||
// Draw chart description
|
||||
String Description[] = new String[chart.length];
|
||||
int DescriptionWidth[] = new int[chart.length];
|
||||
int DesctiptionTotalWidth = 0;
|
||||
int DescriptionOffset = 0;
|
||||
|
||||
for (int j = 0; j < chart.length; j++)
|
||||
{
|
||||
Description[j] = " "+series[j]+" = ";
|
||||
DescriptionWidth[j] += textWidth(Description[j]+"+000000.00");
|
||||
Description[j] += nf(chart[j][actualSample-1], 0, 2)+" ";
|
||||
DesctiptionTotalWidth += DescriptionWidth[j];
|
||||
}
|
||||
|
||||
actualColor = 0;
|
||||
|
||||
for (int j = 0; j < chart.length; j++)
|
||||
{
|
||||
pgChart.fill(colors[actualColor]);
|
||||
pgChart.text(Description[j], ((maxSamples*sampleStep)/2)-(DesctiptionTotalWidth/2)+DescriptionOffset+40, h+50);
|
||||
DescriptionOffset += DescriptionWidth[j];
|
||||
actualColor++;
|
||||
if (actualColor >= colors.length) actualColor = 0;
|
||||
}
|
||||
|
||||
// Draw H-Lines
|
||||
pgChart.stroke(100);
|
||||
|
||||
for (float t = min; t <= max; t=t+step)
|
||||
{
|
||||
float line = map(t, min, max, 0, h);
|
||||
pgChart.line(40, h-line+30, (maxSamples*sampleStep)+40, h-line+30);
|
||||
pgChart.fill(200, 200, 200);
|
||||
pgChart.textSize(12);
|
||||
pgChart.text(int(t), 5, h-line+34);
|
||||
}
|
||||
|
||||
// Draw data series
|
||||
pgChart.strokeWeight(2);
|
||||
|
||||
for (int i = 1; i < actualSample; i++)
|
||||
{
|
||||
actualColor = 0;
|
||||
|
||||
for (int j = 0; j < chart.length; j++)
|
||||
{
|
||||
pgChart.stroke(colors[actualColor]);
|
||||
|
||||
float d0 = chart[j][i-1];
|
||||
float d1 = chart[j][i];
|
||||
|
||||
if (d0 < min) d0 = min;
|
||||
if (d0 > max) d0 = max;
|
||||
if (d1 < min) d1 = min;
|
||||
if (d1 > max) d1 = max;
|
||||
|
||||
float v0 = map(d0, min, max, 0, h);
|
||||
float v1 = map(d1, min, max, 0, h);
|
||||
|
||||
pgChart.line(((i-1)*sampleStep)+40, h-v0+30, (i*sampleStep)+40, h-v1+30);
|
||||
|
||||
actualColor++;
|
||||
|
||||
if (actualColor >= colors.length) actualColor = 0;
|
||||
}
|
||||
}
|
||||
|
||||
pgChart.endDraw();
|
||||
|
||||
image(pgChart, x, y);
|
||||
}
|
||||
|
||||
void draw()
|
||||
{
|
||||
if (!hasData) return;
|
||||
|
||||
background(0);
|
||||
|
||||
drawChart("Pressure compare [Pa]", compareSeries, pressureValues, 10, 10, 150, false, false, 0, 0, 4);
|
||||
drawChart("Temperature compare [C]", compareSeries, temperatureValues, 10, 230, 150, false, false, 0, 0, 2);
|
||||
drawChart("Altitude compare [m]", compareSeries, altitudeValues, 10, 450, 150, false, false, 0, 0, 2);
|
||||
}
|
||||
|
||||
float getMin(float[][] chart)
|
||||
{
|
||||
float minValue = 0;
|
||||
float[] testValues = new float[chart.length];
|
||||
float testMin = 0;
|
||||
|
||||
for (int i = 0; i < actualSample; i++)
|
||||
{
|
||||
for (int j = 0; j < testValues.length; j++)
|
||||
{
|
||||
testValues[j] = chart[j][i];
|
||||
}
|
||||
|
||||
testMin = min(testValues);
|
||||
|
||||
if (i == 0)
|
||||
{
|
||||
minValue = testMin;
|
||||
} else
|
||||
{
|
||||
if (minValue > testMin) minValue = testMin;
|
||||
}
|
||||
}
|
||||
|
||||
return ceil(minValue)-1;
|
||||
}
|
||||
|
||||
float getMax(float[][] chart)
|
||||
{
|
||||
float maxValue = 0;
|
||||
float[] testValues = new float[chart.length];
|
||||
float testMax = 0;
|
||||
|
||||
for (int i = 0; i < actualSample; i++)
|
||||
{
|
||||
for (int j = 0; j < testValues.length; j++)
|
||||
{
|
||||
testValues[j] = chart[j][i];
|
||||
}
|
||||
|
||||
testMax = max(testValues);
|
||||
|
||||
if (i == 0)
|
||||
{
|
||||
maxValue = testMax;
|
||||
} else
|
||||
{
|
||||
if (maxValue < testMax) maxValue = testMax;
|
||||
}
|
||||
}
|
||||
|
||||
return ceil(maxValue);
|
||||
}
|
||||
|
||||
void nextSample(float[][] chart)
|
||||
{
|
||||
for (int j = 0; j < chart.length; j++)
|
||||
{
|
||||
float last = chart[j][maxSamples-1];
|
||||
|
||||
for (int i = 1; i < maxSamples; i++)
|
||||
{
|
||||
chart[j][i-1] = chart[j][i];
|
||||
}
|
||||
|
||||
chart[j][(maxSamples-1)] = last;
|
||||
}
|
||||
}
|
||||
|
||||
void serialEvent (Serial myPort)
|
||||
{
|
||||
String inString = myPort.readStringUntil(10);
|
||||
|
||||
if (inString != null)
|
||||
{
|
||||
inString = trim(inString);
|
||||
String[] list = split(inString, ':');
|
||||
|
||||
if (list.length != 6) return;
|
||||
|
||||
// Temperature compare
|
||||
temperatureValues[0][actualSample] = (float(list[0]));
|
||||
temperatureValues[1][actualSample] = (float(list[1]));
|
||||
|
||||
// Pressure compare
|
||||
pressureValues[0][actualSample] = (float(list[2]));
|
||||
pressureValues[1][actualSample] = (float(list[3]));
|
||||
|
||||
// Pressure compare
|
||||
altitudeValues[0][actualSample] = (float(list[4]));
|
||||
altitudeValues[1][actualSample] = (float(list[5]));
|
||||
|
||||
if (actualSample > 1)
|
||||
{
|
||||
hasData = true;
|
||||
}
|
||||
|
||||
if (actualSample == (maxSamples-1))
|
||||
{
|
||||
nextSample(temperatureValues);
|
||||
nextSample(pressureValues);
|
||||
nextSample(altitudeValues);
|
||||
} else
|
||||
{
|
||||
actualSample++;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user