Нужна помощь с серво

#define CLK 0
#define DT 1
#define SW 9
#define RST 16
#define CLK_rts 14
#define DAT 4
#define ventilation 6
#define heater 5
#define Light 7
#define disinfection 8
#define FILTER_STEP 3000
#define disk1 0x50
#include <LiquidCrystal_I2C_OLED.h>
#include <Servo.h>
#include <iarduino_RTC.h>
#include "GyverEncoder.h"
#include "iarduino_DHT.h"
#include <Wire.h>
Encoder enc1(CLK, DT, SW, 2);
iarduino_DHT sensor(A0);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servo;
iarduino_RTC Time (RTC_DS1302, RST, CLK_rts, DAT); //назначение пинов обмена данными RST, CLK, DAT
int  hours1 = 0, h1, hours2 = 0, h2, hours3 = 0, h3, minutes1 = 0, m1, minutes2 = 0, m2, minutes3 = 0, m3, T1, pos = 0, TimsWorker, Temp1, Hum1, light_On_H, LightEepromOn_H, light_Off_H, LightEepromOff_H, counter = 15, counterEeprom,light_On_m, LightEepromOn_m, light_Off_m, LightEepromOff_m, On_Off1 = true, On_Off2 = true, On_Off3 = false;
unsigned int address = 0, address1 = 10, address2 = 20, address3 = 30, address4 = 40, address5 = 50, address6 = 60, address7 = 70, address8 = 80, address9 = 90, address10 = 100, address11 = 110, address12 = 120, address13 = 150, address14 = 160, address15 = 170, address16 = 180;
unsigned long filter_timer, filter_timer2, TimeWork, home_timerMenu;
int  ench = 0, enc = 0,secT, minT, hoursT, dayT, monthT, weekdayT, yearT, cliCk = 0, userTemp = 15ul, userHum = 70ul, val_humidity, val_temperature, humidity, temperature, LigtOnOff; 
boolean qr = true, QR = true, W2 = false, W3 = false, w,  On_Off1_1, On_Off2_2, On_Off3_3;
boolean statusVent = digitalRead(ventilation), statusHeat = digitalRead(heater), statusLight, disinfection_st = digitalRead(disinfection);
int resistor1 = A2,resistor2 = A3, etalon = counter, etalon_1;
unsigned int valueResistor1 = 0,valueResistor2 = 0;
boolean R1, R2,  active2 = false, active1 = false, active1_2 = false, nextStege1=false, nextStege2=false, output = false, input = false, start1 = false, start2 = false;
byte  c = 1, menu = 1, T_W;
byte line_2[8] =
{
  B00010,
  B10101,
  B10101,
  B01110,
  B00100,
  B00100,
  B00100,
};
byte line_1[8] =
{
  B01000,
  B10100,
  B01000,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte line_3[8] =
{
  B11000,
  B01100,
  B00110,
  B00111,
  B00110,
  B01100,
  B11000,
};
byte line_4[8] =
{
  B00000,
  B01100,
  B10010,
  B10000,
  B10000,
  B10010,
  B01100,
};
byte line_5[8] =
{
  B00000,
  B01110,
  B01111,
  B00100,
  B11110,
  B01100,
  B10010,
};
void setup() {
  delay(300);
  Time.begin();
  Wire.begin();
  pinMode(ventilation, OUTPUT);
  pinMode(heater, OUTPUT);
  pinMode(Light, OUTPUT);
  pinMode(disinfection, OUTPUT);
  digitalWrite(disinfection, LOW);
  digitalWrite(ventilation, LOW);
  digitalWrite(heater, LOW);
  attachInterrupt(0, encoder, CHANGE);
  attachInterrupt(1, encoder, CHANGE);
  lcd.init();
  enc1.setTickMode(AUTO);
  servo.attach(15);
  filter_timer = millis();
  filter_timer2 = millis();
  lcd.createChar(1, line_1);
  lcd.createChar(2, line_2);
  lcd.createChar(3, line_3);
  lcd.createChar(4, line_4);
  lcd.createChar(5, line_5);
  lcd.clear();
  hours1      = readEEPROM(disk1, address  ); h1  =    hours1;
  minutes1    = readEEPROM(disk1, address1 ); m1  =  minutes1;
  hours2      = readEEPROM(disk1, address2 ); h2  =    hours2;
  minutes2    = readEEPROM(disk1, address3 ); m2  =  minutes2;
  hours3      = readEEPROM(disk1, address4 ); h3  =    hours3;
  minutes3    = readEEPROM(disk1, address5 ); m3  =  minutes3;
  userTemp    = readEEPROM(disk1, address6);Temp1 =  userTemp;
  userHum     = readEEPROM(disk1, address7);Hum1  =   userHum;
  etalon_1    = readEEPROM(disk1, address8 ); counterEeprom  = etalon_1; counter = etalon_1;
  light_On_H  = readEEPROM(disk1, address9 ); LightEepromOn_H  = light_On_H ;
  light_Off_H = readEEPROM(disk1, address10); LightEepromOff_H = light_Off_H;
  light_On_m  = readEEPROM(disk1, address11); LightEepromOn_m  = light_On_m ;
  light_Off_m = readEEPROM(disk1, address12); LightEepromOff_m = light_Off_m;
  On_Off1     = readEEPROM(disk1, address14); On_Off1_1  =  On_Off1 ;
  On_Off2     = readEEPROM(disk1, address15); On_Off2_2 =  On_Off2 ;
  On_Off3     = readEEPROM(disk1, address16); On_Off3_3 =  On_Off3 ;
  T_W = readEEPROM(disk1, address13); TimsWorker = T_W * 100; T1 = TimsWorker;
  Time.gettime();yearT=Time.year;
}
void loop() {
  Time.period(5);
  if (enc1.isClick ()) {
     if (millis() - home_timerMenu != 0 &&  QR == false){
      lcd.noBacklight(); 
      home_timerMenu = 0;
      QR = true;
     }else{
      lcd.backlight();home_timerMenu = millis(); QR = false; w = true;
     }
      }
  if (enc1.isHolded()) {
    cliCk += 1;
  }
  if (cliCk != 0) {
    cliCk = 0; home_timerMenu = millis();
    
    switch (menu) {
      case 1: statusLight = digitalRead(Light);
            if(statusLight == HIGH){digitalWrite (Light,LOW);
              }
            else {digitalWrite (Light,HIGH);             
             }break;
      case 26: Time.settime(secT, minT, hoursT, dayT, monthT, yearT, weekdayT); break;
     
      case  6: if (On_Off1 == true) {
          On_Off1 = false;
          lcd.setCursor(13, 0);
          lcd.print("OFF");
       if (On_Off1 != On_Off1_1){
          writeEEPROM(disk1, address14, On_Off1);
          On_Off1_1=On_Off1;
        }}
        else                 {
          On_Off1 = true ;
          lcd.setCursor(13, 0);
          lcd.print("ON ");
       if (On_Off1 != On_Off1_1){
          writeEEPROM(disk1, address14, On_Off1);
          On_Off1_1=On_Off1;
        }} break;

      case  9: if (On_Off2 == true) {
          On_Off2 = false;
          lcd.setCursor(13, 1);
          lcd.print("OFF");
        if (On_Off2 != On_Off2_2){
          writeEEPROM(disk1, address15, On_Off2);
          On_Off2_2=On_Off2;
        }
        }
        else                 {
          On_Off2 = true ;
          lcd.setCursor(13, 1);
          lcd.print("ON ");
        if (On_Off2 != On_Off2_2){
          writeEEPROM(disk1, address15, On_Off2);
          On_Off2_2=On_Off2;
        }
        } break;

      case 12: if (On_Off3 == true) {
          On_Off3 = false;
          lcd.setCursor(13, 0);
          lcd.print("OFF");
        if (On_Off3 != On_Off3_3){
          writeEEPROM(disk1, address16, On_Off3);
          On_Off3_3=On_Off3;
        }
        }
        else                 {
          On_Off3 = true ;
          lcd.setCursor(13, 0);
          lcd.print("ON ");
        if (On_Off3 != On_Off3_3){
          writeEEPROM(disk1, address16, On_Off3);
          On_Off3_3=On_Off3;
        }
        } break;
      case 13: if (counterEeprom != etalon_1){
        
        lcd.setCursor(13, 1); lcd.print(etalon_1);
        counterEeprom  = etalon_1;
        }break;
     case 18: switch (c) {
          case 1:            servoOpen();      servoToClose(); break;
          case 2: W2 = true; servoOpen(); TimeWork = millis(); break;
          case 3: W3 = true; servoOpen(); TimeWork = millis(); break;
        }
    }
  }  
  if (enc1.isTurn()) {
    lcd.backlight(); home_timerMenu = millis(); QR = false; w = true;  
    if (enc != 0) {
      menu += enc;
      enc = 0;
      if (menu > 26) {
        menu = 1;
      } if (menu < 1) {
        menu = 26;
      }
    }
    switch (menu) {
      case 1: if (w == true) {
          lcd.clear();
          lcd.setCursor(1, 0); lcd.print("t"); lcd.write(1); lcd.setCursor(3, 0); lcd.print(val_temperature); lcd.write(4); lcd.write(1); lcd.setCursor(8, 0); lcd.print(Time.gettime("H:i:s"));
          lcd.setCursor(1, 1); lcd.write(2); lcd.setCursor(3, 1); lcd.print(val_humidity);lcd.print("%");lcd.setCursor(12, 1); lcd.write(5); lcd.setCursor(13, 1); lcd.print(counter);w = false;
        } break;

      case 2: if (w == true) {
          lcd.clear(); userTemp += ench; ench = 0;
          if (Temp1 != userTemp){
          writeEEPROM(disk1, address6, userTemp);
        } lcd.setCursor(0, 0); lcd.write(3); lcd.setCursor(1, 0); lcd.print("t"); lcd.write(1); lcd.setCursor(3, 0); lcd.print(userTemp); lcd.write(4); lcd.write(1); lcd.setCursor(8, 0); lcd.print("users");
          lcd.setCursor(1, 1); lcd.write(2); lcd.setCursor(3, 1); lcd.print(userHum); lcd.print("%"); lcd.setCursor(8, 1); lcd.print("users"); w = false;
        } break;

      case 3: if (w == true) {
          lcd.clear(); userHum += ench; ench = 0;
          if (Hum1 != userHum){
          writeEEPROM(disk1, address7, userHum);
        } lcd.setCursor(1, 0); lcd.print("t"); lcd.write(1); lcd.setCursor(3, 0); lcd.print(userTemp); lcd.write(4); lcd.write(1); lcd.setCursor(8, 0); lcd.print("users");
          lcd.setCursor(0, 1); lcd.write(3); lcd.setCursor(1, 1); lcd.write(2); lcd.setCursor(3, 1); lcd.print(userHum); lcd.print("%"); lcd.setCursor(8, 1); lcd.print("users"); w = false;
        } break;

      case 4: if (w == true) {
          lcd.clear(); hours1 += ench; ench = 0; if (hours1 > 23) {
            hours1 = 0;
          } if (hours1 < 0) {
            hours1 = 23;
          } if (h1 != hours1) {
            writeEEPROM(disk1, address, hours1);
            h1 = hours1;
          } if (On_Off1 == true) {
            lcd.setCursor(13, 0);
            lcd.print("ON ");
          } else {                      
            lcd.setCursor(13, 0);
            lcd.print("OFF");
          } if (On_Off2 == true) {
            lcd.setCursor(13, 1);
            lcd.print("ON ");
          } else {                       
            lcd.setCursor(13, 1);
            lcd.print("OFF");
          }
          lcd.setCursor(4, 0); lcd.write(3); lcd.setCursor(0, 0); lcd.print("Food"); lcd.setCursor(7, 0); lcd.print("h"); lcd.setCursor(5, 0); lcd.print(hours1); lcd.setCursor(11, 0); lcd.print("m"); lcd.setCursor(9, 0); lcd.print(minutes1);
          lcd.setCursor(0, 1); lcd.print("Food"); lcd.setCursor(7, 1); lcd.print("h"); lcd.setCursor(5, 1); lcd.print(hours2); lcd.setCursor(11, 1); lcd.print("m"); lcd.setCursor(9, 1); lcd.print(minutes2); w = false;
        } break;

      case 5: if (w == true) {
          lcd.clear(); minutes1 += ench; ench = 0; if (minutes1 > 59) {
            minutes1 = 0;
          } if (minutes1 < 0) {
            minutes1 = 59;
          } if (m1 != minutes1) {
            writeEEPROM(disk1, address1, minutes1);
            m1 = minutes1;
          } if (On_Off1 == true) {
            lcd.setCursor(13, 0);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 0);
            lcd.print("OFF");
          } if (On_Off2 == true) {
            lcd.setCursor(13, 1);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 1);
            lcd.print("OFF");
          }
           lcd.setCursor(0, 0); lcd.print("Food"); lcd.setCursor(7, 0); lcd.print("h"); lcd.setCursor(8, 0); lcd.write(3); lcd.setCursor(5, 0); lcd.print(hours1); lcd.setCursor(11, 0); lcd.print("m"); lcd.setCursor(9, 0); lcd.print(minutes1);
           lcd.setCursor(0, 1); lcd.print("Food"); lcd.setCursor(7, 1); lcd.print("h"); lcd.setCursor(5, 1); lcd.print(hours2); lcd.setCursor(11, 1); lcd.print("m"); lcd.setCursor(9, 1); lcd.print(minutes2); w = false;
        } break;
      case 6: if (w == true) {lcd.clear();
           if (On_Off1 == true) {
            lcd.setCursor(13, 0);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 0);
            lcd.print("OFF");
          } if (On_Off2 == true) {
            lcd.setCursor(13, 1);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 1);
            lcd.print("OFF");
          }
           lcd.setCursor(0, 0); lcd.print("Food"); lcd.setCursor(7, 0); lcd.print("h"); lcd.setCursor(5, 0); lcd.print(hours1); lcd.setCursor(11, 0); lcd.print("m"); lcd.setCursor(9, 0); lcd.print(minutes1);
           lcd.setCursor(0, 1); lcd.print("Food"); lcd.setCursor(7, 1); lcd.print("h"); lcd.setCursor(5, 1); lcd.print(hours2); lcd.setCursor(11, 1); lcd.print("m"); lcd.setCursor(9, 1); lcd.print(minutes2); 
           lcd.setCursor(12, 0); lcd.write(3);w = false;
        }break;
      case 7: if (w == true) {
          lcd.clear(); hours2 += ench; ench = 0; if (hours2 > 23) {
            hours2 = 0;
          } if (hours2 < 0) {
            hours2 = 23;
          } if (h2 != hours2) {
            writeEEPROM(disk1, address2, hours2);
            h2 = hours2;
          } if (On_Off1 == true) {
            lcd.setCursor(13, 0);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 0);
            lcd.print("OFF");
          } if (On_Off2 == true) {
            lcd.setCursor(13, 1);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 1);
            lcd.print("OFF");
          }
          lcd.setCursor(0, 0); lcd.print("Food"); lcd.setCursor(7, 0); lcd.print("h"); lcd.setCursor(5, 0); lcd.print(hours1); lcd.setCursor(11, 0); lcd.print("m"); lcd.setCursor(9, 0); lcd.print(minutes1);
          lcd.setCursor(0, 1); lcd.print("Food"); lcd.setCursor(4, 1); lcd.write(3); lcd.setCursor(7, 1); lcd.print("h"); lcd.setCursor(5, 1); lcd.print(hours2); lcd.setCursor(11, 1); lcd.print("m"); lcd.setCursor(9, 1); lcd.print(minutes2); hours2 += ench; ench = 0; w = false;
        } break;

      case 8: if (w == true) {
          lcd.clear(); minutes2 += ench; ench = 0; if (minutes2 > 59) {
            minutes2 = 0;
          } if (minutes2 < 0) {
            minutes2 = 59;
          } if (m2 != minutes2) {
            writeEEPROM(disk1, address3, minutes2);
            m2 = minutes2;
          } if (On_Off1 == true) {
            lcd.setCursor(13, 0);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 0);
            lcd.print("OFF");
          } if (On_Off2 == true) {
            lcd.setCursor(13, 1);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 1);
            lcd.print("OFF");
          }
          lcd.setCursor(0, 0); lcd.print("Food"); lcd.setCursor(7, 0); lcd.print("h"); lcd.setCursor(5, 0); lcd.print(hours1); lcd.setCursor(11, 0); lcd.print("m"); lcd.setCursor(9, 0); lcd.print(minutes1);
          lcd.setCursor(0, 1); lcd.print("Food"); lcd.setCursor(8, 1); lcd.write(3); lcd.setCursor(5, 1); lcd.print(hours2); lcd.setCursor(7, 1); lcd.print("h"); lcd.setCursor(11, 1); lcd.print("m"); lcd.setCursor(9, 1); lcd.print(minutes2); w = false;
        } break;
      case 9: if (w == true) {lcd.clear();
           if (On_Off1 == true) {
            lcd.setCursor(13, 0);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 0);
            lcd.print("OFF");
          } if (On_Off2 == true) {
            lcd.setCursor(13, 1);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 1);
            lcd.print("OFF");
          }
           lcd.setCursor(0, 0); lcd.print("Food"); lcd.setCursor(7, 0); lcd.print("h"); lcd.setCursor(5, 0); lcd.print(hours1); lcd.setCursor(11, 0); lcd.print("m"); lcd.setCursor(9, 0); lcd.print(minutes1);
           lcd.setCursor(0, 1); lcd.print("Food"); lcd.setCursor(7, 1); lcd.print("h"); lcd.setCursor(5, 1); lcd.print(hours2); lcd.setCursor(11, 1); lcd.print("m"); lcd.setCursor(9, 1); lcd.print(minutes2); w = false;
           lcd.setCursor(12, 1); lcd.write(3);
        }break;
      case 10: if (w == true) {
          lcd.clear(); hours3 += ench; ench = 0; if (hours3 > 23)    {
            hours3 = 0;
          } if (hours3 < 0)    {
            hours3 = 23;
          } if (h3 != hours3) {
            writeEEPROM(disk1, address4, hours3);
            h3 = hours3;
          } if (On_Off3 == true) {
            lcd.setCursor(13, 0);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 0);
            lcd.print("OFF");
          }
          lcd.setCursor(0, 0); lcd.print("Food");lcd.setCursor(4, 0); lcd.write(3);  lcd.setCursor(7, 0); lcd.print("h"); lcd.setCursor(5, 0); lcd.print(hours3); lcd.setCursor(11, 0); lcd.print("m"); lcd.setCursor(9, 0); lcd.print(minutes3);
          lcd.setCursor(0, 1); lcd.print("counter");lcd.setCursor(11, 1); lcd.write(5); lcd.setCursor(13, 1); lcd.print(etalon_1);  w = false;
        } break;

      case 11: if (w == true) {
          lcd.clear(); minutes3 += ench; ench = 0; if (minutes3 > 59) {
            minutes3 = 0;
          } if (minutes3 < 0) {
            minutes3 = 59;
          } if (m3 != minutes3) {
            writeEEPROM(disk1, address5, minutes3);
            m3 = minutes3;
          } if (On_Off3 == true) {
            lcd.setCursor(13, 0);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 0);
            lcd.print("OFF");
          }
          lcd.setCursor(0, 0); lcd.print("Food"); lcd.setCursor(8, 0); lcd.write(3); lcd.setCursor(7, 0); lcd.print("h"); lcd.setCursor(5, 0); lcd.print(hours3); lcd.setCursor(11, 0); lcd.print("m"); lcd.setCursor(9, 0); lcd.print(minutes3); 
          lcd.setCursor(0, 1); lcd.print("counter"); lcd.setCursor(11, 1); lcd.write(5);lcd.setCursor(13, 1); lcd.print(etalon_1);  w = false;
        } break;
        
      case 12: if (w == true) {lcd.clear();
           if (On_Off3 == true) {
            lcd.setCursor(13, 0);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 0);
            lcd.print("OFF");
          }
          lcd.setCursor(0, 0); lcd.print("Food"); lcd.setCursor(7, 0); lcd.print("h"); lcd.setCursor(5, 0); lcd.print(hours3); lcd.setCursor(11, 0); lcd.print("m"); lcd.setCursor(9, 0); lcd.print(minutes3); lcd.setCursor(12, 0); lcd.write(3);
          lcd.setCursor(0, 1); lcd.print("counter");lcd.setCursor(11, 1); lcd.write(5); lcd.setCursor(13, 1); lcd.print(etalon_1);  w = false;
        } break;
      case 13: if (w == true) {lcd.clear();
           etalon_1 += ench; ench = 0; if (etalon_1 > 999) {
            etalon_1 = 0;
          } if (etalon_1 < 0) {
            etalon_1 = 999;
          } if (On_Off3 == true) {
            lcd.setCursor(13, 0);
            lcd.print("ON ");
          } else {
            lcd.setCursor(13, 0);
            lcd.print("OFF");
          }
          if (etalon_1 != counterEeprom) {
            writeEEPROM(disk1, address8, etalon_1);
            counterEeprom = etalon_1;
          }
          lcd.setCursor(0, 0); lcd.print("Food"); lcd.setCursor(7, 0); lcd.print("h"); lcd.setCursor(5, 0); lcd.print(hours3); lcd.setCursor(11, 0); lcd.print("m"); lcd.setCursor(9, 0); lcd.print(minutes3);
          lcd.setCursor(0, 1); lcd.print("counter");lcd.setCursor(11, 1); lcd.write(5); lcd.setCursor(12, 1); lcd.write(3); lcd.setCursor(13, 1); lcd.print(etalon_1);  w = false;
        } break;
      case 14: if (w == true) {
          lcd.clear(); light_On_H += ench; ench = 0; if (light_On_H > 59) {
            light_On_H = 0;
          } if (light_On_H < 0) {
            light_On_H = 23;
          } if (LightEepromOn_H != light_On_H) {
            writeEEPROM(disk1, address9, light_On_H);
            LightEepromOn_H = light_On_H;
          }
          lcd.setCursor(0, 0); lcd.print("Light_On"); lcd.setCursor(10, 0); lcd.write(3); lcd.setCursor(11, 0); lcd.print(light_On_H); lcd.setCursor(14, 0); lcd.print(light_On_m); 
          lcd.setCursor(0, 1); lcd.print("Light_Off"); lcd.setCursor(11, 1); lcd.print(light_Off_H); lcd.setCursor(14, 1); lcd.print(light_Off_m);  w = false;
        } break;
      case 15: if (w == true) {
          lcd.clear(); light_On_m += ench; ench = 0; if (light_On_m > 59) {
            light_On_m = 0;
          } if (light_On_m < 0) {
            light_On_m = 59;
          } if (LightEepromOn_m != light_On_m) {
            writeEEPROM(disk1, address11, light_On_m);
            LightEepromOn_m = light_On_m;
          }
          lcd.setCursor(0, 0); lcd.print("Light_On");  lcd.setCursor(11, 0); lcd.print(light_On_H);lcd.setCursor(13, 0); lcd.write(3); lcd.setCursor(14, 0); lcd.print(light_On_m); 
          lcd.setCursor(0, 1); lcd.print("Light_Off"); lcd.setCursor(11, 1); lcd.print(light_Off_H); lcd.setCursor(14, 1); lcd.print(light_Off_m);  w = false;
        } break;
      case 16: if (w == true) {
          lcd.clear(); light_Off_H += ench; ench = 0; if (light_Off_H > 59) {
            light_Off_H = 0;
          } if (light_Off_H < 0) {
            light_Off_H = 23;
          } if (LightEepromOff_H != light_Off_H) {
            writeEEPROM(disk1, address10, light_Off_H);
            LightEepromOff_H = light_Off_H;
          }
          lcd.setCursor(0, 0); lcd.print("Light_On");  lcd.setCursor(11, 0); lcd.print(light_On_H); lcd.setCursor(14, 0); lcd.print(light_On_m); 
          lcd.setCursor(0, 1); lcd.print("Light_Off"); lcd.setCursor(10, 1); lcd.write(3);lcd.setCursor(11, 1); lcd.print(light_Off_H); lcd.setCursor(14, 1); lcd.print(light_Off_m);  w = false;
        } break;
      case 17: if (w == true) {
          lcd.clear(); light_Off_m += ench; ench = 0; if (light_Off_m > 59) {
            light_Off_m = 0;
          } if (light_Off_m < 0) {
            light_Off_m = 59;
          } if (LightEepromOff_m != light_Off_m) {
            writeEEPROM(disk1, address12, light_Off_m);
            LightEepromOff_m = light_Off_m;
          }
          lcd.setCursor(0, 0); lcd.print("Light_On");  lcd.setCursor(11, 0); lcd.print(light_On_H); lcd.setCursor(14, 0); lcd.print(light_On_m); 
          lcd.setCursor(0, 1); lcd.print("Light_Off"); lcd.setCursor(11, 1); lcd.print(light_Off_H);lcd.setCursor(13, 1); lcd.write(3); lcd.setCursor(14, 1); lcd.print(light_Off_m);  w = false;
        } break;
      
      case 18:  lcd.clear(); c += ench; ench = 0; if (c > 3) {
          c = 3;
        } if (c < 1) {
          c = 1;
        } lcd.setCursor(0, 0); lcd.print("DokopM");lcd.setCursor(7,0); lcd.write(3); lcd.setCursor(10, 1); lcd.print(TimsWorker);
        switch (c) {
          case 1: lcd.setCursor(8, 0); lcd.print("Experemen"); break;
          case 2: lcd.setCursor(8, 0); lcd.print("1/2      "); break;
          case 3: lcd.setCursor(8, 0); lcd.print("Doza     "); break;
        } break;

      case 19: if (w == true) {
          lcd.clear(); T_W += ench; ench = 0; TimsWorker = T_W * 100; if (TimsWorker < 100) {
            TimsWorker = 100;
          } if (TimsWorker > 20000) {
            TimsWorker = 20000;
          } if (T1 != TimsWorker) {
            writeEEPROM(disk1, address13, T_W);
            T1 = TimsWorker;
          }
          lcd.setCursor(0, 1); lcd.write(3); lcd.setCursor(2, 1); lcd.print("TimsWork"); lcd.setCursor(10, 1); lcd.print(TimsWorker); w = false;
        } break;

      case 20: if (w == true){Time.gettime(); hoursT=Time.Hours ;minT=Time.minutes ;secT=Time.seconds; dayT=Time.day; monthT=Time.month; weekdayT=Time.weekday;
          lcd.clear(); secT += ench; ench = 0; if (secT > 60){
            secT = 0;
          } if (secT < 0){
            secT = 60;
          }
          lcd.setCursor(1, 0); lcd.write(3); lcd.setCursor(2, 0); lcd.print(secT); lcd.setCursor(4, 0); lcd.print("s"); lcd.setCursor(6, 0); lcd.print(minT); lcd.setCursor(8, 0); lcd.print("m"); lcd.setCursor(10, 0); lcd.print(hoursT); lcd.setCursor(12, 0); lcd.print("h"); lcd.setCursor(14, 0); lcd.print(weekdayT); lcd.setCursor(16, 0); lcd.print("w");
          lcd.setCursor(2, 1); lcd.print(dayT); lcd.setCursor(4, 1); lcd.print("d"); lcd.setCursor(6, 1); lcd.print(monthT); lcd.setCursor(8, 1); lcd.print("m"); lcd.setCursor(10, 1);lcd.print("20"); lcd.print(yearT); lcd.setCursor(14, 1); lcd.print("yr"); w = false;
        } break;

      case 21: if (w == true){
          lcd.clear(); minT += ench; ench = 0; if (minT > 60){
            minT = 0;
          } if (minT < 0){
            minT = 60;
          }
          lcd.setCursor(2, 0); lcd.print(secT); lcd.setCursor(4, 0); lcd.print("s"); lcd.setCursor(5, 0); lcd.write(3); lcd.setCursor(6, 0); lcd.print(minT); lcd.setCursor(8, 0); lcd.print("m"); lcd.setCursor(10, 0); lcd.print(hoursT); lcd.setCursor(12, 0); lcd.print("h"); lcd.setCursor(14, 0); lcd.print(weekdayT); lcd.setCursor(16, 0); lcd.print("w");
          lcd.setCursor(2, 1); lcd.print(dayT); lcd.setCursor(4, 1); lcd.print("d"); lcd.setCursor(6, 1); lcd.print(monthT); lcd.setCursor(8, 1); lcd.print("m"); lcd.setCursor(10, 1);lcd.print("20"); lcd.print(yearT); lcd.setCursor(14, 1); lcd.print("yr"); w = false;
        } break;

      case 22: if (w == true) {
          lcd.clear(); hoursT += ench; ench = 0; if (hoursT > 23)    {
            hoursT = 0;
          } if (hoursT < 0)    {
            hoursT = 23;
          }
          lcd.setCursor(2, 0); lcd.print(secT); lcd.setCursor(4, 0); lcd.print("s"); lcd.setCursor(6, 0); lcd.print(minT); lcd.setCursor(8, 0); lcd.print("m"); lcd.setCursor(9, 0); lcd.write(3); lcd.setCursor(10, 0); lcd.print(hoursT); lcd.setCursor(12, 0); lcd.print("h"); lcd.setCursor(14, 0); lcd.print(weekdayT); lcd.setCursor(16, 0); lcd.print("w");
          lcd.setCursor(2, 1); lcd.print(dayT); lcd.setCursor(4, 1); lcd.print("d"); lcd.setCursor(6, 1); lcd.print(monthT); lcd.setCursor(8, 1); lcd.print("m"); lcd.setCursor(10, 1);lcd.print("20"); lcd.print(yearT); lcd.setCursor(14, 1); lcd.print("yr"); w = false;
        } break;

      case 23: if (w == true) {
          lcd.clear(); weekdayT += ench; ench = 0; if (weekdayT > 7) {
            weekdayT = 1;
          } if (weekdayT < 1) {
            weekdayT = 7;
          }
          lcd.setCursor(2, 0); lcd.print(secT); lcd.setCursor(4, 0); lcd.print("s"); lcd.setCursor(6, 0); lcd.print(minT); lcd.setCursor(8, 0); lcd.print("m"); lcd.setCursor(10, 0); lcd.print(hoursT); lcd.setCursor(12, 0); lcd.print("h"); lcd.setCursor(13, 0); lcd.write(3); lcd.setCursor(14, 0); lcd.print(weekdayT); lcd.setCursor(16, 0); lcd.print("w");
          lcd.setCursor(2, 1); lcd.print(dayT); lcd.setCursor(4, 1); lcd.print("d"); lcd.setCursor(6, 1); lcd.print(monthT); lcd.setCursor(8, 1); lcd.print("m"); lcd.setCursor(10, 1);lcd.print("20"); lcd.print(yearT); lcd.setCursor(14, 1); lcd.print("yr"); w = false;
        } break;

      case 24: if (w == true) {
          lcd.clear(); dayT += ench; ench = 0; if (dayT > 31)        {
            dayT = 1;
          } if (dayT < 1)        {
            dayT = 31;
          }
          lcd.setCursor(2, 0); lcd.print(secT); lcd.setCursor(4, 0); lcd.print("s"); lcd.setCursor(6, 0); lcd.print(minT); lcd.setCursor(8, 0); lcd.print("m"); lcd.setCursor(10, 0); lcd.print(hoursT); lcd.setCursor(12, 0); lcd.print("h"); lcd.setCursor(14, 0); lcd.print(weekdayT); lcd.setCursor(16, 0); lcd.print("w");
          lcd.setCursor(1, 1); lcd.write(3); lcd.setCursor(2, 1); lcd.print(dayT); lcd.setCursor(4, 1); lcd.print("d"); lcd.setCursor(6, 1); lcd.print(monthT); lcd.setCursor(8, 1); lcd.print("m"); lcd.setCursor(10, 1);lcd.print("20"); lcd.print(yearT); lcd.setCursor(14, 1); lcd.print("yr"); w = false;
        } break;

      case 25: if (w == true) {
          lcd.clear(); monthT += ench; ench = 0; if (monthT > 12)    {
            monthT = 1;
          } if (monthT < 1)    {
            monthT = 12;
          }
          lcd.setCursor(2, 0); lcd.print(secT); lcd.setCursor(4, 0); lcd.print("s"); lcd.setCursor(6, 0); lcd.print(minT); lcd.setCursor(8, 0); lcd.print("m"); lcd.setCursor(10, 0); lcd.print(hoursT); lcd.setCursor(12, 0); lcd.print("h"); lcd.setCursor(14, 0); lcd.print(weekdayT); lcd.setCursor(16, 0); lcd.print("w");
          lcd.setCursor(2, 1); lcd.print(dayT); lcd.setCursor(4, 1); lcd.print("d"); lcd.setCursor(5, 1); lcd.write(3); lcd.setCursor(6, 1); lcd.print(monthT); lcd.setCursor(8, 1); lcd.print("m"); lcd.setCursor(10, 1);lcd.print("20"); lcd.print(yearT); lcd.setCursor(14, 1); lcd.print("yr"); w = false;
        } break;

      case 26: if (w == true) {
          lcd.clear(); yearT += ench; ench = 0; if (yearT < 21) {
            yearT = 21;
          } if (yearT > 99) {
            yearT = 99;
          }
          lcd.setCursor(2, 0); lcd.print(secT); lcd.setCursor(4, 0); lcd.print("s"); lcd.setCursor(6, 0); lcd.print(minT); lcd.setCursor(8, 0); lcd.print("m"); lcd.setCursor(10, 0); lcd.print(hoursT); lcd.setCursor(12, 0); lcd.print("h"); lcd.setCursor(14, 0); lcd.print(weekdayT); lcd.setCursor(16, 0); lcd.print("w");
          lcd.setCursor(2, 1); lcd.print(dayT); lcd.setCursor(4, 1); lcd.print("d"); lcd.setCursor(6, 1); lcd.print(monthT); lcd.setCursor(8, 1); lcd.print("m"); lcd.setCursor(9, 1); lcd.write(3); lcd.setCursor(10, 1); lcd.print("20");lcd.print(yearT); lcd.setCursor(14, 1); lcd.print("yr"); w = false;
        } break;
    }
  }

  if (menu == 1) {
    
    if (millis() - filter_timer2 > 1000ul) {
      statusVent = digitalRead(ventilation); statusHeat = digitalRead(heater);
      lcd.setCursor(1, 0); lcd.print("t"); lcd.write(1); lcd.setCursor(3, 0); lcd.print(val_temperature); lcd.write(4); lcd.write(1); lcd.setCursor(8, 0); lcd.print(Time.gettime("H:i:s"));
      lcd.setCursor(1, 1); lcd.write(2); lcd.setCursor(3, 1); lcd.print(val_humidity);lcd.print("%"); filter_timer2 = millis();lcd.setCursor(12, 1); lcd.write(5); lcd.setCursor(13, 1); lcd.print(counter);
    }
  }

  Time.gettime();                                                                                                         
   if (On_Off1 == true && qr == true && Time.Hours == hours1 && Time.minutes == minutes1 && Time.seconds <= 0.5) {
     qr = false; QR = false; TimeWork = millis(); home_timerMenu = millis(); lcd.backlight(); servoOpen();
  }
   if (On_Off2 == true && qr == true && Time.Hours == hours2 && Time.minutes == minutes2 && Time.seconds <= 0.5) {
     qr = false; QR = false; TimeWork = millis(); home_timerMenu = millis(); lcd.backlight(); servoOpen();
  }                                                                             
   if (On_Off3 == true && qr == true && Time.Hours == hours3 && Time.minutes == minutes3 && Time.seconds <= 0.5) {
     qr = false; QR = false; TimeWork = millis(); home_timerMenu = millis(); lcd.backlight(); servoOpen();
  } 
   statusLight = digitalRead(Light);
   if (statusLight == LOW && Time.Hours == light_On_H && Time.minutes == light_On_m && Time.seconds <= 0.5 ){digitalWrite (Light, HIGH);
 }else if (statusLight == HIGH && Time.Hours == light_Off_H && Time.minutes == light_Off_m && Time.seconds <= 0.5 ){digitalWrite (Light, LOW);
      
  }
  if (val_humidity - userHum> 10 && statusVent == LOW ){digitalWrite (ventilation, HIGH);}
  else if (userHum - val_humidity> 10 && statusVent == HIGH ){digitalWrite (ventilation, LOW);}
  if (userTemp - val_temperature > 4 && statusHeat == LOW ) {digitalWrite (heater, HIGH);}//15-10=5>4 и вкл то выкл
  else if (val_temperature - userTemp > 4 && statusHeat == HIGH) {digitalWrite (heater,  LOW);}

  if (millis() - TimeWork >= TimsWorker / 2 && W2 == true ) {
    servoToClose();
    W2 = false;
    TimeWork = 0;
  }
  if (millis() - TimeWork >= TimsWorker && W3 == true) {
    servoToClose();
    W3 = false;
    TimeWork = 0;
  }
  if (millis() - TimeWork >= TimsWorker && qr == false) {
    servoToClose();
    qr = true ;
  }
  if (millis() - home_timerMenu >= 30000 && QR == false) {
    lcd.noBacklight();
    lcd.clear();
    home_timerMenu = 0;
    QR = true;
    menu = 1;
    c = 1;
   }
  if (millis() - filter_timer  > FILTER_STEP) {
    filter_timer = millis();
    switch (sensor.read()) {
      case DHT_OK: humidity = sensor.hum; temperature = sensor.tem;
        val_humidity   = (val_humidity   * 5 + humidity   ) / 6;
        val_temperature = (val_temperature * 5 + temperature) / 6;
        if (menu == 1) {
          lcd.setCursor(7, 1);
          lcd.print("     ");
        } break;
      default: lcd.setCursor(7, 1); lcd.print("ERROR"); break;
    }
  }
