Электротранспорт
Пожалуйста, войдите или зарегистрируйтесь.


Расширенный поиск    

Реклама:

Индикация температуры аккумулятора на собственной светодиодной ленте колеса

Страницы: 1Вниз

Автор Тема: Индикация температуры аккумулятора на собственной светодиодной ленте колеса  (Прочитано 282 раз)

0 Пользователи и 1 Гость просматривают эту тему.

Taler

  • Местный
  • ****
  • Репутация: 7
  • Сообщений: 917
  • Россия, Москва
  • И зимой на батарейках!
  • Оффлайн Оффлайн
    • Награды
Владельцы электротранспорта, которые не спешат закрывать сезон как только появится первый снежок, отлично знают, что на морозе аккумуляторы имеют дурную привычку остывать. А остыв, эти теплолюбивые парни не только теряют прыть, но и могут довольно серьезно пострадать, если вы решите накормить озябшую батарейку электричеством. Казалось бы, кто ж заряжает аккумулятор на морозе? Но не забываем, что даже у самокатов бывает рекуперация, а что касается моноколес, то они просто не умеют тормозить иначе, и зарядка аккумулятора происходит каждый раз, когда вы замедляетесь.

В общем, батарею на зиму надо утеплять, но помимо того, не мешало бы и знать, какую на данный момент она имеет температуру.  А как это узнать? Ведь встроенный в колесо "градусник" находится довольно далеко от нее, в контроллере. Да и если аккумулятор утеплен, остывать он будет явно медленнее контроллера. Короче, ничего не остается, как пихать датчик в саму батарею, и каким-то образом выводить его показания для считывания ездоком.

И вот тут уже возможны варианты. Можно поступить просто, как я сделал это уже давно - взять простейший цифровой термометр на часовой батареечке и с выносным датчиком, да и врезать его прямо в крышку корпуса. Работает? Вполне. Удобно? Ну, более или менее, для того, чтобы считать показания, нужно приглядываться. Минус, по сути, один - нужно резать крышку, и не каждый владелец колеса способен на такое хирургическое вмешательство, да и не все к нему готовы.




Что ж делать? Вспоминаем, что многих колес есть встроенная лента светодиодов, причем это светодиоды управляемые, RGB. И тут судьба подкидывает нам приятный сюрприз - на самом деле все эти светодиодные ленты по сути одинаковы и отличаются лишь количеством собственно светодиодов, каждым из которых можно управлять как угодно. Воспользуемся этим, и превратим одну из светодиодных лент колеса KS-14D в индикатор температуры аккумулятора.




Итак, у нас есть светодиодная лента из семи WS2812 последовательно адресуемых RGB-светодиодов. Как же вывести на нее показания темпераруры? Ну, во-первых, нам потребуется датчик температуры.




Я возьму привычный, популярный и цифровой DS18b20, но, на самом деле, сгодится буквально что угодно, большая точность нам ни к чему. Во-вторых, понадобится минкроконтроллер, чтобы снять показания с датчика и отправить их на светодиодную ленту. Не будем усложнять, возьмем простенькую Arduino, в данном случае я остановился на Arduino Pro Mini 5V. Ну, и все это хозяйство нужно запитать от чего-то. И здесь все просто - дело в том, что любая из светодиодных лент получает от контроллера колеса вполне подходящее нам питание - 5 Вольт. Вот его и возьмем.

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



Ну что же, контроллер есть, питание есть, датчик есть, и даже светодиодная лента для индикации есть. Соединяем? Тут никаких особенных тонкостей, плюсы и минусы питания датчика и ленты мы подключаем к плюсу и минусу питания, которое мы берем с коннектора ленты, провод данных от датчика температуры отправляем на какой-нибудь цифровой пин Arduino, например, на 10, подтянув его попутно к плюсу питания резистором 4.7К, а линию данных светодиодной ленты - на другой цифровой пин. Ну, хоть на 9.

Осталось только написать и залить через программатор скетч - и все готово.

