#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;
   }
  }
ATTINY8520PU