🛒
0 товар.
0 руб.
Логотип

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

☰
ИИ-консультант Wildberries OZON Яндекс Маркет
Поиск по сайту
Гугл таблица с ассортиментом

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

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

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

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

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

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

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

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

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

Скетч

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

#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 записей, при заполнении пишет по кругу, затирая старые.

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

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

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

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

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

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

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

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

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

Корзина

Поиск


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