#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd1(0x27, 16, 2);
LiquidCrystal_I2C lcd2(0x30, 16, 2);
int plot_array[20]; // массив данных для графика
#include <microDS18B20.h>
MicroDS18B20<11> ds1;
MicroDS18B20<12> ds2;
#include <Arduino.h>
#include <EncButton.h>
Button bdw(2);
Button bup(3);
Button bs(4);
EncButton eb(5,6,7);
int var1 = 0;
int var2 = 0;
int var3 = 0;
uint8_t select = 1; // выбранная переменная
/*
const char* menu[] = {
"p1", // 0
"p2", // 1
"p3", // 2
};
*/
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
lcd1.init();
lcd2.init();
lcd1.backlight();
lcd2.backlight();
lcd1.clear();
lcd2.clear();
// инициализация символов для отрисовки. При использовании каких то своих символов,
// нужно вызывать эту функцию перед отрисовкой графика/полосы!
initPlot();
}
void loop() {
bup.tick();
bdw.tick();
bs.tick();
eb.tick();
if (eb.turn()){Serial.println("clots");};
if(bup.click()){
Serial.print("up ");
ds1.requestTemp();
static uint32_t tmr;
if (millis() - tmr >= 100) {
tmr = millis();
if (ds1.readTemp()) Serial.println(ds1.getTemp());
else Serial.println("error");
}}
digitalWrite(13, bdw.click());
//if(bdw.click()) {Serial.print("down ");}
delay(20);
int value = map(analogRead(0), 0, 1023, 0, 99);
// drawPlot принимает аргументы (столбец, строка, ширина, высота, мин. значение, макс. значение, величина)
// строка, столбец: начало графика - нижняя левая точка!
// значения целочисленные (int) и могут быть отрицательными!
// для примера отрисовка графика 12х4 занимает 140 миллисекунд
// график сдвигается на 1 шаг АВТОМАТИЧЕСКИ при вызове функции!
static uint32_t tmr;
if (millis() - tmr >= 200) {
tmr = millis();
drawPlot(0, 1, 16, 2, 0, 99, value);};
// также можно вывести минимум и максимум по отображаемому участку графика
int max_value = -32000;
int min_value = 32000;
for (byte i = 0; i < 12; i++) {
if (plot_array[i] > max_value) max_value = plot_array[i];
if (plot_array[i] < min_value) min_value = plot_array[i];
}
lcd2.setCursor(0, 1);
lcd2.print(value); lcd2.print(" ");
lcd2.setCursor(10, 0);
lcd2.print("max "); lcd2.print(max_value); lcd2.print(" ");
lcd2.setCursor(10, 1);
lcd2.print("min "); lcd2.print(min_value); lcd2.print(" ");
}
void initPlot() {
// необходимые символы для работы
byte row8[8] = {0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte row7[8] = {0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte row6[8] = {0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte row5[8] = {0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte row4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111};
byte row3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111};
byte row2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte row1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111};
lcd1.createChar(0, row8);
lcd1.createChar(1, row1);
lcd1.createChar(2, row2);
lcd1.createChar(3, row3);
lcd1.createChar(4, row4);
lcd1.createChar(5, row5);
lcd1.createChar(6, row6);
lcd1.createChar(7, row7);
}
void drawPlot(byte pos, byte row, byte width, byte height, int min_val, int max_val, int fill_val) {
for (byte i = 0; i < width; i++) {
plot_array[i] = plot_array[i + 1];
}
fill_val = constrain(fill_val, min_val, max_val);
plot_array[width] = fill_val;
for (byte i = 0; i < width; i++) { // каждый столбец параметров
byte infill, fract;
// найти количество целых блоков с учётом минимума и максимума для отображения на графике
infill = floor((float)(plot_array[i] - min_val) / (max_val - min_val) * height * 10);
fract = (infill % 10) * 8 / 10; // найти количество оставшихся полосок
infill = infill / 10;
for (byte n = 0; n < height; n++) { // для всех строк графика
if (n < infill && infill > 0) { // пока мы ниже уровня
lcd1.setCursor(i, (row - n)); // заполняем полными ячейками
lcd1.write(0);
}
if (n >= infill) { // если достигли уровня
lcd1.setCursor(i, (row - n));
if (fract > 0) lcd1.write(fract); // заполняем дробные ячейки
else lcd1.write(16); // если дробные == 0, заливаем пустой
for (byte k = n + 1; k < height; k++) { // всё что сверху заливаем пустыми
lcd1.setCursor(i, (row - k));
lcd1.write(16);
}
break;
}
}
}
}