valueResistor1 = analogRead(resistor1);
  valueResistor2 = analogRead(resistor2);  
  if(valueResistor1 >= 800){ R1=true; }  
   else R1=false;
  if(valueResistor2 >= 800){ R2=true; }  
   else R2=false;
  if (R2 == false) {active2=true;}
  else active2 = false;
  
  if (R1 == false) {active1=true;}
  else active1 = false;

  if (counter > etalon_1){counter = etalon_1;}
 
  if (active1==true && active2==false&&start1 == false) {output = true;} //первый сработал вход
  if (active1==true && active2==true) {start2 = true;}
  if (start2 == true){
   if (active1 == true && active2 == true && output == true){ active1_2 = true;}      // сработали оба
   if (active1_2 == true && active2 == true && active1 == false && output == true ){nextStege1=true;}//срабатывали оба, сработан выход,не сработан вход,первый сработал вход 
   if (nextStege1== true && active1 == true && active2 == false && output == true ){nextStege1 = false;}//срабатывали оба, сработан выход,не сработан вход,первый сработал вход
   if (nextStege1==true && active1 == false && active2 == false && output == true){ counter ++;active1_2 =false;nextStege1 = false;output = false;} 
   if (active1 == false && active2 == false&&start2 == true){start2 = false;} 
  } 
  
  
  if (active2==true && active1==false&&start2 == false) {input = true;} //первый сработал выход
  if (active1==true && active2==true) {start1 = true;}
  if (start1 == true){
   if (active1 == true && active2 == true && input == true){ active1_2 = true;}// сработали оба
  }      
  if (active1_2 == true && active1 == true && active2 == false && input == true ) {nextStege2=true;}//срабатывали оба,не сработан выход, сработан вход,первый сработал выход  
  if (nextStege2== true && active2 == true && active1 == false && input == true ) {nextStege2 = false;}//срабатывали оба, сработан выход,не сработан вход,первый сработал вход
  if (nextStege2==true && active1 == false && active2 == false && input == true){counter --; if (counter < 0){counter = 0;} active1_2 = false;nextStege2 = false; input = false;}
  if (active1 == false && active2 == false&&start1 == true){start1 = false;}
  
  if (etalon_1 != etalon){
    etalon = etalon_1;
   if(menu==10 || menu==11 || menu==12 || menu==13){
    lcd.setCursor(13, 1); lcd.print(etalon_1); 
   }
  }
