Espruino:Примеры/Зарядное устройство для AA- и AAA-батареек

Материал из Онлайн справочника
Версия от 21:56, 22 мая 2023; Myagkij (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Зарядное устройство для AA- и AAA-батареек[1]

Многие зарядные устройства для AA- и AAA-батареек заряжают их парами, но во многих устройствах используются только 1 или 3 батарейки, и в результате получается так, что некоторые ваши батарейки или получают избыточный заряд или недополучают его. Кроме того, никель-кадмиевым (NiCd) и никель-металлогидридным (NiMH) батарейкам периодически необходима полная разрядка, но большинство обычных зарядных устройств её делать не умеют.

В итоге может случиться так, что у вас (как, например, у меня) будет целая гора перезаряжаемых батареек, но ни одна из них не будет заряжена как следует, а некоторые и вовсе будут больше непригодны для использования. Поэтому было бы здорово иметь маломощный зарядник, который работал бы постоянно, мог заряжать батарейки отдельно, автоматически разряжал их и сообщал их реальную ёмкость. Этим мы в этом руководстве и займёмся!

Примечание

Чтобы упростить задачу, в нашем заряднике зарядка и разрядка будет осуществляться напрямую через GPIO-контакты Espruino. Это значит, что быстро заряжать батарейки не получится (на их зарядку и разрядку могут потребоваться дни!).

Нам понадобятся

Подсоединение

  • Поместите макетную плату так, чтобы сторона с крайней красной полосой (обозначающей ряд положительных контактов) была вверху, а сторона с крайней синей полосой (обозначающей ряд отрицательных контактов) – внизу.
  • Подключите 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 мА, поэтому будьте осторожны, так как при попытке зарядить все батарейки сразу эту цифру можно нечаянно превысить.
  • Вы также можете воспользоваться полевыми транзисторами или чем-то вроде драйвера мотора, чтобы заряжать батарейки быстрее.

См.также

Внешние ссылки