Espruino:Примеры/Зарядное устройство для AA- и AAA-батареек: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...») |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=<ref>[ www.espruino.com - ]</ref>= | =Зарядное устройство для AA- и AAA-батареек<ref>[https://www.espruino.com/Battery+Charger www.espruino.com - AA/AAA Battery Charger]</ref>= | ||
[Картинка] | |||
Многие зарядные устройства для AA- и AAA-батареек заряжают их парами, но во многих устройствах используются только 1 или 3 батарейки, и в результате получается так, что некоторые ваши батарейки или получают избыточный заряд или недополучают его. Кроме того, никель-кадмиевым (NiCd) и никель-металлогидридным (NiMH) батарейкам периодически необходима полная разрядка, но большинство обычных зарядных устройств её делать не умеют. | |||
В итоге может случиться так, что у вас (как, например, у меня) будет целая гора перезаряжаемых батареек, но ни одна из них не будет заряжена как следует, а некоторые и вовсе будут больше непригодны для использования. Поэтому было бы здорово иметь маломощный зарядник, который работал бы постоянно, мог заряжать батарейки отдельно, автоматически разряжал их и сообщал их реальную ёмкость. Этим мы в этом руководстве и займёмся! | |||
'''Примечание:''' Чтобы упростить задачу, в нашем заряднике зарядка и разрядка будет осуществляться напрямую через GPIO-контакты Espruino. Это значит, что быстро заряжать батарейки не получится (на их зарядку и разрядку могут потребоваться дни!). | |||
== Нам понадобятся == | |||
* Одна [https://www.espruino.com/Pico плата Espruino Pico] | |||
* [https://www.espruino.com/Breadboard Длинная макетная плата] | |||
* [https://www.espruino.com/PCD8544 LCD-дисплей PCD8544] | |||
* Несколько соединительных проводов (подойдут обычные провода с однопроволочной жилой) | |||
* Четыре резистора на 100 ом | |||
* Держатели для AA- и AAA-батареек с контактами (можно купить, например, у Rapid Electronics: [https://www.rapidonline.com/Electrical-Power/TruPower-BH-311-1P-1-X-AA-PCB-Battery-Holder-18-2960 AA] и [https://www.rapidonline.com/Electrical-Power/TruPower-BH-411-3P-1-X-AAA-PCB-Battery-Holder-18-2920 AAA]) | |||
== Подсоединение == | |||
[Картинка] | |||
* Поместите макетную плату так, чтобы сторона с крайней красной полосой (обозначающей ряд положительных контактов) была вверху, а сторона с крайней синей полосой (обозначающей ряд отрицательных контактов) – внизу. | |||
* Подключите Espruino Pico к макетной плате как можно левее (см. фото выше). | |||
* Возьмите провод и один его конец подключите к контакту GND на Pico (это самый левый контакт Pico), а другой – к отрицательному (синему) ряду контактов, который находится в нижней части макетной платы. На фото выше этого провода не видно, потому что он находится под LCD-дисплеем. | |||
* Подключите LCD-дисплей PCD8544 к макетной плате под Pico – так, чтобы два самых правых контакта дисплея не были подключены к Pico. В результате LCD-дисплей должен лежать поверх заземляющего провода. | |||
* Возьмите провод и один его конец подключите к контакту B1 на Pico, а другой – к макетной плате к самому верхнему контакту в пятом 5-контактном столбце справа от Pico (см. фото выше). | |||
* Возьмите резистор на 75 ом, согните его, подрежьте до нужной длины и подключите к макетной плате по диагонали между и 5 и 6 столбцами справа от Pico. | |||
* Теперь подключите к макетной плате ещё 3 пары из провода и резистора. Провода должны быть подключены одним концом к контактам A7, A6 и A5 на Pico, а другим – к одному из контактов своего резистора, и расстояние между этими подключениями должно составлять 7 столбцов. Примечание: Это вариант для AAA-батареек; для AA-батареек вам понадобится расстояние побольше. | |||
* Подрежьте контакты батарейных держателей, чтобы они вместились в макетную плату, а затем подключите держатели к макетной плате по диагонали. В результате положительный контакт держателя должен быть подключен к резистору (см. фото ниже), а отрицательный – к нижнему ряду отрицательных контактов на макетной плате. | |||
[Картинка] | |||
* Теперь подключите к LCD-дисплею два провода. Первый – между контактом B10 на Pico и контактом макетной платы, который находится прямо справа от самого нижнего правого контакта Pico. Второй – между контактом B13 на Pico и контактом макетной плате, который находится над самым правым контактом LCD-дисплея. Пример смотрите на фото выше. | |||
Готово! | |||
== Код == | |||
Подключитесь к плате с помощью Web IDE, скопируйте код ниже, вставьте его в правую часть Web IDE и загрузите на плату: | |||
<syntaxhighlight lang="javascript" enclose="div"> | <syntaxhighlight lang="javascript" enclose="div"> | ||
var g; | |||
B3.write(0); // контакт GND | |||
// B4.write(1); // подсветка | |||
B5.write(1); // контакт VCC | |||
// Контакты, к которым подключены батарейки: | |||
var BATS = [ B1, A7, A6, A5 ]; | |||
// Значение резистора: | |||
var RESISTOR_VALUE = 100; | |||
// Мы заряжаем или разряжаем батарейки? | |||
var batCharge = [ 0, 0, 0, 0 ]; | |||
// Сколько заряда было добавлено в батарейки (в мА)? | |||
var cntCharge = [ 0, 0, 0, 0 ]; | |||
// Насколько батарейки были разряжены (в мА)? | |||
var cntDischarge = [ 0, 0, 0, 0 ]; | |||
function getBatteryVoltages() { | |||
var voltages = [0,0,0,0]; | |||
// Считываем напряжение несколько раз | |||
// и рассчитываем среднее значение: | |||
var N = 20; | |||
for (var i=0;i<N;i++) { | |||
for (var b=0;b<BATS.length;b++) { | |||
digitalWrite(BATS[b], 0); | |||
voltages[b] += analogRead(BATS[b])*3.3/N; | |||
} | |||
} | |||
// Проверяем, отключена ли батарея, | |||
// включив подтягивающий резистор | |||
// и посмотрев, повышается ли напряжение: | |||
for (var b=0;b<BATS.length;b++) { | |||
pinMode(BATS[b], "input_pullup"); | |||
if (digitalRead(BATS[b])) | |||
voltages[b] = -1; // батарейка не подключена | |||
pinMode(BATS[b]); // режим по умолчанию | |||
} | |||
return voltages; | |||
} | |||
var lastInterval; | |||
function onInterval() { | |||
var time = getTime() - lastInterval; | |||
lastInterval = getTime(); | |||
var hrs = time/3600; // масштабируем время | |||
// к более маленькому значению | |||
// Для каждой батареи... | |||
var volts = getBatteryVoltages(); | |||
for (var i=0;i<4;i++) { | |||
// Обновляем зарядные счётчики: | |||
if (batCharge[i]) | |||
cntCharge[i] += hrs*(3.3-volts[i])/RESISTOR_VALUE; | |||
else | |||
cntDischarge[i] += hrs*volts[i]/RESISTOR_VALUE; | |||
// Определяем, что выполняется – зарядка или разрядка: | |||
if (!batCharge[i] && volts[i]<=0.8) | |||
batCharge[i] = 1; // теперь заряжаем | |||
if (volts[i] < 0) { | |||
// Батарейки нет – сбрасываем до значений по умолчанию: | |||
batCharge[i] = 0; | |||
cntCharge[i] = 0; | |||
cntDischarge[i] = 0; | |||
} | |||
digitalWrite(BATS[i], batCharge[i]); | |||
} | |||
// Теперь обновляем дисплей: | |||
g.clear(); | |||
g.drawString("Battery Charger",0,0); | |||
g.drawLine(0,8,84,8); | |||
for (i=0;i<4;i++) { | |||
var x = 84*(i+0.5)/4; | |||
g.drawStringCenter(i+1, x, 12); | |||
g.drawLine(x-8,18,x+8,18); | |||
if (volts[i] >= 0) { | |||
g.drawStringCenter(batCharge[i] ? "CHG" : "DIS", x, 20); | |||
g.drawStringCenter(volts[i].toFixed(2), x, 28); | |||
g.drawStringCenter(cntDischarge[i] ? (cntDischarge[i]|0) : "-", x, 36); | |||
g.drawStringCenter(cntCharge[i] ? (cntCharge[i]|0) : "-", x, 42); | |||
} else { | |||
g.drawStringCenter("-", x, 20); | |||
} | |||
} | |||
g.flip(); | |||
} | |||
function onInit() { | |||
var spi = new SPI(); | |||
spi.setup({ sck:B6, mosi:B7 }); | |||
g = require("PCD8544").connect(spi, A8 /*DC*/, B10 /*CE*/, B13 /*RST*/, function() { | |||
g.setRotation(2); | |||
g.clear(); | |||
g.drawString("Loading...",0,0); | |||
g.drawLine(0,10,84,10); | |||
g.flip(); | |||
}); | |||
g.drawStringCenter = function(txt,x,y) { | |||
this.drawString(txt, x-this.stringWidth(txt)/2, y); | |||
}; | |||
lastInterval = getTime(); | |||
setInterval(onInterval, 2000); | |||
} | |||
// Что будет происходить при нажатии на кнопку: | |||
setWatch(function() { | |||
if (batCharge=="0,0,0,0") batCharge.fill(1); | |||
else batCharge.fill(0); | |||
cntCharge.fill(0); | |||
cntDischarge.fill(0); | |||
onInterval(); | |||
}, BTN, { repeat: true, edge:"rising", debounce:50}); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Теперь напечатайте save() в левой части Web IDE. В результате на дисплее должна появиться надпись «Loading...», а спустя 2 секунды он начнёт показывать состояние зарядки 4 подключенных к Espruino батареек. | |||
== Использование == | |||
Просто подключите свои батарейки, и Espruino их распознает. На LCD-дисплее появится информация об их текущем напряжении, а надпись «DIS» рядом с батарейкой будет означать, что в данный момент выполняется её разрядка (при 20 мА это может занять несколько дней). | |||
* В верхнем счётчике показывается, насколько в данный момент разряжена батарейка (единица измерения близка к миллиампер-часам). | |||
* Когда заряд батарейки дойдёт до 0.8 вольт, Espruino начнёт её перезаряжать. В этот момент по верхнему счётчику можно будет примерно судить, какой ёмкостью обладает батарейка (единица измерения близка к миллиампер-часам). | |||
* Espruino продолжит заряжать батарейку примерно при 20 мА. На дисплее в этот момент будет надпись «CHG», а на втором счётчике – то, сколько заряда было добавлено во время зарядки (единица измерения близка к миллиампер-часам). На этом этапе и никель-кадмиевые, и никель-металлогидридные батарейки можно заряжать капельной зарядкой в течение долгого времени. | |||
* При помощи кнопки на Pico вы можете переключать все подключенные батарейки между режимами зарядки и разрядки. Если вы хотите переключить только одну батарейку, то отключите её на несколько секунд, а потом снова подключите. | |||
== Что дальше == | |||
* Этот проект можно расширить за счёт увеличения количества заряжаемых батареек. При помощи маленьких аналоговых 0.05-дюймовых контактов сбоку Pico вы можете дополнительно подключить к проекту ещё 5 батареек (в итоге их количество увеличится до 9). Но загвоздка в том, что чип Espruino может подавать на каждый контакт не более 25 мА, а суммарно – не более 100 мА, поэтому будьте осторожны, так как при попытке зарядить все батарейки сразу эту цифру можно нечаянно превысить. | |||
* Вы также можете воспользоваться полевыми транзисторами или чем-то вроде драйвера мотора, чтобы заряжать батарейки быстрее. | |||
=См.также= | =См.также= |
Версия от 22:05, 11 июля 2021
Зарядное устройство для AA- и AAA-батареек[1]
[Картинка]
Многие зарядные устройства для AA- и AAA-батареек заряжают их парами, но во многих устройствах используются только 1 или 3 батарейки, и в результате получается так, что некоторые ваши батарейки или получают избыточный заряд или недополучают его. Кроме того, никель-кадмиевым (NiCd) и никель-металлогидридным (NiMH) батарейкам периодически необходима полная разрядка, но большинство обычных зарядных устройств её делать не умеют.
В итоге может случиться так, что у вас (как, например, у меня) будет целая гора перезаряжаемых батареек, но ни одна из них не будет заряжена как следует, а некоторые и вовсе будут больше непригодны для использования. Поэтому было бы здорово иметь маломощный зарядник, который работал бы постоянно, мог заряжать батарейки отдельно, автоматически разряжал их и сообщал их реальную ёмкость. Этим мы в этом руководстве и займёмся!
Примечание: Чтобы упростить задачу, в нашем заряднике зарядка и разрядка будет осуществляться напрямую через GPIO-контакты Espruino. Это значит, что быстро заряжать батарейки не получится (на их зарядку и разрядку могут потребоваться дни!).
Нам понадобятся
- Одна плата Espruino Pico
- Длинная макетная плата
- LCD-дисплей PCD8544
- Несколько соединительных проводов (подойдут обычные провода с однопроволочной жилой)
- Четыре резистора на 100 ом
- Держатели для AA- и AAA-батареек с контактами (можно купить, например, у Rapid Electronics: AA и AAA)
Подсоединение
[Картинка]
- Поместите макетную плату так, чтобы сторона с крайней красной полосой (обозначающей ряд положительных контактов) была вверху, а сторона с крайней синей полосой (обозначающей ряд отрицательных контактов) – внизу.
- Подключите Espruino Pico к макетной плате как можно левее (см. фото выше).
- Возьмите провод и один его конец подключите к контакту GND на Pico (это самый левый контакт Pico), а другой – к отрицательному (синему) ряду контактов, который находится в нижней части макетной платы. На фото выше этого провода не видно, потому что он находится под LCD-дисплеем.
- Подключите LCD-дисплей PCD8544 к макетной плате под Pico – так, чтобы два самых правых контакта дисплея не были подключены к Pico. В результате LCD-дисплей должен лежать поверх заземляющего провода.
- Возьмите провод и один его конец подключите к контакту B1 на Pico, а другой – к макетной плате к самому верхнему контакту в пятом 5-контактном столбце справа от Pico (см. фото выше).
- Возьмите резистор на 75 ом, согните его, подрежьте до нужной длины и подключите к макетной плате по диагонали между и 5 и 6 столбцами справа от Pico.
- Теперь подключите к макетной плате ещё 3 пары из провода и резистора. Провода должны быть подключены одним концом к контактам A7, A6 и A5 на Pico, а другим – к одному из контактов своего резистора, и расстояние между этими подключениями должно составлять 7 столбцов. Примечание: Это вариант для AAA-батареек; для AA-батареек вам понадобится расстояние побольше.
- Подрежьте контакты батарейных держателей, чтобы они вместились в макетную плату, а затем подключите держатели к макетной плате по диагонали. В результате положительный контакт держателя должен быть подключен к резистору (см. фото ниже), а отрицательный – к нижнему ряду отрицательных контактов на макетной плате.
[Картинка]
- Теперь подключите к LCD-дисплею два провода. Первый – между контактом B10 на Pico и контактом макетной платы, который находится прямо справа от самого нижнего правого контакта Pico. Второй – между контактом B13 на Pico и контактом макетной плате, который находится над самым правым контактом LCD-дисплея. Пример смотрите на фото выше.
Готово!
Код
Подключитесь к плате с помощью Web IDE, скопируйте код ниже, вставьте его в правую часть Web IDE и загрузите на плату:
var g;
B3.write(0); // контакт GND
// B4.write(1); // подсветка
B5.write(1); // контакт VCC
// Контакты, к которым подключены батарейки:
var BATS = [ B1, A7, A6, A5 ];
// Значение резистора:
var RESISTOR_VALUE = 100;
// Мы заряжаем или разряжаем батарейки?
var batCharge = [ 0, 0, 0, 0 ];
// Сколько заряда было добавлено в батарейки (в мА)?
var cntCharge = [ 0, 0, 0, 0 ];
// Насколько батарейки были разряжены (в мА)?
var cntDischarge = [ 0, 0, 0, 0 ];
function getBatteryVoltages() {
var voltages = [0,0,0,0];
// Считываем напряжение несколько раз
// и рассчитываем среднее значение:
var N = 20;
for (var i=0;i<N;i++) {
for (var b=0;b<BATS.length;b++) {
digitalWrite(BATS[b], 0);
voltages[b] += analogRead(BATS[b])*3.3/N;
}
}
// Проверяем, отключена ли батарея,
// включив подтягивающий резистор
// и посмотрев, повышается ли напряжение:
for (var b=0;b<BATS.length;b++) {
pinMode(BATS[b], "input_pullup");
if (digitalRead(BATS[b]))
voltages[b] = -1; // батарейка не подключена
pinMode(BATS[b]); // режим по умолчанию
}
return voltages;
}
var lastInterval;
function onInterval() {
var time = getTime() - lastInterval;
lastInterval = getTime();
var hrs = time/3600; // масштабируем время
// к более маленькому значению
// Для каждой батареи...
var volts = getBatteryVoltages();
for (var i=0;i<4;i++) {
// Обновляем зарядные счётчики:
if (batCharge[i])
cntCharge[i] += hrs*(3.3-volts[i])/RESISTOR_VALUE;
else
cntDischarge[i] += hrs*volts[i]/RESISTOR_VALUE;
// Определяем, что выполняется – зарядка или разрядка:
if (!batCharge[i] && volts[i]<=0.8)
batCharge[i] = 1; // теперь заряжаем
if (volts[i] < 0) {
// Батарейки нет – сбрасываем до значений по умолчанию:
batCharge[i] = 0;
cntCharge[i] = 0;
cntDischarge[i] = 0;
}
digitalWrite(BATS[i], batCharge[i]);
}
// Теперь обновляем дисплей:
g.clear();
g.drawString("Battery Charger",0,0);
g.drawLine(0,8,84,8);
for (i=0;i<4;i++) {
var x = 84*(i+0.5)/4;
g.drawStringCenter(i+1, x, 12);
g.drawLine(x-8,18,x+8,18);
if (volts[i] >= 0) {
g.drawStringCenter(batCharge[i] ? "CHG" : "DIS", x, 20);
g.drawStringCenter(volts[i].toFixed(2), x, 28);
g.drawStringCenter(cntDischarge[i] ? (cntDischarge[i]|0) : "-", x, 36);
g.drawStringCenter(cntCharge[i] ? (cntCharge[i]|0) : "-", x, 42);
} else {
g.drawStringCenter("-", x, 20);
}
}
g.flip();
}
function onInit() {
var spi = new SPI();
spi.setup({ sck:B6, mosi:B7 });
g = require("PCD8544").connect(spi, A8 /*DC*/, B10 /*CE*/, B13 /*RST*/, function() {
g.setRotation(2);
g.clear();
g.drawString("Loading...",0,0);
g.drawLine(0,10,84,10);
g.flip();
});
g.drawStringCenter = function(txt,x,y) {
this.drawString(txt, x-this.stringWidth(txt)/2, y);
};
lastInterval = getTime();
setInterval(onInterval, 2000);
}
// Что будет происходить при нажатии на кнопку:
setWatch(function() {
if (batCharge=="0,0,0,0") batCharge.fill(1);
else batCharge.fill(0);
cntCharge.fill(0);
cntDischarge.fill(0);
onInterval();
}, BTN, { repeat: true, edge:"rising", debounce:50});
Теперь напечатайте save() в левой части Web IDE. В результате на дисплее должна появиться надпись «Loading...», а спустя 2 секунды он начнёт показывать состояние зарядки 4 подключенных к Espruino батареек.
Использование
Просто подключите свои батарейки, и Espruino их распознает. На LCD-дисплее появится информация об их текущем напряжении, а надпись «DIS» рядом с батарейкой будет означать, что в данный момент выполняется её разрядка (при 20 мА это может занять несколько дней).
- В верхнем счётчике показывается, насколько в данный момент разряжена батарейка (единица измерения близка к миллиампер-часам).
- Когда заряд батарейки дойдёт до 0.8 вольт, Espruino начнёт её перезаряжать. В этот момент по верхнему счётчику можно будет примерно судить, какой ёмкостью обладает батарейка (единица измерения близка к миллиампер-часам).
- Espruino продолжит заряжать батарейку примерно при 20 мА. На дисплее в этот момент будет надпись «CHG», а на втором счётчике – то, сколько заряда было добавлено во время зарядки (единица измерения близка к миллиампер-часам). На этом этапе и никель-кадмиевые, и никель-металлогидридные батарейки можно заряжать капельной зарядкой в течение долгого времени.
- При помощи кнопки на Pico вы можете переключать все подключенные батарейки между режимами зарядки и разрядки. Если вы хотите переключить только одну батарейку, то отключите её на несколько секунд, а потом снова подключите.
Что дальше
- Этот проект можно расширить за счёт увеличения количества заряжаемых батареек. При помощи маленьких аналоговых 0.05-дюймовых контактов сбоку Pico вы можете дополнительно подключить к проекту ещё 5 батареек (в итоге их количество увеличится до 9). Но загвоздка в том, что чип Espruino может подавать на каждый контакт не более 25 мА, а суммарно – не более 100 мА, поэтому будьте осторожны, так как при попытке зарядить все батарейки сразу эту цифру можно нечаянно превысить.
- Вы также можете воспользоваться полевыми транзисторами или чем-то вроде драйвера мотора, чтобы заряжать батарейки быстрее.
См.также
Внешние ссылки