#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_INA219.h>
#include <SPI.h>
#include <SD.h>
// LCD 20x4
LiquidCrystal_I2C lcd(0x27, 20, 4);
// RTC DS1307
RTC_DS1307 rtc;
// INA219
Adafruit_INA219 ina219;
// SD card
const int chipSelect = 10; // CS pin for SD card
// Simulated potentiometer analog pins
const int voltagePotPin = A0; // Simulate 0-20V
const int currentPotPin = A1; // Simulate 0-0.5A
const int powerPotPin = A2; // Simulate 0-10W
void setup() {
Serial.begin(9600);
// LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
// RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
lcd.setCursor(0, 1);
lcd.print("RTC Fail");
while (1);
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Set time to compile time
}
// INA219
if (!ina219.begin()) {
Serial.println("Failed to find INA219");
lcd.setCursor(0, 2);
lcd.print("INA219 Fail");
while (1);
}
// SD Card
if (!SD.begin(chipSelect)) {
Serial.println("SD init failed!");
lcd.setCursor(0, 3);
lcd.print("SD Card Fail");
while (1);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("System Ready");
delay(2000);
}
void loop() {
// Get time
DateTime now = rtc.now();
char timeBuf[20];
sprintf(timeBuf, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
// Get simulated values
float simVoltage = analogRead(voltagePotPin) * (20.0 / 1023.0);
float simCurrent = analogRead(currentPotPin) * (0.5 / 1023.0);
float simPower = analogRead(powerPotPin) * (10.0 / 1023.0);
// Get INA219 readings
float busVoltage = ina219.getBusVoltage_V(); // V
float current_mA = ina219.getCurrent_mA(); // mA
float power_mW = ina219.getPower_mW(); // mW
// Display on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(timeBuf);
lcd.setCursor(0, 1);
lcd.print("V:");
lcd.print(busVoltage, 1);
lcd.print("V I:");
lcd.print(current_mA / 1000.0, 3);
lcd.print("A");
lcd.setCursor(0, 2);
lcd.print("P:");
lcd.print(power_mW / 1000.0, 2);
lcd.print("W");
lcd.setCursor(0, 3);
lcd.print("SimV:");
lcd.print(simVoltage, 1);
lcd.print(" SimA:");
lcd.print(simCurrent, 2);
// Save to SD card
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.print(now.timestamp());
dataFile.print(", V=");
dataFile.print(busVoltage, 2);
dataFile.print("V, I=");
dataFile.print(current_mA / 1000.0, 3);
dataFile.print("A, P=");
dataFile.print(power_mW / 1000.0, 2);
dataFile.println("W");
dataFile.close();
} else {
Serial.println("Failed to open file");
}
delay(2000);
}