Nextion + Arduino. Мысли, идеи. Часть 2

  • Цена: 25$ + доставка

Продолжаю разбираться с экраном и его работой с Arduino, на этот раз буду измерять напряжение на аккумуляторе вольт-амперметром и выводить данные на экран с простейшей анимацией оставшейся емкости. Собственно тут будут обозреваться сразу два устройства экран и модуль INA219, который измеряет напряжение 0 — 26В и ток 3.2А
Мне нужно было выводить на экран напряжение аккумулятора 3х18650 в качестве индикации его состояния, насколько оно проседает при подключении нагрузки, ну и оставшуюся емкость на глазок измерять по напряжению, а так как я решил наконец нормально понять, как работать с этими экранами, то сделаю все на нем, как минимум в качестве рабочей модели.

Первым шагом делаем форму отображения информации для экрана, чтобы получить наглядное отображение измеряемой величины. Все что нужно для решения подобной задачи — это покопаться в яндекс картинках и вытащить изображение с батарейкой.
Так будет выглядеть готовая форма
Вместо полей Newtxt мы будем записывать показания с вольтметра и в зависимости от них рассчитывать оставшуюся емкость аккумулятора

По мере заряда/разряда показания будут изменяться, а значит изменяться будет и наше изображение, примерно вот так:

Зеленым будет заполняться изображение, которое я скачал и чутка подредактировал
Исходя из обилия материала в свободном доступе, можно сделать в десятки раз лучше, этот вариант для «ленивых» и на скорую руку, ниже будет эволюция этого примера, но если показать сразу итог будет не так понятно.

Как делалась примитивная форма для отображения уровня заряда аккумулятора
Теперь с чего начинать:
Запускаем Nextion Editor
Создаем новый документ
Создаем новый шрифт (в моем случае Tahoma 24 размер шрифта)
Вытаскиваем из интернета понравившееся изображение подгоняем его под разрешение экрана (400х240 в моем случае), получается примерно так (все делал в пэйнте, с фотошопом не знаком и это дает о себе знать):

Это изображение будет фоном рабочей области, т.е. добавляем изображение, кликаем по пустому пространству и в поле Атрибуты указываем наш фон (у меня это 6 изображение, т.к. я продолжаю документ из прошлой части)

Далее я добавил пять инструментов текст и инструмент Прогресс бар, с ним самый сложный момент, поскольку его необходимо аккурасно вписать внутрь батарейки, не задевая края и настроить атрибуты следующим образом:

В данный момент важен только один параметр — прогресс бар должен быть вертикальным, оставшиеся параметры, выделенные зеленым это цвет и процент заполнения, я выбрал белый и зеленый. Собственно на этом все, для проверки можете поиграть значением val у прогресс бара, чтобы проверить как он работает, но на этом этапе работу с экраном мы закончили.
Добавлю только один момент, если у вас несколько страниц, переход с одной на другую осуществляется через нажатие на область для которой в редакторе прописана команда
page page1 где page1 — страница на которую вы хотите перейти.
К примеру я продолжил проект, в котором делал анимацию, для перехода на вторую страницу я написал эту команду для этой самой анимации


Вольт-амперметр INA219
Так выглядит сам модуль

Если верить надписям на самом модуле, то его характеристики такие
Измеряемое напряжение 0-26В
Измеряемый ток до 3.2А
Подключается по I2C
Выводы Vin+ и Vin- подключаются в РАЗРЫВ!!! цепи, а не параллельно как вольтметр, хотя казалось бы… Короче один модуль умер убившись об лабораторный блок питания 5А у меня на работе, потом я резко начал искать и читать инструкцию, благо такие есть.
adafruit-ina219-current-sensor-breakout
ina219
Теперь по библиотекам, их быстрее искать через среду разработки


Я пользовался библиотекой от adafruit ina219, но вторая тоже рабочая, но рассчитана на более вдумчивое использование.
Пример из библиотеки adafruit из разряда тех, которые загрузил и получаешь данные на выходе в терминале

