#include #include ////////// Inputs ////////// int VoltPin = 15; int AmpPin = 14; int ResetPin = 1; //Digital int Reset; ////////// Variables ////////// double Volts; double Amps; double Watts = 0; double WattsAvg = 0; double WattsSum = 0; double WattHours = 0; double TotalWattHours = 0; double PrevWattHours = 0; double TotalKiloWattHours = 0; int Currentsecond; int Currentminute; int Currenthour; int Currentday; int Currentmonth; int Currentyear; int Previoussecond; int Previousminute; int Prevhour; unsigned long CurrentTime; unsigned long PrevTime; //Library for the Display #include #include LiquidCrystal_I2C lcd(0x27,20, 4); #include const int chipSelect = BUILTIN_SDCARD; void setup() { Serial.begin(115200); //Wire.begin(); Wire.setSDA(18); Wire.setSCL(19); pinMode(1, INPUT_PULLUP); ////////// Initialize the lcd ////////// lcd.init(); lcd.backlight(); lcd.setCursor(4,1); lcd.print("SOLAR LOGGER"); delay(2000); lcd.clear(); ////////// Time & Date Set ////////// setTime(15, 00, 0, 26, 7, 2019); // Hour Minute Second Day Month Year } void loop() { ////////// Time & Date ////////// Currentsecond = second(); Currentminute = minute(); Currenthour = hour(); Currentday = day(); Currentmonth = month(); Currentyear = year(); CurrentTime = millis(); ////////// Measurements ////////// Volts = (analogRead(VoltPin)-2)*0.0161; // (Raw volt value - Offset)*multiplier //Volts = analogRead(A0); // Read raw volt value Amps = (analogRead(A0)-761)*0.082; // (Raw amp value - Offset)*multiplier //Amps = analogRead(A0); // Read raw amp value Watts = Volts * Amps; if(Amps < 0){ Watts = 0; } if((CurrentTime-PrevTime) < 0){ Watts = 0; } WattHours = WattHours + Watts * ((CurrentTime - PrevTime) * 0.000000277); TotalWattHours = (TotalWattHours + Watts * ((CurrentTime - PrevTime) * 0.000000277)); TotalKiloWattHours = TotalWattHours * 0.001; PrevTime = CurrentTime; if(millis() > 4294967000){ PrevTime = 0; } Reset = digitalRead(1); if(Reset == LOW){ WattHours = 0; } ////////// LCD ////////// if(Currentsecond != Previoussecond){ // First line lcd.setCursor(1, 0); // (column, line) lcd.print(Volts, 2); lcd.setCursor(5, 0); lcd.print("V"); lcd.setCursor(8, 0); lcd.print(Amps, 2); lcd.setCursor(12, 0); lcd.print("A "); if(Watts > 100){ lcd.setCursor(15, 0); lcd.print(Watts, 0); } if(Watts > 10 && Watts < 100){ lcd.setCursor(15, 0); lcd.print(" "); lcd.print(Watts, 0); } if(Watts < 10){ lcd.setCursor(15, 0); lcd.print(" "); lcd.print(Watts, 0); } lcd.setCursor(18, 0); lcd.print("W "); // Second line lcd.setCursor(3, 1); lcd.print("Energy"); lcd.setCursor(11, 1); lcd.print(WattHours); lcd.setCursor(14, 1); lcd.print("Wh"); // Third line lcd.setCursor(3, 2); lcd.print("Total"); lcd.setCursor(10, 2); lcd.print(TotalKiloWattHours, 2); lcd.setCursor(13, 2); lcd.print("kWh"); // Fourth line if(Currenthour < 10){ lcd.setCursor(1, 3); lcd.print("0"); lcd.print(Currenthour); } else{ lcd.setCursor(1, 3); lcd.print(Currenthour); } lcd.setCursor(3, 3); lcd.print(":"); if(Currentminute < 10){ lcd.setCursor(4, 3); lcd.print("0"); lcd.print(Currentminute); } else{ lcd.setCursor(4, 3); lcd.print(Currentminute); } if(Currentday < 10){ lcd.setCursor(9, 3); lcd.print("0"); lcd.print(Currentday); } else{ lcd.setCursor(9, 3); lcd.print(Currentday); } lcd.setCursor(11, 3); lcd.print("/"); if(Currentmonth < 10){ lcd.setCursor(12, 3); lcd.print("0"); lcd.print(Currentmonth); } else{ lcd.setCursor(12, 3); lcd.print(Currentmonth); } lcd.setCursor(14, 3); lcd.print("/"); lcd.setCursor(15, 3); lcd.print(Currentyear); Previoussecond = Currentsecond; } ////////// SD Card ////////// if(Currenthour != Prevhour){ WattsAvg = TotalWattHours - PrevWattHours; PrevWattHours = TotalWattHours; SD.begin(chipSelect); String dataString = ""; dataString += String(Currenthour); dataString += ":"; dataString += String(Currentminute); dataString += ","; dataString += String(Currentday); dataString += "/"; dataString += String(Currentmonth); dataString += ","; dataString += String(Volts); dataString += ","; dataString += String(WattsAvg); dataString += ","; dataString += String(TotalWattHours); dataString += ","; File dataFile = SD.open("SOLARLOG.txt", FILE_WRITE); if (dataFile) { dataFile.println(dataString); dataFile.close(); Serial.println(dataString); } else { Serial.println("error opening datalog.txt"); } Previousminute = Currentminute; Prevhour = Currenthour; } ////////// Serial ////////// /* Serial.print("Time: "); Serial.print(CurrentHour); Serial.print(":"); Serial.print(Currentminute); Serial.print(" Date: "); Serial.print(Currentday); Serial.print("/"); Serial.print(Currentmonth); Serial.print("/"); Serial.print(Currentyear); Serial.print(" Volts: "); Serial.print(Volts); Serial.print(" Amps: "); Serial.print(Amps); Serial.print(" Watts: "); Serial.print(Watts); Serial.println(); */ delay(20); }