
Интернет-магазин «Неглупый Дом»
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()`.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, что указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
#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: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 297 ₽ 267 ₽ (экономия 30 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.