You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
6.4 KiB
101 lines
6.4 KiB
/* (C) D L BIRD
|
|
Эта функция построит график на ePaper / TFT / LCD дисплее, используя данные из массива,
|
|
содержащего данные для отображения на графике.
|
|
Переменная 'max_readings' определяет максимальное количество элементов данных для каждого массива.
|
|
Вызовите его со следующими параметрическими данными:
|
|
x_pos - положение оси x в верхнем левом углу графика
|
|
y_pos - верхнее левое положение графика по оси y, например, 100, 200 будет отображать график на 100 пикселей
|
|
вдоль и на 200 пикселей вниз от верхнего левого края экрана
|
|
gwidth - ширина графика в пикселях
|
|
height - высота графика в пикселях
|
|
Y1_Max - устанавливает масштаб отображаемых данных, например, 5000 будет масштабировать все данные
|
|
по оси Y максимум на 5000
|
|
data_array1 анализируется по значению, внешне они могут называться как угодно иначе, например,
|
|
внутри процедуры это называется data_array1, но внешне может быть temperature_readings
|
|
auto_scale - логическое значение (TRUE или FALSE), которое включает или выключает автоматическое
|
|
масштабирование по оси Y
|
|
barchart_on - логическое значение (TRUE или FALSE), которое переключает режим рисования
|
|
между barhcart и линейным графиком
|
|
barchart_colour -задает цвет заголовка и построения графика
|
|
Если вызывается со значением Y!_Max равным 500 и данные никогда не превышают 500, то автомасштабирование
|
|
сохранит масштаб 0-500 Y, если включено, масштаб увеличивается / уменьшается в соответствии с данными.
|
|
auto_scale_margin, например, если установлено значение 1000, то автоматическое масштабирование
|
|
увеличивает масштаб на 1000 шагов.
|
|
*/
|
|
void DrawGraph(int x_pos, int y_pos, int gwidth, int gheight, float Y1Min, float Y1Max, String title, float DataArray[], int readings, boolean auto_scale, boolean barchart_mode) {
|
|
#define auto_scale_margin 0 // Устанавливает автоматическое увеличение масштаба, так что ось увеличивается после изменения, например, на 3
|
|
#define y_minor_axis 5 // 5 y-axis division markers маркеры деления по оси y
|
|
display.setFont();
|
|
int maxYscale = -10000;
|
|
int minYscale = 10000;
|
|
int last_x, last_y;
|
|
float x2, y2;
|
|
// Serial.print("readings=");
|
|
// Serial.println(readings);
|
|
// for (int gx = 0; gx < readings; gx++) {
|
|
// Serial.print("gx=");
|
|
// Serial.println(DataArray[gx]);
|
|
// }
|
|
if (auto_scale == true) {
|
|
for (int i = 1; i < readings; i++ ) {
|
|
if (DataArray[i] >= maxYscale) maxYscale = DataArray[i];
|
|
if (DataArray[i] <= minYscale) minYscale = DataArray[i];
|
|
}
|
|
|
|
maxYscale = round(maxYscale + auto_scale_margin); // Auto scale the graph and round to the nearest value defined, default was Y1Max
|
|
Y1Max = round(maxYscale + 0.5);
|
|
if (minYscale != 0) minYscale = round(minYscale - auto_scale_margin); // Auto scale the graph and round to the nearest value defined, default was Y1Min
|
|
Y1Min = round(minYscale);
|
|
}
|
|
// Draw the graph
|
|
last_x = x_pos + 1;
|
|
last_y = y_pos + (Y1Max - constrain(DataArray[1], Y1Min, Y1Max)) / (Y1Max - Y1Min) * gheight;
|
|
display.drawRect(x_pos, y_pos, gwidth + 3, gheight + 2, GxEPD_BLACK);
|
|
drawString(x_pos - 40 + gwidth / 2, y_pos - 10, title, CENTER);
|
|
|
|
for (int gx = 0; gx < readings; gx++) {
|
|
x2 = x_pos + gx * gwidth / (readings - 1) - 1 ; // max_readings is the global variable that sets the maximum data that can be plotted
|
|
|
|
y2 = y_pos + (Y1Max - constrain(DataArray[gx], Y1Min, Y1Max)) / (Y1Max - Y1Min) * gheight + 1;
|
|
|
|
if (barchart_mode) {
|
|
display.fillRect(last_x + 2, y2, (gwidth / readings) - 1, y_pos + gheight - y2 + 2, GxEPD_BLACK);
|
|
} else {
|
|
display.drawLine(last_x, last_y - 1, x2, y2 - 1, GxEPD_BLACK); // Two lines for hi-res display
|
|
display.drawLine(last_x, last_y, x2, y2, GxEPD_BLACK);
|
|
}
|
|
last_x = x2;
|
|
last_y = y2;
|
|
}
|
|
//Draw the Y-axis scale
|
|
#define number_of_dashes 20
|
|
for (int spacing = 0; spacing <= y_minor_axis; spacing++) {
|
|
|
|
for (int j = 0; j < number_of_dashes; j++) { // пунктирные линии сетки графика
|
|
if (spacing < y_minor_axis) display.drawFastHLine((x_pos + 3 + j * gwidth / number_of_dashes), y_pos + (gheight * spacing / y_minor_axis), gwidth / (2 * number_of_dashes), GxEPD_BLACK);
|
|
}
|
|
if ((Y1Max - (float)(Y1Max - Y1Min) / y_minor_axis * spacing) < 5 ) {
|
|
drawString(x_pos - 20, y_pos + gheight * spacing / y_minor_axis - 5, String((Y1Max - (float)(Y1Max - Y1Min) / y_minor_axis * spacing + 0.01), 1), RIGHT);
|
|
}
|
|
else
|
|
{
|
|
if (Y1Min < 1 && Y1Max < 10) {
|
|
drawString(x_pos - 3-6, y_pos + gheight * spacing / y_minor_axis - 5, String((Y1Max - (float)(Y1Max - Y1Min) / y_minor_axis * spacing + 0.01), 1), RIGHT);
|
|
}
|
|
else {
|
|
if (Y1Min >99 && Y1Max < 9999)
|
|
{drawString(x_pos - 20, y_pos + gheight * spacing / y_minor_axis - 5, String((Y1Max - (float)(Y1Max - Y1Min) / y_minor_axis * spacing + 0.01), 0), RIGHT);
|
|
}
|
|
else
|
|
{
|
|
drawString(x_pos - 7-10, y_pos + gheight * spacing / y_minor_axis - 5, String((Y1Max - (float)(Y1Max - Y1Min) / y_minor_axis * spacing + 0.01), 0), RIGHT);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (int i = 0; i < 3; i++) {
|
|
drawString(28 + x_pos + gwidth / 3 * i, y_pos + gheight + 5, String(i) + "d", LEFT);//день1,2,3
|
|
if (i < 2) display.drawFastVLine(x_pos + gwidth / 3 * i + gwidth / 3, y_pos, gheight, GxEPD_BLACK);
|
|
}
|
|
}
|
|
//**********************************************************************************************************
|
|
|