Скрытый текст
#include <Adafruit_NeoPixel.h> //библиотека работы с Neopixel, скачать и установить
#include <OneWire.h> //библиотека для работы с шиной OneWire датчика температуры, скачать и установить
#include <DallasTemperature.h> //библиотека для работы с датчиком температуры, скачать и установить
#define ONE_WIRE_BUS 10 //объявляем ногу, куда подключен провод данных датчика температуры (подтянуть резистором 4К7 к 5В)

OneWire oneWire(ONE_WIRE_BUS);  //Поднимаем OneWire на указанном порту

DallasTemperature sensors(&oneWire); //указываем на датчик температуры на OneWire

// arrays to hold device address
DeviceAddress insideThermometer;

#define PIN 9 // объявляем ногу, к которой подключен провод данных светодиода или ленты
#define count_led 7 // объявляем количество светодиодов в ленте (если используется всего один диод, а не лента, так и ставим: 1)
float inpt = 18; // объявляем переменную для температуры


Adafruit_NeoPixel pixels = Adafruit_NeoPixel(count_led, PIN, NEO_GRB + NEO_KHZ800); //создаем ленту на указанном порту


boolean blinking = false; // флаг мигания
boolean isON = true; // состояние ленты для мигания

unsigned long previousMillisTerm = 9000;
unsigned long previousMillisLED = 0;

long OnTime = 1500; // период цикла мигания в миллисекундах
long CheckPeriod = 10000; // время между опросами датчика температуры в миллисекундах


void setup() {
 
  sensors.begin(); //стартуем датчик температуры
  pixels.begin(); //стартуем светодиоды
  pixels.show(); // Устанавливаем все светодиоды в состояние "Выключено"
  sensors.getAddress(insideThermometer, 0); //получаем адрес датчика температуры

 
 
// Serial.begin(9600); //Для отладки можно включить монитор порта

 
}
void loop() {  //тело основного цикла

unsigned long currentMillis = millis(); // получаем текущее время в миллисекундах

if(currentMillis - previousMillisTerm >= CheckPeriod){ //проверяем, настало ли время опрашивать датчик температуры

  sensors.requestTemperatures(); // опрашиваем датчик температуры
  inpt = sensors.getTempC(insideThermometer); //получаем температуру в градусах
  //Serial.println(inpt); //для отладки можно посмотреть текущую температуру через монитор порта
  previousMillisTerm = currentMillis; // запоминаем момент времени последнего опроса датчика температуры
}

if(currentMillis - previousMillisLED >= OnTime) {  //проверяем, настало ли время начала цикла отображения (мигания)

  uint32_t blue = pixels.Color(0, 0, 255);  //задаем цвета
  uint32_t magenta = pixels.Color(255, 0, 255);
  uint32_t green = pixels.Color(0, 255, 0);
  uint32_t orange = pixels.Color(255, 90, 0);
  uint32_t red = pixels.Color(255, 0, 0);
  uint32_t black = pixels.Color(0, 0, 0);


for ( int i=0; i <= count_led-1; i++) {pixels.setPixelColor(i, black);} //выключаем все диоды на ленте

if (inpt < 2) {  //если температура меньше 2 градусов, заполняем ленту синим и выставляем флаг мигания
  for ( int i=0; i <= count_led-1; i++) {pixels.setPixelColor(i, blue);} blinking = true;
  }
if (inpt >= 2 && inpt < 10) {  //если температура 2-9 градусов, заполняем ленту синим пропорционально с конца
  for ( int i=0; i <= (inpt-2)/8*count_led; i++) {pixels.setPixelColor(count_led - 1 - i, blue);} blinking = false;
  }
if (inpt >= 10 && inpt < 15) {  //если температура 10-14 градусов, заполняем ленту лиловым пропорционально с конца
  for ( int i=0; i <= (inpt-10)/5*count_led; i++) {pixels.setPixelColor(count_led - 1 - i, magenta);} blinking = false;
  }
if (inpt >= 15 && inpt < 30) {  //если температура 15-29 градусов, заполняем ленту зеленым пропорционально с конца
  for ( int i=0; i <= (inpt-15)/15*count_led; i++) {pixels.setPixelColor(count_led - 1 - i, green);} blinking = false;
  }
if (inpt >= 30 && inpt < 40) {  //если температура 30-39 градусов, заполняем ленту оранжевым пропорционально с конца
  for ( int i=0; i <= (inpt-30)/10*count_led; i++) {pixels.setPixelColor(count_led - 1 - i, orange);} blinking = false;
  }
if (inpt >= 40 && inpt < 50) {  //если температура 40-49 градусов, заполняем ленту красным пропорционально с конца
  for ( int i=0; i <= (inpt-40)/10*count_led; i++) {pixels.setPixelColor(count_led - 1 - i, red);} blinking = false;
  }
if (inpt >= 50) {  //если температура 50 градусов и выше, заполняем ленту красным и выставляем флаг мигания
  for ( int i=0; i <= count_led-1; i++) {pixels.setPixelColor(i, red);} blinking = true;
  }


pixels.show(); //посылаем данные на светодиоды в ленте
previousMillisLED = currentMillis; //запоминаем последний момент обновления светодиодов
isON = true; //задаем статус "включено" для мигания
//Serial.println(currentMillis);
}

if (blinking && currentMillis - previousMillisLED >= OnTime/2 && isON) { //если прошла половина цикла, флаг мигания поднят и светодиоды горят
  for ( int i=0; i <= count_led-1; i++) {pixels.setPixelColor(i, pixels.Color(0, 0, 0));}  //очищаем ленту
  pixels.show(); //посылаем данные на светодиоды
  isON = false;  //ставим статус "выключена"
}
 
}


