#define DISP7219_CLK_DELAY 70
#include <GyverSegment.h>
#include <TimerOne.h>
#include "GyverTimer.h"
#define CLK 11
#define DIO 10
#define BTN 9
#define VOLT A0 // Analog pin for voltage measurement
#define RELAY 12 // Pin connected to the relay
const float k = 0.8; // Коэффициент сглаживания (0-1) //k = 0.01
const float R1 = 5.0; // resistance of R1 //4453000.0
const float R2 = 1.0; // resistance of R2 //1480000.0
const float referenceVoltage = 5.03; // Arduino reference voltage
const float voltageDividerRatio = R2 / (R1 + R2); // Voltage divider ratio (R2 / (R1 + R2))
const float targetVoltageBulk = 28.4; //28.4 Верхний порог напряжения для отключения реле
const float targetVoltageFloat = 26.8; //26.8 Нижний порог напряжения для отключения реле
const float targetVoltageFloatDelta = 0.3; //0.3
const float targetVoltageLow = 26.0; //26.0 Порог напряжения для включения реле
GTimer_ms chargeFloatTimer(5 * 1000);
Disp1637_4 disp(DIO, CLK);
boolean bulkVoltageFlag = false;
boolean chargeFloatTimerFlag = false;
float filteredVoltage = 3.0;
void setup() {
Serial.begin(9600);
disp.clear();
disp.brightness(15); // яркость, 0 - 15 (минимум - максимум)
disp.printRight(true);
disp.setCursorEnd();
disp.print(8888);
disp.update();
delay(1000);
disp.clear();
Timer1.initialize(1500); // установка таймера на каждые 1500 микросекунд
Timer1.attachInterrupt(timerIsr); // запуск таймера
digitalWrite(RELAY, HIGH);
Serial.println("@@@@ RELAY, HIGH @@@@");
Serial.print("RELAY = ");
Serial.println(digitalRead(RELAY));
Serial.print("RELAY is HIGH? ");
Serial.println(digitalRead(RELAY) == 1);
delay(2000);
digitalWrite(RELAY, LOW);
Serial.println("@@@@ RELAY, LOW @@@@");
Serial.print("RELAY = ");
Serial.println(digitalRead(RELAY));
Serial.print("RELAY is HIGH? ");
Serial.println(digitalRead(RELAY) == 1);
delay(2000);
digitalWrite(RELAY, HIGH);
Serial.println("@@@@ RELAY, HIGH @@@@");
Serial.print("RELAY = ");
Serial.println(digitalRead(RELAY));
Serial.print("RELAY is HIGH? ");
Serial.println(digitalRead(RELAY) == 1);
Serial.println("Start");
}
void loop() {
// Measure battery voltage
float batteryVoltage = getBatteryVoltage();
// Display voltage on 74HC595 display
displayVoltage(batteryVoltage);
if (!bulkVoltageFlag && batteryVoltage >= targetVoltageBulk) {
bulkVoltageFlag = true;
Serial.println("targetVoltageBulk");
Serial.print("batteryVoltage = ");
Serial.println(batteryVoltage);
Serial.print("bulkVoltageFlag = ");
Serial.println(bulkVoltageFlag);
} else
if(bulkVoltageFlag
&& batteryVoltage <= targetVoltageFloat + targetVoltageFloatDelta
&& batteryVoltage >= targetVoltageFloat - targetVoltageFloatDelta
) {
if(!chargeFloatTimerFlag){
chargeFloatTimerFlag = true;
chargeFloatTimer.reset();
Serial.print("chargeFloatTimerFlag = ");
Serial.println(chargeFloatTimerFlag);
Serial.println("chargeFloatTimer reset");
} else if(digitalRead(RELAY) == HIGH && chargeFloatTimer.isReady()){
Serial.println("chargeFloatTimer isReady");
Serial.println("@@@@ RELAY, LOW @@@@");
digitalWrite(RELAY, LOW);
chargeFloatTimerFlag = false;
}
} else if((bulkVoltageFlag || chargeFloatTimerFlag) && batteryVoltage < targetVoltageFloat - targetVoltageFloatDelta){
bulkVoltageFlag = false;
chargeFloatTimerFlag = false;
Serial.print("bulkVoltageFlag = ");
Serial.println(bulkVoltageFlag);
Serial.print("chargeFloatTimerFlag = ");
Serial.println(chargeFloatTimerFlag);
} else if(digitalRead(RELAY) == LOW && batteryVoltage <= targetVoltageLow) {
bulkVoltageFlag = false;
chargeFloatTimerFlag = false;
Serial.println("@@@@ RELAY, HIGH @@@@");
digitalWrite(RELAY, HIGH);
Serial.print("batteryVoltage = ");
Serial.println(batteryVoltage);
Serial.println("targetVoltageLow");
Serial.print("bulkVoltageFlag = ");
Serial.println(bulkVoltageFlag);
}
delay(100);
}
float getBatteryVoltage(){
filteredVoltage += (((analogRead(VOLT) * referenceVoltage) / 1023.0) / voltageDividerRatio - filteredVoltage) * k;
return filteredVoltage;
}
void displayVoltage(float voltage) {
disp.clear();
disp.print(voltage);
disp.update();
}
void timerIsr() { // прерывание таймера
//disp.timerIsr(); // пнуть дисплей
}