Автовольтметр с графиком тренда на OLED

vjwhite
Offline
Зарегистрирован: 11.01.2017

Добрый день, уважаемые формчане! Помогите пожалуйста начинающему. Это мой первый проект и в его реализации нужны советы грамотных программистов. Проект автомобильного вольтметра на ардуино с OLED дисплеем.

Из первоначальных функций задуманно:

Отображение напряжения в бортовой сети автомобиля с графиком тренда и регистрацией падения (просадок) напряжения (мигание яркостью со звуковым оповещением).

Изменение яркости дисплея при включении ближнего света фар (для того чтоб не слепил дисплей в темное время суток).

Из проблем с которыми столкнулся:

При первоначальном запуске ардино в графике тренда линия начинается с нулевой координаты, а дальше идет нормально согласно заданым параметрам map.

Не удается реализовать сквозное движение графика тренда (например как в проектах оссицилографов). У меня график достигнув конечной координаты стирается и начинает рисовать с начала. Пробовал убрать условие стирать при достижении 127 координаты, график доходит до конца и больше не строится.

Из того что хотел бы реализовать, но не пойму как:

К значению напряжения приписать букву "V". Варианты которые пробовал я накладывают букву "V" на выводимое значение напряжения или увеличивается пробел между ними.

При нажатии тактовой кнопки переключать "окна". Например в будующем при нажатии кнопки перейти в режим отображения внешней и внутренней температуры. На сколько я понимаю реализовать это можно через switch case, но как не пойму.

Справа от значения напряжения вывести максимальное и минимальное значение напряжения обновлемое допустим раз в минуту.

Код и видео:

#include <Wire.h> // подключаем библиотеку I2C интерфейса
#include <OLED_I2C.h> // подключаем бибилиотку OLED дисплея
OLED  myOLED(8, 9, 8); // SDA - 8pin, SCL - 9pin, пины подулючения дисплея
extern uint8_t SmallFont[]; // шрифт латинского текста
extern uint8_t RusFont[]; // шрифт русского текста
extern uint8_t MediumNumbers[]; // шрифт цифр показаний
const int voltPin = A0;  // пин подключенный к +АКБ
const int brighpin = 11;  // пин подключенный к индикатору ближнего света
float voltage = 0; // переменная вольтметра
int x, y, z = 0; // переменные графика тренда
int p = 10; // пин подключенный к бузеру
int BrighState = 0; // переменная регулировки яркости дисплея

void setup() {
  myOLED.begin(); // подключаем дисплей
  myOLED.clrScr(); // стираем все с дисплея
  pinMode(p, OUTPUT); // задаем 10 пин бузера как выход
  pinMode(brighpin, INPUT); // задаем 11 пин регулятора подсетки дисплея как вход
}

void loop() {
  BrighState = digitalRead(brighpin); // считываем состояние пина регулятора подсветки
  voltage = float(analogRead(voltPin))/68,2; // считываем значение на пине вольтметра, расчет произведен на предел значений 0-15В. 1023/15=68,2
  myOLED.setFont(RusFont); // выбираем русский шрифт
  myOLED.print("DJKMNVTNH", CENTER, 0);  // заголовок "ВОЛЬТМЕТР"
  myOLED.setFont(MediumNumbers); // выбираем шрифт цифр показаний
  myOLED.print(String(voltage), 30, 15); // выводим значение напряжения
  y = map(voltage, 10, 15, 63, 43); // задаем пределы значений для графика тренда. Где voltage-значение напряжения, 10-начальное напряжение, 15-конечное напряжение, 63-начальное значение напряжения, 43-конечное значение напряжения
  myOLED.drawLine(x, z, x+1, y); // рисуем линию тренда по заданным координатам со сдвигом верхнего передела на 1
  myOLED.update(); // обновляем информацию на дисплее
  z=y; 
  x++; // за каждый цикл к линии добавляем новую  новыми значениями
  if (x >= 127) { // создаем условие. Если значение x достигло 127 координаты, то
    x = 0; // начинаем рисовать график с начальной координаты
    myOLED.clrScr(); // и стираем все с дисплея
  }
  if (voltage <= 12.5) { // создаем уловие. Если значение напряжения упало ниже 12.5, то
    tone (p, 1915); // пищим бузером с чатотой 1915Гц
    myOLED.setBrightness(1); // уменьшаем подсветку дисплея
    delay(100); // ждем 100 Мс
    tone(p, 1700); // пищим бузером с чатотой 1700Гц
    myOLED.setBrightness(255); // увеличиваем подсетку
    delay(100); // ждем 100 Мс
    noTone(p); // отключаем бузер
    myOLED.setFont(RusFont); // выбираем русский шрифт
    myOLED.print("YBPRJT YFGHZ:TYBT", CENTER, 35);  // выводим ошибку "НИЗКОЕ НАПРЯЖЕНИЕ"
  }
  if (BrighState == HIGH) { // создаем условие для притухания подсетки дисплея при включении ближнего света. Если 12В с индикатора ближнего света приходит на 11 пин, то
    myOLED.setBrightness(1);  // уменьшаем подсветку дисплея
  }
  else { // если 12В не приходит, то
    myOLED.setBrightness(255); // оставляем яркость на максимальном уровне
  }

}

Ссылка на видео как выглядит проект на сегодня:

https://youtu.be/hT3C0Ecr2ds

Буду рад любым советам. Заранее благодарен всем откликнувшимся!

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Вот пример посмотри, недавно выкладывал http://arduino.ru/forum/programmirovanie/pomogite-razobratsya-s-displeem...
Видео работы https://youtu.be/Mu5i67Nwxj4
Вывод графмка по заданным размерам и в заданом месте с автомасштабированием шкалы.

vjwhite
Offline
Зарегистрирован: 11.01.2017

Во, спасибо! Буду курить как это ко мне прикрутить