Скетч универсальный, изменением одной цифры можно настраивать количество диодов в ленте. Например, на KS-14D их семь, а на KS-16 - уже девять. А если в вашем колесе вообще нет ленты - не беда, подключите вместо нее всего один такой диод, и разместите его в удобном месте, просверлив для него малую дырочку в корпусе, и не забыв в скетче указать, что диод всего один. Не переживайте, простой цветовой индикации будет достаточно для того, чтобы понимать, что происходит с вашим аккумулятором.  Ну, а если лента, все-же, есть, то мы используем это богатство для того, чтобы индицировать температуру не только цветом, но и количеством горящих светодиодов.

Имейте в виду, что у колес KingSong коннектор подключения находится в верхней части ленты, поэтому заполняется она как бы "с конца", с края, противоположного коннектору, то есть с последнего по счету диода, а не с первого (они адресуются по порядку, начиная от ближайшего к коннектору). Если у вас лента расположена иначе, надо чуть подправить код.

Опрос датчика производится каждые 10 секунд, период мигания - полторы секунды. Все это настраивается константами в начале скетча. Можно, на самом деле, опрашивать датчик и раз в десять реже.

На данный момент алгоритм работает так:

если температура менее 2 градусов по Цельсию - лента (или один диод) мигает синим цветом
если температура от 2 до 10 градусов - лента заполняется синим цветом пропорционально температуре
если температура от 10 до 15 градусов - лента заполняется лиловым цветом пропорционально температуре
если температура от 15 до 30 градусов - лента заполняется зеленым цветом пропорционально температуре
если температура от 30 до 40 градусов - лента заполняется оранжевым цветом пропорционально температуре
если температура от 40 до 50 градусов - лента заполняется оранжевым цветом пропорционально температуре
если температура выше 50 градусов - лента (или один диод) мигает красным цветом


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

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

На самокаты такая штука тоже ставится враз. И тоже будет полезна, я думаю.
Если кто-то не может сделать ее самостоятельно - пишите, я сделаю.



« Последнее редактирование: 25 Фев 2018 в 11:24 от Taler »

Страницы: 1Вверх
 

Помощь форуму | Отказ от ответственности | Новая версия форума
©, Форум электротранспорта, electrotransport.ru, 2007—2018.
Копирование материалов возможно только с согласия правообладателя.

Размер занимаемой памяти: 5.75 мегабайт.
Страница сгенерирована за 0.153 секунд. Запросов: 35.