if (counter <= 0){disinfection_st = digitalRead(disinfection);
  if (disinfection_st == LOW){digitalWrite(disinfection,HIGH);
  }}
if(counter >= 1){disinfection_st = digitalRead(disinfection);
  if(disinfection_st == HIGH){digitalWrite(disinfection,LOW);
}}
}

void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data ) {
  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddress >> 8));   // MSB
  Wire.write((int)(eeaddress & 0xFF)); // LSB
  Wire.write(data);
  Wire.endTransmission();
  delay(5);
}

byte readEEPROM(int deviceaddress, unsigned int eeaddress ) {
  byte rdata = 0xFF;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8))    ;
    Wire.write((int)(eeaddress & 0xFF))  ;
    Wire.endTransmission();
    Wire.requestFrom(deviceaddress, 1);
  if (Wire.available()) {rdata = Wire.read();}
  return rdata;
}
void servoOpen() {
  for (pos = 90; pos >= 0; pos -= 1) {
    servo.write(pos);
    delay(5);
  }
  if(menu==18){lcd.setCursor(4, 1);
  lcd.print("OPEN");
}}
void servoToClose() {
  for (pos = 0; pos <= 90; pos += 1) {
    servo.write(pos);
    delay(5);
  }
  servoDo();
}
void servoDo() {
  for (pos = 90; pos >= 88; pos -= 1) {
    servo.write(pos);
    delay(5);
  }
  if(menu==18){lcd.setCursor(4, 1);
  lcd.print("CLOSE ");
}}
void encoder () {
  if (enc1.isRight ()) {
    enc ++;
  }
  if (enc1.isLeft  ()) {
    enc --;
  }
  if (enc1.isRightH()) {
    ench++;
  }
  if (enc1.isLeftH ()) {
    ench--;
  }
}

