вторник, 14 ноября 2017 г.

BMS-ка аккумулятора, информация

Разговаривал с Алексеем. Он рассказал тонкости BMS-ки.
Разъем нужно вытаскивать сначала черный левый провод, затем правый красный. Вставлять сначала черный, затем красный. Иначе СПАЛИШЬ!!!
При достижении 4.2 В на ячейке БМСка ее запараллеливает резистором, ток идет через резистор - элемент отдыхает от заряда, заряжаются другие в это время.

Ток балансировочный 100 мА. Это заключительный этап зарядки - балансировка. Характеризуется низким током зарядки и постоянным напряжением.

Хорошие элементы 20 мОм импеданс имеют, средние, как в ноутбуке, 40 мОм, плохие - за 80 мОм.


воскресенье, 5 ноября 2017 г.

Термометр с индикацией из ПЯТИ светодиодов!!!

ЗАДАЧА ПРОЕКТА

Задача следующая. Сделать термометр на arduino с минимальной индикацией.
У меня получилось на 5ти светодиодах. И показывает температуру от минус 255 до 255 градусов!!! Без дробной части. Один диод знак числа, и четыре - само число. Для каких целей? Может измерять температуру на улице, может дома, может маслопечки, может тела...Куда угодно можно тыкать датчиком!!!


СХЕМА УСТРОЙСТВА

 

Не показан знаковый светодиод. Он подключен аналогично и к 13 цифровому выходу.

ВНЕШНИЙ ВИД
 


МАТ. ЧАСТЬ

1 МИКРОКОНТРОЛЛЕР. Использовал ARDUINO PRO MINI 5v 16 MHz. Программировал программатором. Плюсовой провод отключал - запитывал аккумулятором. Их много купил в Китае. И программатор.

2  Питание. Элемент литиевый 18650, взял от старого ноута.

Они вот такие.
Батарейку предварительно полностью зарядил. Как заряжать, напишу в другом сообщении.
Преобразователь использовал на микрухе LM2577. Это повышающий от 3,5 В. Выход настроил на 5,1 В. Как раз разрядиться до 3,5В и преобразователь отключится. Полного разряда не произойдет! Плюсовой вывод батарейки отключается выключателем. На схеме не показан.


3 Датчик температуры. DS18B20.
Вот такой. В Китае продается.



DS18B20 это цифровой измеритель температуры, с  разрешением преобразования 9 - 12 разрядов и функцией тревожного сигнала контроля за температурой. Параметры контроля могут быть заданы пользователем и сохранены в энергонезависимой памяти датчика.
DS18B20 обменивается данными с микроконтроллером по однопроводной линии связи, используя протокол интерфейса 1-Wire.


Диапазон измерения температуры составляет от -55 до +125 °C. Для диапазона от -10 до +85 °C погрешность не превышает 0,5 °C.

4 Индикация. Пять светодиодов любого цвета. Я взял один зеленый (на знак) и четыре белых (число).


ТЕОРЕТИЧЕСКИЙ БАЗИС




Буду использовать четвертичную систему счисления. Это которая оперирует цифрами 0, 1, 2, 3 и все!!! Она родственница двоичной. Только двоичные разряды надо сгруппировать парами.
27D=00011011B=00 01 10 11 B=0123(4)
Т.е. 27 число, это 123 в четвертичной.


Нам тогда нужны 4 разряда - это число от 0 до 255 (байт). Для передачи температуры датчика -55 +125 градусов Цельсия в самый раз. 4 разряда - 4 светодиода.

4 градации светодиод может передать запросто. Они даже хорошо различимы на глаз:
0 - не горит. Однако чтобы обозначить светодиод в темноте (чтобы увидеть все четыре разряда), он будет иногда промаргивать.
1 - слабо горит. PWM10/255.
2 - меняется сила света, мигает. Раньше было горит в пол накала PWM127/255, но к сожалению в пол накала на глаз не получается отличить от полного накала ))) Пытался...
3 - горит сильно. Полный накал слишком ярко, использую PWM100/255.
 PWM - это pulse-width modulаtions.  Это ШИМ по нашему, широтно-импульсная модуляция.
Платы Ардуино на базе микроконтроллеров ATmega328 имеют 6 аппаратных широтно-импульсных модуляторов. Сигналы ШИМ могут быть сгенерированы на выводах 3, 5, 6, 9, 10, 11.
Использую 3,5,11,9 - соответственно разряды 0, 1, 2, 3. 6 у меня сгорел раньше от неудачных опытов ))) Это только у меня. Разряды нумеруются с 0го справа налево. Вот так:

3 разряд            2 разряд                1 разряд                0 разряд
0                                 1                           2                             3              = 27 градусов

Частота ШИМ Ардуино 488,28 Гц. Разрядность - 8 бит.

Но как перевести температуру в десятичной системе счисления (СС) в четверичную? Используем двоичную математику. Сдвиги вправо и поразрядное И.
Вот наши разряды:

ind0_=int(tmp) & 3;
ind1_=int(tmp)>>2 & 3;
ind2_=int(tmp)>>4 & 3;
ind3_=int(tmp)>>6 & 3;


