🛒
0 товаров
0 руб.

Интернет-магазин «Неглупый Дом»


☀️ Проект: журнал выработки солнечной панели на ACS712 и EEPROM

Датчик ACS712 и память EEPROM

ACS712 периодически измеряет ток, отдаваемый солнечной панелью, а AT24C256 сохраняет эти значения — вечером можно посмотреть, как менялась выработка панели в течение дня.

Как это работает

ACS712 измеряет ток по эффекту Холла: он не вносит в цепь сопротивления (в отличие от шунтовых измерителей) и выдаёт на выходе аналоговое напряжение, пропорциональное протекающему току, с центром покоя около 2.5V при нулевом токе. Коэффициент пересчёта напряжения в ток зависит от варианта платы: у 5А-версии он около 0.185 В/А, у 20А-версии — около 0.100 В/А, у 30А-версии (как в этом скетче) — около 0.066 В/А. Для панелей на несколько ампер обычно хватает версии 20А.

AT24C256 — энергонезависимая EEPROM-память на шине I2C объёмом 256 кбит (32 КБ), которая хранит записи даже без питания — удобно для журнала, который должен "выжить" до следующего утра. Каждая запись занимает 2 байта (значение тока в мА как 16-битное число), адрес записи вычисляется как `index * 2`, а сама запись разбивается на старший и младший байт двумя операциями `Wire.write()`.

Пошаговая сборка

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

  1. Включите ACS712 последовательно в цепь между солнечной панелью и нагрузкой/аккумулятором (ток должен течь именно сквозь датчик, а не параллельно ему).
  2. Подключите выход ACS712 OUT → A0, VCC → 5V, GND → GND.
  3. Подключите AT24C256 по I2C: SDA → A4, SCL → A5, VCC → 5V/3.3V (смотрите маркировку модуля), GND → GND.
  4. Сверьте коэффициент в коде (`0.066`) с реальным вариантом вашей платы ACS712 (5А/20А/30А).

Скетч

// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.

#include <Wire.h>

const int sensorPin = A0;
const int EEPROM_ADDR = 0x50;
const int maxEntries = 100;
int writeIndex = 0;

void writeEntry(int index, int value) {
  int addr = index * 2;
  Wire.beginTransmission(EEPROM_ADDR);
  Wire.write(addr >> 8);    // старший байт адреса
  Wire.write(addr & 0xFF);  // младший байт адреса
  Wire.write(value >> 8);   // старший байт значения
  Wire.write(value & 0xFF); // младший байт значения
  Wire.endTransmission();
  delay(5); // EEPROM нужно время на запись цикла
}

void setup() {
  Serial.begin(9600);
  Wire.begin();
}

void loop() {
  int raw = analogRead(sensorPin);
  float voltage = (raw / 1023.0) * 5.0;
  float current = (voltage - 2.5) / 0.066; // коэффициент для варианта платы 30А
  int currentMa = (int)(current * 1000);

  writeEntry(writeIndex % maxEntries, currentMa);
  Serial.print("Записано, мА: ");
  Serial.println(currentMa);
  writeIndex++;

  delay(600000UL); // запись раз в 10 минут
}

Каждая запись занимает 2 байта, всего до 100 записей — при заполнении памяти запись продолжается по кругу (`% maxEntries`), затирая самые старые значения.

Частые проблемы

Как улучшить проект

Товары по теме

Ещё модули для Arduino: Электронные модули.

← ⚡ измеритель мощности на INA219 с выводом на…🔋 индикатор согласованного напряжения PD-три… →

🎁 Купить весь комплект со скидкой 10%

Все 2 товара сразу в корзину: 297 ₽ 267 ₽ (экономия 30 ₽)

Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.

Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.

Корзина


Поиск



Пример: понижающий или DC-DC или mini360 или aw-023 или арт. OZ/WB/YA