Не могу понять, по чему сервопривод дергается каждую секунду. Подскажите пожалуйста

Я тоже не могу понять “по чему” ХЗ какой сервопривод, подключённый по ХЗ какой схеме к ХЗ какому контроллеру и ХЗ от чего питающийся, дёргается. ХЗ! :frowning:

1 лайк

Я знаю почему! Какая-то проблема имеется!!,)

3 лайка

Там в заголовках и гивер мелькает и айардуина, в нескольких экземплярах. странно что вообще что то работает.

Код скопипащен? Ни одного комментария на 700+ строк. В loop я запутался уже на 10-15 строчке)[quote=“Posol88, post:1, topic:17118”]
дергается каждую секунду.
[/quote]

Сервопривод и должен “дёргаться”.
Каков общий алгоритм? Что надо от этого безобразия?

что значит скопипащен?

Сopy-paste.
Если бы я такое написал в порыве гениальности, то на следующий день запутался напрочь.

сервопривод MG996R? плата Pro Micro? питается от блока питания лабораторного

Так что это за аппарат по дезинфекции? Каков алгоритм?

написал я это 4 года назад, и оно успешно работало… но последняя версия кода была утеряна. сейчас восстановил (дописал) и собрал схему. все работает, кроме памяти(но тут я вспомнил, что резисторы на 10 кОм которые в даташите прописаны не подходят - нужно меньше( думаю что как придут поменяю и эта проблема уйдет… а вот по чему дергается сервопривод понять не могу

это умный дом для кур. управление светом, теплым полом, вентиляшкой, кварцевой лампой и кормушка на сервоприводе основанная

управляется все энкодером

С Servo.h дерганья происходят по одной причине - что-то блокирует прерывания. (с) @sadman41

1 лайк

учитывая что дергается четко раз в секунду, то видимо модуль часов влияет, так?

И так в каждом case
If(w== true) для начала вынеси перед switch

откуда я знаю, убери его и проверь.

Что означают TimsWorker , qr и W2?

TimsWorker- Время через которое закроется клапан управляемый сервой
qr - переменная которая мешает попасть программе внутрь функции когда не нужно
W2- переменная которая мешает попасть программе внутрь функции когда не нужно

готово. ни чего не изменилось

а, еще сервик так же дергается при использовании энкодера
отключение модуля RTS ни как не влияет на баг…
и еще один важный наверное момент. сервик дергается ежесекундно, только когда программа в этом месте работает -

case 1: 
          lcd.clear();
          lcd.setCursor(1, 0); lcd.print("t"); lcd.write(1); lcd.setCursor(3, 0); lcd.print(val_temperature); lcd.write(4); lcd.write(1); lcd.setCursor(8, 0); lcd.print(Time.gettime("H:i:s"));
          lcd.setCursor(1, 1); lcd.write(2); lcd.setCursor(3, 1); lcd.print(val_humidity);lcd.print("%");lcd.setCursor(12, 1); lcd.write(5); lcd.setCursor(13, 1); lcd.print(counter);w = false;
         break;