Немного о подключении:
1. Обязательна общая земля относительно измеряемого напряжения
2. Чтобы измерять напряжение, достаточно подключить один контакт Vin+ или Vin-
3. Повторюсь, для измерения тока, подключать в разрыв цепи, иначе будет кз через шунт 0,1Ом
И на сладкое, башковитые люди могут расширить измеряемый диапазон заменив шунт и откалибровав чип под новые реалии.
Вот результаты работы скетча, как видите напряжение измеряет прекрасно, по току сейчас идут паразитные значения, поскольку второй провод никуда не подключен. Не забудьте выставить скорость 115200 в терминале.
Vcc модуля на 5В ардуино
GND на GND
SCL на SCL
SDA на SDA
Vin+ подключен на 5В ардуины

BusVoltage — напряжение между GND и V-
ShuntVoltage — напряжение между V- и V+ (на шунте)
Current — ток, рассчитанный по закону Ома относительно напряжения на шунте

Вот такой первый взгляд на модуль, дальше будет его применение с экраном

Вывод значений от INA219 на экран
Здесь придется скрестить два примера из разных библиотек
Если смотреть по мере написания кода, то первым появился этот вариант

#include <Wire.h>
#include <Adafruit_INA219.h>
#include <SoftwareSerial.h>
#include <Nextion.h>
Adafruit_INA219 ina219;
SoftwareSerial nextion(2, 3);// Nextion TX to pin 2 and RX to pin 3 of Arduino
Nextion myNextion(nextion, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps
    int v=0;
    float busvoltage = 0;
void setup() 
  {
    Serial.begin(9600);
    myNextion.init();
    ina219.begin();
  }
void loop() 
{
  v=0;
  while(v<=100)
  {
    busvoltage = ina219.getBusVoltage_V();
//выводим значения напряжения в текстовое поле t3
    myNextion.setComponentText("t3", String(busvoltage)); 
//выводим значения счетчика от 0 до 100 в текстовое поле t4
    myNextion.setComponentText("t4", String(v));
//Заполняем прогресс бар от 0 до 100%
    myNextion.setComponentValue("j0", v);
    v++;
    delay(100);
  }
}

Как итог: значение напряжения выводятся, прогресс бар заполняется.
Из минусов библиотеки: нумерация текстовых полей сквозная для всех страниц, т.е. если на разных страницах есть два текстовых поля t0, то писать значение вы будете сразу в оба поля на обоих страницах. Минус условный, поскольку изменить номер инструмента вам никто не запрещает, более того в чем-то это даже полезно.
Далее если применять вольтметр для аккумуляторов 18650 нужно смотреть кривые разряда, чтобы написать зависимость напряжения от емкости, я этого делать не стал, по крайней мере на данном этапе, и сделал линейную зависимость.
4.25В = 100%
2.6В = 0%
Таким образом дельта в 1.65 В это наши 100%, 1%=0.0165 В, следовательно если напряжение лежит в заданных пределах, то 1% будет высчитываться по формуле:
v=((busvoltage-2.6)/0.0165)*N, где N количество аккумуляторов в сборке
Исходя из этого можно написать программу для 1s-2s-3s-4s сборок, так что если вам будет любопытно когда же зарядится аккумулятор вашего прибора/игрушки вы сможете это сделать, другое дело что использовать дисплей только для этого слишком мелко, разве что как одна из функций состояния.
Это код для одного аккумулятора 18650

#include <Wire.h>
#include <Adafruit_INA219.h>
#include <SoftwareSerial.h>
#include <Nextion.h>
Adafruit_INA219 ina219;
SoftwareSerial nextion(2, 3);// Nextion TX to pin 2 and RX to pin 3 of Arduino
Nextion myNextion(nextion, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps
    int v=0;
    float busvoltage = 0;
void setup() 
  {
    Serial.begin(9600);
    myNextion.init();
    ina219.begin();
  }
void loop() 
{
  busvoltage = ina219.getBusVoltage_V();
  if (busvoltage<2.59)
  {  
    myNextion.setComponentText("t0", "Low battery");
    myNextion.setComponentText("t3", "<2.59V"); 
    myNextion.setComponentText("t4", "0");
    myNextion.setComponentValue("j0", 0);
   }
  if (busvoltage>4.26)
  {
    myNextion.setComponentText("t0", "Overcharge");
    myNextion.setComponentText("t3", String(busvoltage));
    myNextion.setComponentText("t4", "100");
    myNextion.setComponentValue("j0", 100);
  }
  if(busvoltage>2.6 && busvoltage<4.25)
  {
    v=(busvoltage-2.6)/0.0165;
    myNextion.setComponentText("t0", "Power monitor");
    myNextion.setComponentText("t3", String(busvoltage)); 
    myNextion.setComponentText("t4", String(v));
    myNextion.setComponentValue("j0", v);
    delay(300);
  }
}



Вот предварительный результат, програсс бар заполняется по циклу, напряжение замеряется на выходе 3.3В ардуины.


Эволюция кода
Теперь если напряжение ниже 2.59В, появляется надпись «Low battery», если больше 4.26В — «Overcharge». Если напряжение в пределах нормы то выводим в прогресс бар рассчитанное значение текущей емкости.

#include <Wire.h>
#include <Adafruit_INA219.h>
#include <SoftwareSerial.h>
#include <Nextion.h>
Adafruit_INA219 ina219;
SoftwareSerial nextion(2, 3);// Nextion TX to pin 2 and RX to pin 3 of Arduino
Nextion myNextion(nextion, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps
    int v=0;
    float busvoltage = 0;
void setup() 
  {
    Serial.begin(9600);
    myNextion.init();
    ina219.begin();
  }
void loop() 
{
  busvoltage = ina219.getBusVoltage_V();
  if (busvoltage<2.59)
  {  
    myNextion.setComponentText("t0", "Low battery");
    myNextion.setComponentText("t3", "<2.59V"); 
    myNextion.setComponentText("t4", "0");
    myNextion.setComponentValue("j0", 0);
   }
  if (busvoltage>4.26)
  {
    myNextion.setComponentText("t0", "Overcharge");
    myNextion.setComponentText("t3", String(busvoltage));
    myNextion.setComponentText("t4", "100");
    myNextion.setComponentValue("j0", 100);
  }
  if(busvoltage>2.6 && busvoltage<4.25)
  {
    v=(busvoltage-2.6)/0.0165;
    myNextion.setComponentText("t0", "Power monitor");
    myNextion.setComponentText("t3", String(busvoltage)); 
    myNextion.setComponentText("t4", String(v));
    myNextion.setComponentValue("j0", v);
    delay(300);
  }
}


А теперь, когда принцип в целом понятен, удаляем к чертовой матери всю эту графику и делаем все более-менее нормально и применимо к реальным задачам
Исходные изображения
Отсюда взято изображение батарейки в обоих примерах

Делаем фон по размеру экрана. Индикация заряда батареи в верхнем правом углу — классика жанра, для наглядности Продублировал индикацию крупно, естественно в последствии я либо перенесу его на отдельную страницу либо удалю.

Эти два изображения одинаковые по размерам и предназначены для прогресс бара. Если до этого мы пользовались сплошными цветами, то сейчас зеленая картинка будет соответствовать полностью заряженному аккумулятору, черная — пустому



Заметьте, все на черном фоне, так на мой взгляд все намного проще и вместе с тем отлично смотрится.
Как уже упоминал, в итоге останется только индикатор батареи в верхнем углу, все остальное не более чем баловство. Подобным образом можно изобразить индикатор уровня сигнала и прочее и прочее. Иными словами статус панель делается без особых проблем. Вот итоговая форма для вывода информации:


Программная и железная часть
За неимением под рукой лабораторного блока питания пробовал брать напряжение с аналогового входа, однако вольтметр ловит и «0» и «1», но не как не средние значения, так что видео не будет, только пара фото с выходом GND, 5V, 3.3V.

#include <Wire.h>
#include <Adafruit_INA219.h>
#include <SoftwareSerial.h>
#include <Nextion.h>

//максимальное и минимальное значения напряжения аккумулятора
//3S
//#define minV 7.5
//#define maxV 12.75
//2S
//#define minV 5
//#define maxV 8.5
//1S
#define minV 2.5
#define maxV 4.25

Adafruit_INA219 ina219;
SoftwareSerial nextion(2, 3);// Nextion TX to pin 2 and RX to pin 3 of Arduino
Nextion myNextion(nextion, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps
    int progressbar=0,i;
    float busvoltage = 0;
String message;
void setup() 
  {
    Serial.begin(9600);
    myNextion.init();
    ina219.begin();
  }

void loop() 
{ 
   
  busvoltage = ina219.getBusVoltage_V();
  if(busvoltage<2.5)
  {
    myNextion.setComponentValue("j0", 0);
    myNextion.setComponentValue("j1", 0);
    myNextion.setComponentText("t0", "LOW");
    delay(100);
  }
  else if(busvoltage>4.25)
  {
    myNextion.setComponentValue("j0", 100);
    myNextion.setComponentValue("j1", 100);
    myNextion.setComponentText("t0", "HIGH");
    delay(100);
  }
  else 
  {
//Масштабирование значений по линейной шкале
//функция map не работает с дробными числами, поэтому *100
    progressbar = map(busvoltage*100, minV*100, maxV*100, 0, 100);
    Serial.print("busvoltage= ");
    Serial.println(busvoltage);
    Serial.print("progressbar= ");
    Serial.println(progressbar);
    myNextion.setComponentValue("j0", progressbar);
    myNextion.setComponentValue("j1", progressbar);
    myNextion.setComponentText("t0", String(busvoltage));
    delay(10);
  }
}

По времени второй вариант занял чуть больше часа.




Ссылки:
Первая часть обзора
Прошивка экрана первый вариант
Прошивка экрана второй вариант
Описание библиотеки экрана
Библиотека экрана туториал
Nextion_Instruction_Set
Ложка дегтя, сейчас столкнулся с проблемой получения посылок от экрана, чем больше код, тем чаще нажатия «теряются», скорее всего проблема программная.
+ Нашел шикарнейший видео обзор на экран

В качестве резюме:
1. Напряжение можно измерять посредством самой ардуины, сделав из нее вольтметр, причем если вам не будет хватать возможностей компаратора всегда можно воспользоваться делителем напряжения, так что модуль INA219 удобен, поскольку будет точнее измерять напряжения больше 5В, но не обязателен.
2. В экране можно разбираться очень долго, но конечный результат того стоит.
Планирую купить +27 Добавить в избранное +30 +53
+
avatar
  • sir0ta
  • 12 сентября 2016, 13:59
+3
Выводы Vin+ и Vin- подключаются в РАЗРЫВ!!! цепи
Ну как бы амперметр. Это логично что в разрыв.
+
avatar
  • SEM
  • 12 сентября 2016, 14:04
0
А есть к ардуино вывод в композит, т.е. на обычный тюльпан, PAL/SECAM, и к любому монитору (телевизору) с аналоговым входом?
+
avatar
0
ни разу не видел.
+
avatar
  • sim31r
  • 12 сентября 2016, 15:09
+2
Да, есть несколько проектов. Один вывод черно-белого сигнала PAL через SPI, к микроконтроллеру подключается 2 резистора, остальное программно. Есть проект на ПЛИС с внешней RAM, открытый. Там картинка генерируется аппаратно, Arduino просто обновляет видеопамять, ссылку не могу найти, картинка одна осталась:



Есть другое проект, похож
we.easyelectronics.ru/plis/formirovanie-vga-izobrazheniya-s-ispolzovaniem-nios-ii.html

Вот про PIC
kazus.ru/articles/19.html
+
avatar
  • phazz
  • 12 сентября 2016, 15:35
+2
правда я не проверял
+
avatar
0
Есть еще такой — radiogid.ucoz.ru/publ/arduino/proekty_na_arduino/podkljuchaem_k_arduino_vga_monitor_s_pomoshhju_biblioteki_duevga/15-1-0-1305 в дополнение к вышеуказанному материалу или если нужен только монохром при помощи микросхемы OSD например MAX7456 Single-Channel Monochrome On-Screen Display with Integrated EEPROM как например в этом проекте bascom.at.ua/publ/meteostancija_s_videovykhodom/1-1-0-117 можно так же наложить OSD поверх существующего потока видео f5mna.free.fr/Arduino.htm
+
avatar
  • Lucky13
  • 25 апреля 2019, 22:32
0
Как говорится: «Лучше поздно, чем никогда» — hackaday.io/project/21097-ntscpal-video-display-shield#menu-description
+
avatar
  • Nestor
  • 12 сентября 2016, 14:11
+1
занимательно конечно, но ПМСМ, для описываемого функционала чрезмерно избыточно
примерно как на тележку из супермаркета приделать реактивный двигатель :-)
+
avatar
  • Dumohod
  • 12 сентября 2016, 14:59
+3
Погуглил и удивился, насколько популярна эта тема.
+
avatar
  • Demz
  • 12 сентября 2016, 15:36
+2
по фен-шую чувак должен в коляске сидеть, а не сзади болтаться.
+
avatar
  • sim31r
  • 12 сентября 2016, 15:01
0
Тут скорее дело в цене, еще бы немного дешевле, была бы незаменимая плата. Хотя 2.5 дюйма вполне нормально.

Я экспериментировал с другими дисплеями, которые подключаются по 8-битной шине данных к Arduino, ни один не заработал по нормальному, где-то на экране были посторонние полосы, где-то не работал сенсор. Как говорится скупой платит дважды. Сейчас бы взял Nextion, если потребуется графический интерфейс.
+
avatar
  • sir0ta
  • 12 сентября 2016, 21:08
0
Покупал с 10 экранов. На половине не работала инициализация (автоматом контроллер не определялся, но при указании руками все норм), с остальными вообще проблем не было. Что-то вы делаете не так.
+
avatar
  • Sanja
  • 12 сентября 2016, 15:53
+2


Наверное, всё-таки не «Hight», а «High» (или, в вашем контексте, «Full»).

«Height» — это по-английски «высота»
+
avatar
0
Имеет место быть грамматическая ошибка, что сказать мой английский дал сбой, описался, в коде безусловно поправлю, а с изображениями… Да бог с ними. По коду эта надпись появится после превышения порога напряжения, т.е. при перезаряде. Спасибо за замечание.
+
avatar
  • dkuznets
  • 13 сентября 2016, 17:42
0
м.б. overvoltage или overload правильней? :)
Заказал себе маленький дисплейчик. Есть мысль прикрутить к своему приборчику.
Походу, теряются посылки при передаче (т.е. дисплей тупит) или при приеме (ардуина)?
Для меня принципиально. С приемом не должно быть проблем — ARM7 на 60 МГц работает.
+
avatar
0
Со стороны дисплея проблем нет. Слушал юарт отрабатывает чётко, грешу пока что на библиотеку
+
avatar
  • dkuznets
  • 18 сентября 2016, 08:48
0
А они всегда так с отправкой тупят? Почти 2 недели уже Processing
+
avatar
  • zombrero
  • 23 сентября 2016, 07:47
0
Город, нужен программист для создания небольшой автоматики для котельной. Просто есть задание — нужен код программы. Обучаться сейчас не хватает времени, а мне нужно понимать стоит или нет…
+
avatar
0
Какой город? Какое железо?