#define rkn PB2
#define zar PB4
#define inv A3
#define ledr PB0
#define ledg PB1
int v; // итоговое напряжение
int v1; // измеренное напряжение
int v2; // измеренное прошлое
int n; // счётчик измерений
int pv; // прошлое напряжение
int chs = 0; // счётчик времени
byte stat = 0; // Режим
//stat = ( 0-ожидание; 1-заряд; 2-разряд; 3-зарядился; 4-авария )
int32_t tmrOff = 0;
bool flagOff = 0;
int32_t tmr = 0;
int32_t tmrLed = 0;
// bool flagLed = 1;
void setup() {
pinMode(zar,OUTPUT);
digitalWrite(zar,1);
pinMode(ledr,OUTPUT);
pinMode(ledg,OUTPUT);
pinMode(rkn,INPUT);
pinMode(inv,INPUT);
}
void loop() {
if (millis() - tmr > 1000) {
tmr = millis();
digitalWrite(zar,1);
delay(10);
v1 = analogRead (inv);
if (v1 > v2){
v2 = v1;
}
n++;
if (n > 2){
v = v2;
n = 0;
v2 = 0;
}
}
/* if (millis() - tmr > 2000) {
tmr = millis();
digitalWrite(zar,1);
v = 0;
for (int i = 0; i < 3; i++){
delay(10);
v1 = analogRead (inv);
if (v1 > v) {
v = v1;
}
}
}*/
//--------------------------------------------------
if (v < 70) {
stat = 0;
}
//--------------------------------------------------
if ((v >= 70 && stat == 0) || (v < 335 && stat == 2)){
digitalWrite(rkn, 0);
pinMode(rkn, INPUT);
// PORTB &= ~(1 << PB2);
// DDRB &= ~(1 << PB2);
pv = 0;
stat = 1;
}
//--------------------------------------------------
if ((digitalRead (rkn) == 1) && (stat == 1 || stat == 3 || stat == 4)) {
stat = 2;
}
//--------------------------------------------------
if (stat == 1 && v > pv){
pv = v;
}
if (stat == 1 && (pv - v) > 5 && v > 470) {
stat = 3;
}
//--------------------------------------------------
if (stat == 1 && flagOff == 0) {
flagOff = 1;
tmrOff = millis();
chs = 0;
}
if (stat == 1 && flagOff == 1 && (millis()- tmrOff) >= 1000) {
tmrOff = millis();
chs++;
if (chs >= 19800 || v > 520) {
chs = 0;
// flagOff = 0;
stat = 4;
}
}
//--------------------------------------------------
switch (stat) {
case 0:
digitalWrite(zar, 1);
digitalWrite(rkn, 0);
pinMode(rkn, INPUT);
digitalWrite(ledr, 0);
// PORTB = 0b00010000;
// DDRB &= ~(1 << PB2);
flagOff = 0;
miggrin();
break;
case 1:
digitalWrite(zar, 0);
digitalWrite(ledg, 0);
digitalWrite(ledr, 1);
// PORTB = 0b00000001;
break;
case 2:
digitalWrite(zar, 1);
pinMode(rkn, OUTPUT);
digitalWrite(rkn, 1);
digitalWrite(ledg, 0);
// DDRB |= (1 << PB2);
// PORTB = 0b00010100;
flagOff = 0;
migred();
break;
case 3:
digitalWrite(zar, 1);
digitalWrite(rkn, 0);
pinMode(rkn, INPUT);
digitalWrite(ledr, 0);
digitalWrite(ledg, 1);
// PORTB = 0b00010010;
// DDRB &= ~(1 << PB2);
break;
case 4:
digitalWrite(zar, 1);
// PORTB |= (1 << PB4);
digitalWrite(rkn, 0);
// PORTB &= ~(1 << PB2);
pinMode(rkn, INPUT);
// PORTB = 0b00010000;
// DDRB &= ~(1 << PB2);
mig ();
}
}
void miggrin() {
if (millis() - tmrLed > 500) {
tmrLed = millis();
PORTB ^= (1 << 1);
// digitalWrite(ledg, flagLed);
// flagLed = !flagLed;
}
}
void migred() {
if (millis() - tmrLed > 500) {
tmrLed = millis();
PORTB ^= (1 << 0);
// digitalWrite(ledr, flagLed);
// flagLed = !flagLed;
}
}
void mig() {
if (millis() - tmrLed > 1000) {
tmrLed = millis();
}
if (millis() - tmrLed < 500) {
digitalWrite(ledg, 0);
digitalWrite(ledr, 1);
// PORTB = 0b00010001;
}
if (millis() - tmrLed >= 500) {
digitalWrite(ledr, 0);
digitalWrite(ledg, 1);
// PORTB = 0b00010010;
}
}