#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h>
#include "DHT.h"
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
float humid;
float temp;
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
Adafruit_SSD1306 oled(OLED_WIDTH, OLED_HEIGHT, &Wire, -1);
volatile int pir_state = LOW;
int pir = 3;
int caseopen = 0;
int charging_allowed = 0;
int max_amps = 30;
String incomingcom2;
String incomingcom0;
int volt1;
int volt2;
int volt3;
int volt4;
int volt5;
int volt6;
int vic_battery_V;
int vic_battery_I;
int vic_input_V;
int vic_input_power;
int vic_load_I;
String vic_load_status;
int volt1v;
int volt2v;
int volt3v;
int volt4v;
int volt5v;
int volt6v;
int amp_batt;
int amp_batt_1;
int amp_batt_2;
int amp_batt_3;
int amp_batt_4;
int amp_OUT;
int available_power;
float maxVolTv;
int voltpin;
int relay_1 = 31;
int relay_2 = 33;
int relay_3 = 35;
int relay_4 = 37;
int relay_5 = 39;
int relay_6 = 41;
int input_source_1 = A3;
int input_source_2 = A4;
int input_source_3 = A5;
int input_source_4 = A6;
int input_victron = A0;
int input_output = A7;
float multiplier = 0.0049;
String vic_data_rec;
char *vic_data_rec_chunks[26] ;
int str_len;
boolean vic_data_in = false;
void open_case() {
pir_state = digitalRead(pir);
if (pir_state == HIGH) {
caseopen = 1;
} else {
caseopen = 0;
}
}
void setup() {
Serial.begin(19200); // out all data
// Serial.setTimeout(150);
Serial2.begin(19200); // vic
//Serial2.setTimeout(750);
Serial3.begin(19200); // command
// Serial3.setTimeout(750);
dht.begin();
max_amps=EEPROM.read(0);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (true)
;
}
delay(1000);
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(WHITE);
pinMode(pir, INPUT);
pinMode(input_source_1, INPUT_PULLUP);
pinMode(input_source_2, INPUT_PULLUP);
pinMode(input_source_3, INPUT_PULLUP);
pinMode(input_source_4, INPUT_PULLUP);
pinMode(input_victron, INPUT_PULLUP);
pinMode(input_output, INPUT_PULLUP);
pinMode(relay_1, OUTPUT);
pinMode(relay_2, OUTPUT);
pinMode(relay_3, OUTPUT);
pinMode(relay_4, OUTPUT);
digitalWrite(relay_1, LOW);
digitalWrite(relay_2, LOW);
digitalWrite(relay_3, LOW);
digitalWrite(relay_4, LOW);
attachInterrupt(digitalPinToInterrupt(pir), open_case, CHANGE);
}
void display_volt(int pin_input, char input_name_display[], int curs_pos_left, int curs_pos_up) {
float vin = analogRead(pin_input);
if (vin <= 512) { vin = -map(vin, 0, 511, max_amps, 0); }
if (vin > 512) { vin = map(vin, 512, 1023, 0, max_amps); }
oled.setCursor(curs_pos_left, curs_pos_up);
oled.print(input_name_display);
oled.print(vin);
oled.println(" A");
}
void read_vic() {
if (Serial2.available() > 0) {
vic_data_rec=Serial2.readStringUntil('Checksum');
vic_data_in =true;
}
}
void print_vic() {
int nub_h=0;
int nub_end=0;
int chunk_numb=0;
if (vic_data_in == true) {
str_len = vic_data_rec.length();
// vic_data_rec.toCharArray(vic_data_rec_chunks, 240);
// Serial3.println(str_len);
// Serial3.println(vic_data_rec);
for (int i = 0; i < 241; i++) {
// Serial3.print(i);
// Serial3.print(" - ");
// Serial3.println(vic_data_rec[i]);
if (vic_data_rec[i]=='\n') {nub_end++; chunk_numb++;}
vic_data_rec_chunks[chunk_numb]=vic_data_rec_chunks[chunk_numb]+vic_data_rec[i];
Serial3.print(vic_data_rec_chunks[chunk_numb]);
}
Serial3.print("liczba koncowek - ");
Serial3.println(nub_end);
Serial3.print("dlugosc - ");
Serial3.println(str_len);
Serial3.print("chunk numb - ");
Serial3.println(chunk_numb);
// Serial3.println(vic_data_rec_chunks[4]);
// Serial3.println(vic_data_rec_chunks[7]);
// Serial3.println(vic_data_rec_chunks[14]);
vic_data_in = false;
}
chunk_numb=0;
vic_data_rec_chunks[0] = 0;
}
void loop() {
read_vic();
print_vic();
/*if (Serial2.available() > 0)
incomingcom2 = Serial2.readStringUntil('\n');
max_amps = incomingcom2.toInt();
if (max_amps<0) {max_amps=0;}
if (max_amps>100) {max_amps=100;}
Serial2.print("Max APMS SET TO: ");
Serial2.println(max_amps);
Serial.print("Max APMS SET TO: ");
Serial.println(max_amps);
EEPROM.write(0,max_amps );
}*/
if (max_amps<0) {max_amps=0;}
if (max_amps>100) {max_amps=100;}
/* if (Serial.available() > 0) {
incomingcom0 = Serial.readStringUntil('\n');
Serial.print("COM_0: ");
Serial.println(incomingcom0);
}*/
oled.clearDisplay();
humid = dht.readHumidity();
temp = dht.readTemperature();
int volts[7] = { 0, analogRead(input_source_1), analogRead(input_source_2), analogRead(input_source_3), analogRead(input_source_4), analogRead(input_output), analogRead(input_victron) };
int maxVolT = -1;
int posleft[6] = { 0, 0, 0, 0, 0, 0 };
for (int i = 1; i < 5; i++) {
if (volts[i] > maxVolT) {
voltpin = i;
maxVolT = volts[i];
}
}
posleft[voltpin] = 10;
display_volt(input_source_1, "Batt 1: ", posleft[1], 10);
display_volt(input_source_2, "Batt 2: ", posleft[2], 20);
display_volt(input_source_3, "Batt 3: ", posleft[3], 30);
display_volt(input_source_4, "Batt 4: ", posleft[4], 40);
display_volt(input_output, "OUT: ", posleft[5], 50);
// if (caseopen==1) {oled.print("CASE OPEN");} else {oled.print("CASE CLOSE");}
oled.setCursor(00, 0);
oled.print("T: ");
oled.print(temp);
oled.print("C H: ");
oled.print(humid);
oled.println("%");
oled.display();
if (volts[5] <= 512) { amp_OUT = -map(volts[5], 0, 511, max_amps, 0); }
if (volts[5] > 512) { amp_OUT = map(volts[5], 512, 1023, 0, max_amps); }
available_power = map(volts[6], 0, 1023, 0, 50);
if (amp_OUT <= available_power) {
Serial.print("Charing BATT: ");
Serial.println(voltpin);
charging_allowed = 1;
} else {
Serial.println("OUTPUT DRAIN TOO HIGHT TO CHARGE");
charging_allowed = 0;
}
Serial.print("T: ");
Serial.print(temp);
Serial.print("C H: ");
Serial.print(humid);
Serial.println("%");
for (int i = 1; i < 5; i++) {
if (volts[i] <= 512) { amp_batt = -map(volts[i], 0, 511, max_amps, 0); }
if (volts[i] > 512) { amp_batt = map(volts[i], 512, 1023, 0, max_amps); }
Serial.print(" BATT: ");
Serial.print(i);
Serial.print(" :");
Serial.print(amp_batt);
Serial.println(" A");
}
Serial.print(" OUT: ");
Serial.print(" :");
Serial.print(amp_OUT);
Serial.println(" A");
Serial.print(" Available POWER: ");
Serial.print(" :");
Serial.print(available_power);
Serial.println(" A");
caseopen = 0;
if (voltpin == 1 && caseopen == 0 && charging_allowed == 1) {
digitalWrite(relay_1, LOW);
} else {
digitalWrite(relay_1, HIGH);
}
if (voltpin == 2 && caseopen == 0 && charging_allowed == 1) {
digitalWrite(relay_2, LOW);
} else {
digitalWrite(relay_2, HIGH);
}
if (voltpin == 3 && caseopen == 0 && charging_allowed == 1) {
digitalWrite(relay_3, LOW);
} else {
digitalWrite(relay_3, HIGH);
}
if (voltpin == 4 && caseopen == 0 && charging_allowed == 1) {
digitalWrite(relay_4, LOW);
} else {
digitalWrite(relay_4, HIGH);
}
}