Т.е. 3 это 00 00 00 11. Поразрядное И дает чистыми только два последних разряда, что нам и надо!!!. А сдиг вправо последовательно на два разряда позволяет получить остальные пары разрядов (старшие, которые правее).

Так:   00 01 10 11 &
          00 00 00 11
_________________
         00  00  00 11 = 3 - это 0й разряд.
Сдвигаем на два разряда.
00 01 10 11 >> 2 = 00 00 01 10
 Далее поразрядное И:

          00 00 01 10 &
          00 00 00 11
_________________
         00  00  00 10 = 2 - это 1й разряд.

И так далее все 4е разряда.









 КОД ПРОШИВКИ

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 10
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

int ind0 = 3;  //будут аналоговые выходы
int ind1 = 5;
int ind2 = 11;
int ind3 = 9;
int indsgn= 13;
int ind0_;
int ind1_;
int ind2_;
int ind3_;
double tmp;//температура
int sgn;
int i;


void setup(void)
{
  // start serial port
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
  pinMode(ind0, OUTPUT);    
  pinMode(ind1, OUTPUT);
  pinMode(ind2, OUTPUT);
  pinMode(ind3, OUTPUT);
  pinMode(indsgn, OUTPUT);
}

void loop(void)
{
 // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  sensors.requestTemperatures(); // Send the command to get temperatures
  tmp=sensors.getTempCByIndex(0);
 
if(tmp>-60&&tmp<200){//1 если температура хотя бы правдоподобная
i+=10;
if (i>=100) i=10;
Serial.print(millis());Serial.print(" ");Serial.print(tmp);Serial.print(" ");//печатаю ее
sgn=(tmp>0)-(tmp<0);
tmp=abs(tmp);
ind0_=int(tmp) & 3;
ind1_=int(tmp)>>2 & 3;
ind2_=int(tmp)>>4 & 3;
ind3_=int(tmp)>>6 & 3;

if(ind0_==0) {if(i==10) analogWrite(ind0,10); else analogWrite(ind0,0);}
if(ind0_==1) {analogWrite(ind0,10);}
if(ind0_==2) {analogWrite(ind0,i);}
if(ind0_==3) {analogWrite(ind0,100);}

if(ind1_==0) {if(i==10) analogWrite(ind1,10); else analogWrite(ind1,0);}
if(ind1_==1) {analogWrite(ind1,10);}
if(ind1_==2) {analogWrite(ind1,i);}
if(ind1_==3) {analogWrite(ind1,100);}

if(ind2_==0) {if(i==10) analogWrite(ind2,10); else analogWrite(ind2,0);}
if(ind2_==1) {analogWrite(ind2,10);}
if(ind2_==2) {analogWrite(ind2,i);}
if(ind2_==3) {analogWrite(ind2,100);}

if(ind3_==0) {if(i==10) analogWrite(ind3,10); else analogWrite(ind3,0);}
if(ind3_==1) {analogWrite(ind3,10);}
if(ind3_==2) {analogWrite(ind3,i);}
if(ind3_==3) {analogWrite(ind3,100);}

if(sgn<0) digitalWrite(indsgn, HIGH); else digitalWrite(indsgn, LOW);
Serial.print(ind0_);Serial.print(" ");
Serial.print(ind1_);Serial.print(" ");
Serial.print(ind2_);Serial.print(" ");
Serial.print(ind3_);Serial.print(" ");
}//1
Serial.println(); 
}
ПОРЯДОК ЭКСПЛУАТАЦИИ ПРИБОРА


Включили, он через 2 секунды показывает температуру.
Считали все четыре разряда.
0 - не горит (промаргивает для наглядности.
1 - слабо горит.
2 - меняется сила света, мигает.
3 - горит сильно.

Посмотрели по таблице температуру:




Здесь первые два разряда в самом левом столбце, остальные - в первой строке.
Или по формуле:

ТЕМПЕРАТУРА=3РАЗРЯД*64+2РАЗРЯД*16+1РАЗРЯД*4+0РАЗРЯД

Такую индикацию, думаю, будет видно и за 1 км (возможно). В бинокль. Т.е. считать показания 4-х светодиодов.

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

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ
1
Сунули под мышку. Показал 0211 (первый светодиод не светит, иногда промаргнивает, второй меняет яркость, третий и четвертый слабо светит). По таблице это 37 градусов. Вы больны, мистер!
2
За окно показал 0013(первые два промаргивают иногда, третий еле светит, а четвертый сильно горит). Это 7 градусов выше нуля. Одевай шапку!


АРХИВ ПРОЕКТА

В папку libraries arduino 1.0.6 киньте две папки OneWire и DallasTemperature, откройте temp1/temp1.ino и вперед, улучшать и модифицировать. Никаких авторских прав! Кроме библиотек OneWire и DallasTemperature, эти авторские )))

https://drive.google.com/open?id=0B1AR0G3hSwPZZGdMMFE0eFFSNVE

ВИДЕО

А надо?