Проблема с перезагрузкой Arduino uno ATmega328pu

В основном моя программа перезапускается всякий раз, когда рядом с ней работает контактор. Как это решить?

#include <LiquidCrystal.h>
#include <EEPROM.h>
#define Heater         6
#define RELAY2         5
#define Star_Rly       7
//#define Delta_Rly 7

#define MENU  3
#define UP    2
#define DOWN  1
#define ENTER 0
#define RPM_SENSE 4

//
volatile byte  count = 0;
byte numCount = 2; //количество интервалов импульсов для измерения


volatile unsigned long startTime;
volatile unsigned long endTime;

volatile boolean finishCount = false;
float period;

unsigned int rpm = 0;

///
long buttonTimer = 0;
long buttonTime = 250;

boolean buttonActive = false;
boolean longPressActive = false;

boolean UPActive = false;
boolean DOWNActive = false;

int analogPin = 1;
int VOLT = 0;
int currentPins[3] = {3, 4, 5};            //Назначаем входы фазного трансформатора тока аналоговым контактам
double calib[3] = {13.8337, 14.8234, 14.0325};
double kilos[3];
unsigned long startMillis[3];
unsigned long endMillis[3], Display_Time, MSec_Time1, RPM_FAIL_Time1, MSec_Time2, MSec_Time3, MSec_Time4, MSec_RPM_Time1, Sec_Time, Delta_Hold_Time_Cnt, Phase_Time, sec_counter;
float Sec_RPM_Cnt_Time, MSec_RPM_Cnt_Time1, RPM_COUNTER;
double RMSCurrent[3];
int RMSPower[3];
int peakPower[3];
int jhal = EEPROM.read(1);
double xold = 0;// Для функции Миллиса
unsigned char AkWh1, AkWh2, MUL1, DIV1, MUL2, DIV2, RPM_FAIL, MOTOR1_FAIL, MOTOR2_FAIL;
float Sett02,Sett01, AkWh;
int AkWh11;// Накопленная энергия
int  Sett1, Sett2, Sett3, State, MENU_KEY, RPM_KEY, LAST_RPM_FAIL_KEY, UP_KEY1, DOWN_KEY1, ENTER_KEY, LAST_MENU_KEY, LAST_UP_KEY, LAST_DOWN_KEY, LAST_ENTER_KEY, LAST_RPM_KEY, Display_En, Counter, Screen_Change;
char Star_Delta_Flag, SystemStart, Delta_Hold_Time_Flag, Phase_Fail, PhaseSenDelay, RPM_FLAG, RPM_TMR_START, RPM_CHECK, KEY_LOCK;
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);  //Назначаем контакты ЖК-экрана в соответствии с требованиями к ЖК-экрану

void setup()
{ //настройка сохранения
  Sett1 = EEPROM.read(10);
  Sett2 = EEPROM.read(11);
  Sett3 = EEPROM.read(12);
  MUL1 = EEPROM.read(13);
  DIV1 = EEPROM.read(14);
  MUL2 = EEPROM.read(15);
  DIV2 = EEPROM.read(16);


  AkWh1 = (EEPROM.read(17) & 0x0FF);
  AkWh2 = (EEPROM.read(18) & 0x0FF);
  //RPM_COUNTER = (EEPROM.read(15)& 0x0FF);
  //AkWh2 <<= 8;
  AkWh = (AkWh1 || AkWh2) / 100;

  lcd.begin(16, 2);             // столбцы, строки. используйте 16,2 для ЖК-дисплея 16x2 и т. д.
  lcd.clear();
  lcd.setCursor(0, 0);          // устанавливаем курсор в столбец 0, строку 0 (первая строка)
  lcd.print(" MFD. JAN 2019 ");
  lcd.setCursor(0, 1);
  lcd.print(" by e-lbas ");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0, 0);          // устанавливаем курсор в столбец 0, строку 0 (первая строка)
  lcd.print("  DEHUMIDEFIRE ");
  lcd.setCursor(0, 1);
  lcd.print(" SAFETY SYSTEM ");
  delay(2000);
  pinMode(MENU, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(DOWN, INPUT_PULLUP);
  pinMode(ENTER, INPUT_PULLUP);

  Serial.begin (9600);
  //pinMode(PhaseFail_Rly, OUTPUT); digitalWrite (PhaseFail_Rly, LOW);

  pinMode(Heater, OUTPUT);        digitalWrite(Heater, LOW);          //нагреватель выключен
  pinMode(RELAY2, OUTPUT);        digitalWrite(RELAY2, LOW);        //ГУДОК ВЫКЛ.

  // pinMode(Star_Rly, OUTPUT); digitalWrite(Star_Rly, LOW);
  //pinMode(Delta_Rly, OUTPUT); digitalWrite (Delta_Rly, LOW);

}



void loop()   //Вызывает методы для чтения значений из CT и изменения отображения
{
  Display_Routine();
  KeyPad_Routine();
 // Analysis_Routine();
 // RPM_Routine();
 // Sett02 =(float)(Sett2)/10;
 // Sett01 =(float)(Sett1)/10;
 // digitalWrite(Нагреватель, ВЫСОКИЙ);
   // задержка(Set1);
    // digitalWrite(Нагреватель, LOW);
   // задержка(50);
}

void RPM_Routine()
{
  RPM_KEY   = digitalRead(RPM_SENSE);
  // Serial.print (RPM_KEY);
  if (( LAST_RPM_KEY != RPM_KEY) )
  {
    MSec_RPM_Time1 = millis();
    LAST_RPM_KEY = RPM_KEY  ;

  }




  if ((millis() - MSec_RPM_Time1) > 50)      // проверка флага таймера 20 мс
  {
    //++++++++++++++ Функция клавиши RPM +++++++++++++++++++++++++++++++
    MSec_RPM_Time1 = 0;

    if ((RPM_KEY == LOW) && (RPM_FLAG == 1))
    {
      RPM_FLAG = 0;
      // Серийный.принт (5);
      if ((RPM_TMR_START == 0 ) && (RPM_FLAG == 0))
      {
        // Серийный.принт (2);
        RPM_TMR_START = 1;
        MSec_RPM_Cnt_Time1 = millis();
      }
      else if ((RPM_TMR_START == 1 ) && (RPM_KEY == LOW))
      {
        // Серийный.принт (3);
        RPM_TMR_START = 0;
        Sec_RPM_Cnt_Time = (millis() - MSec_RPM_Cnt_Time1) / 1000;
        RPM_COUNTER = 3600 / Sec_RPM_Cnt_Time ;
        Sec_RPM_Cnt_Time = 0;
        MSec_RPM_Cnt_Time1 = 0;
      }
    }
    else if ((RPM_KEY == HIGH) && (RPM_FLAG == 0))
    {
      RPM_FLAG = 1;

    }
  }
  //++++++++++++++++++++++++++++++++++++++++++++++ +++++++

  if (RPM_CHECK == 1)
  {
    if (( LAST_RPM_FAIL_KEY != RPM_KEY) )
    {
      sec_counter = 0;


      LAST_RPM_FAIL_KEY = RPM_KEY;
    }
    if (sec_counter >= (Sett3 * 2))
    {
      RPM_FAIL_Time1 = 0;
      digitalWrite(Heater, HIGH);         //нагреватель ВЫКЛ.
      digitalWrite(RELAY2, HIGH);       //ХУТОР ВКЛ.
      RPM_FAIL = 1;
      RPM_CHECK = 0;
      sec_counter = 0;

    }
  }
  //++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++

}


void Analysis_Routine()
{
  //EEPROM.writeDouble(addr,kilos);
  VOLT = analogRead(analogPin) / 2;   // читаем входной контакт

  AkWh11 = AkWh * 100;

  // EEPROM.write(13,((AkWh11/100)& 0x00FF));
  // EEPROM.write(14,((AkWh11%100)& 0xFF00));

  readPhase();

  float P = 220 * RMSCurrent[0] + 220 * RMSCurrent[1] + 220 * RMSCurrent[2]; //формула трехфазной мощности
  P = P / 1000;
  int   xnew =  millis() / 1000 - xold;
  xold = millis() / 1000;

  float kW = P * xnew;
  kW = kW / 3600;
  AkWh = kW + AkWh;

  Main_LOGIC();

}


void Main_LOGIC()
{
  if ((RPM_FAIL == 0) && (MOTOR1_FAIL == 0) && (MOTOR2_FAIL == 0))
  {
    if  (((RMSCurrent[0]) >= 1) || ((RMSCurrent[1]) >= 0.3)) // запуск системы, ожидание 5 секунд и принятие мер.
    {
      SystemStart |= 0x01;
      digitalWrite(Heater, HIGH);                            //отключаем сердце
      digitalWrite(RELAY2, LOW);       //хУТОР выкл.
    }
    else if  (((RMSCurrent[0]) < 1) || ((RMSCurrent[1]) < 0.3)) // система в состоянии остановки, никаких действий не предпринято
    {
      SystemStart = 0; Star_Delta_Flag = 0; Delta_Hold_Time_Flag = 0;
      digitalWrite(Heater, HIGH);      //отключаем сердце
      digitalWrite(RELAY2, LOW);       //хУТОР выкл.

    }



    if (((SystemStart & 0x04) != 0x04) && ((SystemStart & 0x01) == 0x01))
    {
      if ((SystemStart & 0x03) == 0x01)
      {
        Sec_Time = millis();
        SystemStart |= 0x02;
      }
      if ((millis() - Sec_Time) > 10000) //задержка 5 секунд
      {
        Sec_Time = 0;
        SystemStart |= 0x04;
      }
    }
    //+++++++++++основная логика++++++++++++++++++++++++++++
    if ((SystemStart & 0x04) == 0x04)
    {

      if (((RMSCurrent[0]) <= Sett01) || ((RMSCurrent[1]) <= Sett02) ) //
      {
        digitalWrite(Heater, HIGH);         //нагреватель ВЫКЛ.
        digitalWrite(RELAY2, HIGH);       //ХУТОР ВКЛ.
        if ((RMSCurrent[0]) <= Sett01)
        {
          MOTOR1_FAIL = 1;
        }
        if ((RMSCurrent[1]) <= Sett02)
        {
          MOTOR2_FAIL = 1;
        }

      }
      else if  ((((RMSCurrent[0]) >= Sett01) && ((RMSCurrent[1]) >= Sett02)) && ((RPM_CHECK) = 0)) // ДЛЯ ИСПРАВНОЙ СИСТЕМЫ
      {
        digitalWrite(Heater, LOW);         //нагреватель включен
        digitalWrite(RELAY2, LOW);       //хУТОР выкл.
        RPM_CHECK = 1;
        RPM_FAIL_Time1 = 0;
        sec_counter = 0;
        // RPM_FAIL_Time1 = millis();
      }
      else if  ((((RMSCurrent[0]) >= Sett01) && ((RMSCurrent[1]) >= Sett02)) && ((RPM_CHECK) = 1)) // ДЛЯ ИСПРАВНОСТИ СИСТЕМА
      {
        digitalWrite(Heater, LOW);         //нагреватель включен
        digitalWrite(RELAY2, LOW);       //хУТОР выкл.
        RPM_CHECK = 1;
      }






      //++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++
    }
  }

}


void displayKilowattHours ()  //Отображает все данные о киловатт-часах
{
  // ЖК.clear();
  // lcd.setCursor(0,0);
  // lcd.print(килос[0]);
  // lcd.print("кВтч");
  // lcd.setCursor(9,0);
  // lcd.print(кило[1]);
  // lcd.print("кВтч");
  // lcd.setCursor(0,1);
  // lcd.print(кило[2]);
  // lcd.print("кВтч");
  // lcd.setCursor(9,1);
  // lcd.print(AkWh);
  // lcd.print("TWh");





  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  -DRUM SPEED-  ");
  //lcd.print(RPM_COUNTER);
  lcd.setCursor(3, 1);
  lcd.print("RPH ");
  //lcd.setCursor(10,1);
  lcd.print((RPM_COUNTER) / MUL1);

}

void displayCurrent ()      //Отображает все текущие данные
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(RMSCurrent[0]);
  lcd.print("A");
  lcd.setCursor(9, 0);
  lcd.print(RMSCurrent[1]);
  lcd.print("A");
  lcd.setCursor(0, 1);
  lcd.print(RMSCurrent[2]);
  lcd.print("A");
  lcd.setCursor(9, 1);
  lcd.print("Current");
}
void displayVoltage ()      //Отображает все текущие данные
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("INPUT= ");
  lcd.setCursor(8, 0);
  lcd.print(VOLT);
  lcd.print("V AC");
}

void displayRMSPower ()     //Отображает все данные о среднеквадратичной мощности
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(RMSPower[0]);
  lcd.print("W");
  lcd.setCursor(9, 0);
  lcd.print(RMSPower[1]);
  lcd.print("W");
  lcd.setCursor(0, 1);
  lcd.print(RMSPower[2]);
  lcd.print("W");
  lcd.setCursor(9, 1);
  lcd.print("Power");
}

void displayPeakPower ()    //Отображает все данные о пиковой мощности
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(peakPower[0]);
  lcd.print("W");
  lcd.setCursor(9, 0);
  lcd.print(peakPower[1]);
  lcd.print("W");
  lcd.setCursor(0, 1);
  lcd.print(peakPower[2]);
  lcd.print("W");
  lcd.setCursor(9, 1);
  lcd.print("Max Pwr");
}



void displaySystemState()
{
  lcd.begin(16, 2);
  if (((SystemStart & 0x04) == 0x04) && (Star_Delta_Flag == 1))
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(RMSCurrent[0]);
    lcd.print("A");
    lcd.setCursor(9, 0);
    lcd.print(RMSCurrent[1]);
    lcd.print("A");
    lcd.setCursor(0, 1);
    lcd.print(RMSCurrent[2]);
    lcd.print("A");
    lcd.setCursor(9, 1);
    lcd.print("STAR");


  }
  else if (((SystemStart & 0x04) == 0x04) && (Star_Delta_Flag == 0))
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(RMSCurrent[0]);
    lcd.print("A");
    lcd.setCursor(9, 0);
    lcd.print(RMSCurrent[1]);
    lcd.print("A");
    lcd.setCursor(0, 1);
    lcd.print(RMSCurrent[2]);
    lcd.print("A");
    lcd.setCursor(9, 1);
    lcd.print("START");
  }
}
void KeyPad_Routine()
{
  MENU_KEY   = digitalRead(MENU);
  UP_KEY1    = digitalRead(UP);
  DOWN_KEY1  = digitalRead(DOWN);
  ENTER_KEY  = digitalRead(ENTER);

  if (( LAST_MENU_KEY != MENU_KEY) )
  {
    if ((KEY_LOCK & 0x01) == 0x00)
    {
      MSec_Time1 = millis();
      KEY_LOCK |= 0X01;
    }

    if ((millis() - MSec_Time1) > 20)      // проверка флага таймера 20 мс
    {

      MSec_Time1 = 0;
      //++++++++++++++ Функция клавиши меню +++++++++++++++++++++++++++++++
      Serial.print (MENU_KEY);
      if ((MENU_KEY == LOW) && (State == 0) )        {
        State = 1;
      }
      else if ((MENU_KEY == LOW) && (State == 1))    {
        State = 2;
      }
      else if ((MENU_KEY == LOW) && (State == 2))    {
        State = 3;
      }
      else if ((MENU_KEY == LOW) && (State == 3))    {
        State = 4;
      }
      else if ((MENU_KEY == LOW) && (State == 4))    {
        State = 5;
      }
      else if ((MENU_KEY == LOW) && (State == 5))    {
        State = 6;
      }
      else if ((MENU_KEY == LOW) && (State == 6))    {
        State = 7;
      }
      else if ((MENU_KEY == LOW) && (State == 7))    {
        State = 0;
      }

      if ((MENU_KEY == HIGH) && ((KEY_LOCK & 0x01) == 0x01))
      {
        KEY_LOCK &= 0XFE;

      }
      //++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++
      LAST_MENU_KEY = MENU_KEY;
    }
  }
  if ( (LAST_UP_KEY != UP_KEY1))
  {

    if ((KEY_LOCK & 0x02) == 0x00)
    {
      MSec_Time2 = millis();
      KEY_LOCK |= 0X02;
    }

    if ((millis() - MSec_Time2) > 50)      // проверка флага таймера 20 мс
    {
      MSec_Time2 = 0;
      //++++++++++++++ Функция клавиши вверх +++++++++++++++++++++++++++++++

      if ((UP_KEY1 == LOW) && (State == 0) )        {
        State = 0;
      }
      else if ((UP_KEY1 == LOW) && (State == 1))    {
        ++Sett1;
        if (Sett1 >= 251) {
          Sett1 = 0;
        }
      }
      else if ((UP_KEY1 == LOW) && (State == 2))    {
        ++Sett2;
        if (Sett2 >= 251) {
          Sett2 = 0;
        }
      }
      else if ((UP_KEY1 == LOW) && (State == 3))    {
        ++Sett3;
        if (Sett3 >= 251) {
          Sett3 = 0;
        }
      }
      else if ((UP_KEY1 == LOW) && (State == 4))    {
        ++MUL1;
        if (MUL1 >= 251) {
          MUL1 = 1;
        }
      }
      else if ((UP_KEY1 == LOW) && (State == 5))    {
        ++DIV1;
        if (DIV1 >= 251) {
          DIV1 = 1;
        }
      }
      else if ((UP_KEY1 == LOW) && (State == 6))    {
        ++MUL2;
        if (MUL2 >= 251) {
          MUL2 = 1;
        }
      }
      else if ((UP_KEY1 == LOW) && (State == 7))    {
        ++DIV2;
        if (DIV2 >= 251) {
          DIV2 = 1;
        }
      }

      if ((UP_KEY1 == HIGH) && ((KEY_LOCK & 0x02) == 0x02))
      {
        KEY_LOCK &= 0XFD;

      }
      //++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++
      LAST_UP_KEY = UP_KEY1;
    }
  }
  if (( LAST_DOWN_KEY != DOWN_KEY1))
  {

    if ((KEY_LOCK & 0x04) == 0x00)
    {
      MSec_Time3 = millis();
      KEY_LOCK |= 0X04;
    }
    if ((millis() - MSec_Time3) > 50)      // проверка флага таймера 20 мс
    {
      MSec_Time3 = 0;
      //++++++++++++++ Функция клавиши ВНИЗ +++++++++++++++++++++++++++++++
      if ((DOWN_KEY1 == LOW) && (State == 0) )        {
        State = 0;
      }
      else if ((DOWN_KEY1 == LOW) && (State == 1))    {
        --Sett1;
        if (Sett1 >= 251) {
          Sett1 = 250;
        }
      }
      else if ((DOWN_KEY1 == LOW) && (State == 2))    {
        --Sett2;
        if (Sett2 >= 251) {
          Sett2 = 250;
        }
      }
      else if ((DOWN_KEY1 == LOW) && (State == 3))    {
        --Sett3;
        if (Sett3 >= 251) {
          Sett3 = 250;
        }
      }
      else if ((DOWN_KEY1 == LOW) && (State == 4))    {
        --MUL1;
        if (MUL1 >= 251) {
          MUL1 = 250;
        }
      }
      else if ((DOWN_KEY1 == LOW) && (State == 5))    {
        --DIV1;
        if (DIV1 >= 251) {
          DIV1 = 250;
        }
      }
      else if ((DOWN_KEY1 == LOW) && (State == 6))    {
        --MUL2;
        if (MUL2 >= 251) {
          MUL2 = 250;
        }
      }
      else if ((DOWN_KEY1 == LOW) && (State == 7))    {
        --DIV2;
        if (DIV2 >= 251) {
          DIV2 = 250;
        }
      }
      if ((DOWN_KEY1 == HIGH) && ((KEY_LOCK & 0x04) == 0x04))
      {
        KEY_LOCK &= 0XFB;

      }
      //++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++
      LAST_DOWN_KEY = DOWN_KEY1;
    }
  }


  if ( (LAST_ENTER_KEY != ENTER_KEY))
  {
    if ((KEY_LOCK & 0x08) == 0x00)
    {
      MSec_Time4 = millis();
      KEY_LOCK |= 0X08;
    }

    if ((millis() - MSec_Time4) > 50)      // проверка флага таймера 20 мс
    {
      MSec_Time4 = 0;
      //++++++++++++++ Функция клавиши ENTER +++++++++++++++++++++++++++++++
      if ((ENTER_KEY == LOW) && (State == 0) )        {
        State = 0;

      }
      else if ((ENTER_KEY == LOW) && (State == 1))    {
        EEPROM.write(10, Sett1);
        State = 2;
      }
      else if ((ENTER_KEY == LOW) && (State == 2))    {
        EEPROM.write(11, Sett2);
        State = 3;
      }
      else if ((ENTER_KEY == LOW) && (State == 3))    {
        EEPROM.write(12, Sett3);
        State = 4;
      }
      else if ((ENTER_KEY == LOW) && (State == 4))    {
        EEPROM.write(13, MUL1);
        State = 5;
      }
      else if ((ENTER_KEY == LOW) && (State == 5))    {
        EEPROM.write(14, DIV1);
        State = 6;
      }
      else if ((ENTER_KEY == LOW) && (State == 6))    {
        EEPROM.write(15, MUL2);
        State = 7;
      }
      else if ((ENTER_KEY == LOW) && (State == 7))    {
        EEPROM.write(16, DIV2);
        State = 0;
      }


      if ((ENTER_KEY == LOW) && (((RPM_FAIL & 0x01) == 0x01) || ((MOTOR1_FAIL & 0x01) == 0x01) || ((MOTOR2_FAIL & 0x01) == 0x01)))
      {
        SystemStart = 0;
        RPM_CHECK = 0;
        RPM_FAIL = 0; MOTOR1_FAIL = 0; MOTOR2_FAIL = 0;
        State = 0;
        sec_counter = 0;
        RPM_FAIL_Time1 = 0;
      }

      if ((ENTER_KEY == HIGH) && ((KEY_LOCK & 0x08) == 0x08))
      {
        KEY_LOCK &= 0XF7;

      }

      //++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++
      LAST_ENTER_KEY = ENTER_KEY;
    }
  }
}


void Display_Routine()
{
  if (Display_En == 0)
  {
    Display_Time = millis();
    Display_En = 1;
  }

  if ((millis() - Display_Time) > 200)
  {
    Display_Time = 0;
    ++sec_counter;
    if (((RPM_FAIL & 0x01) == 0x00) && ((MOTOR1_FAIL & 0x01) == 0x00) && ((MOTOR2_FAIL & 0x01) == 0x00))
    {
      if (State == 0)
      {
        if (++Counter >= 3)
        {
          Counter = 0;
          if (Screen_Change == 0)
          {
            Screen_Change = 1;
            displayKilowattHours ();
          }
          else if (Screen_Change == 1)
          {
            Screen_Change = 2;
            displayCurrent ();
          }
          else if (Screen_Change == 2)
          {
            Screen_Change = 3;
            displayVoltage ();
          }
          else if (Screen_Change == 3)
          {
            Screen_Change = 4;
            displayRMSPower ();
          }
          else if (Screen_Change == 4)
          {

            displayPeakPower ();
            if ((SystemStart & 0x04) == 0x04)
            {
              Screen_Change = 5;
            }
            else
            {
              Screen_Change = 0;
            }
          }
          else if (Screen_Change == 5)
          {
            Screen_Change = 0;
            displaySystemState ();
          }
        }
      }
      else if (State == 1)
      {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" BLOWER MOTOR-1");
        lcd.setCursor(0, 1);
        lcd.print(Sett01);
        lcd.print("Amp");
        lcd.setCursor(10, 1);
        lcd.print(Sett1);
        lcd.print("00mA");

        Counter = 6;

      }
      else if (State == 2)
      {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" R.OUT MOTOR-2");
        lcd.setCursor(0, 1);
        lcd.print(Sett02);
        lcd.print("Amp");
        lcd.setCursor(10, 1);
        lcd.print(Sett2);
        lcd.print("00mA");

        Counter = 6;
      }
      else if (State == 3)
      {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("PULSE SINGAL ");

        lcd.setCursor(0, 1);
        lcd.print("TIME ");
        lcd.print(Sett3);
        lcd.print(" Sec.");
        Counter = 6;
      }
      else if ((State == 4) || (State == 5))
      {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("CURR 1=");
        lcd.setCursor(8, 0);
        lcd.print((RMSCurrent[0])* MUL1) / DIV1;
        lcd.setCursor(0, 1);
        lcd.print("MUL1 ");
        lcd.setCursor(5, 1);
        lcd.print(MUL1);

        lcd.setCursor(8, 1);
        lcd.print("DIV1 ");
        lcd.setCursor(13, 1);
        lcd.print(DIV1);
        Counter = 6;
      }
      else if ((State == 6) || (State == 7))
      {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("CURR 2=");
        lcd.setCursor(7, 0);
        lcd.print((RMSCurrent[1])* MUL2) / DIV2;
        lcd.setCursor(0, 1);
        lcd.print("MUL2 ");
        lcd.setCursor(5, 1);
        lcd.print(MUL2);

        lcd.setCursor(8, 1);
        lcd.print("DIV2 ");
        lcd.setCursor(13, 1);
        lcd.print(DIV2);
        Counter = 6;
      }

    }
    else if ((RPM_FAIL == 1) || (MOTOR1_FAIL == 1) || (MOTOR2_FAIL == 1))
    {
      if (RPM_FAIL == 1)
      {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("RPM FAIL");
        lcd.setCursor(0, 1);
        lcd.print("Press ENTER RST");
      }
      if (MOTOR1_FAIL == 1)
      {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("BLOWER MOTOR-FAIL");
        lcd.setCursor(0, 1);
        lcd.print("Press ENTER RST");
      }
      if (MOTOR2_FAIL == 1)
      {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("R.OUT MOTOR-FAIL");
        lcd.setCursor(0, 1);
        lcd.print("Press ENTER RST");
      }

    }




    Display_En = 0;
  }
}

void readPhase ()      //Метод чтения информации с CT
{
  for (int i = 0; i <= 2; i++)
  {
    int current = 0;
    int maxCurrent = 0;
    int minCurrent = 1000;
    for (int j = 0 ; j <= 200 ; j++) //Отслеживает и регистрирует текущий вход в течение 200 циклов, чтобы определить максимальный и минимальный ток
    {
      current =  analogRead(currentPins[i]);    //Читает текущий ввод и записывает максимальный и минимальный ток
      if (current >= maxCurrent)
        maxCurrent = current;
      else if (current <= minCurrent)
        minCurrent = current;
    }
    if (maxCurrent <= 517)
    {
      maxCurrent = 516;
    }
    RMSCurrent[i] = (((maxCurrent - 516) * 0.707) / calib[i] * 2); //Рассчитывает среднеквадратичный ток на основе максимального значения и масштабирует в соответствии с калибровкой
    RMSPower[i] = VOLT * RMSCurrent[i];  //Рассчитывает среднеквадратичное значение мощности при условии, что напряжение 220 В переменного тока, соответственно изменяется на 110 В переменного тока.
    if (RMSPower[i] > peakPower[i])
    {
      peakPower[i] = RMSPower[i];
    }
    endMillis[i] = millis();
    unsigned long time = (endMillis[i] - startMillis[i]);
    kilos[i] = kilos[i] + ((double)RMSPower[i] * ((double)time / 60 / 60 / 1000000)); //Рассчитываем использованные киловатт-часы
    startMillis[i] = millis();
  }
}

, 👍1

Обсуждение

Что вы имеете в виду под словами «с разъемом рядом?» Также покажите схему и схему, когда разъем, вероятно, подключен. Кроме того, постарайтесь уменьшить свой эскиз, чтобы найти место, где он идет не так (если это программное обеспечение)., @Michel Keijzers

@MichelKeijzers Я думаю, он имеет в виду «контактор», и проблема, скорее всего, вызвана EMI., @Majenko

@Маженко Я перередактировал вопрос; Спасибо., @Michel Keijzers


2 ответа


1

Что за контактор, как он подключен к Arduino, какой ток потребляет его катушка при подключении? Какой ток он переключает? Два вероятных источника (мы не знаем больше, чем вы нам сказали):

  1. катушка питается от Arduino или его источника питания и потребляет достаточный ток, чтобы напряжение на Arduino падало, вызывая сброс; или

  2. контактор коммутирует достаточный ток, что создает помехи в близлежащих проводах, подключенных к Arduino, — электрический импульс, который мешает работе Arduino.

1) можно решить, запитав контактор от отдельного источника питания (т. е. не через Arduino) и используя транзисторный переключатель, подключенный к выводу Arduino, для включения и выключения контактора.

2) можно решить, (как вы и предполагали) переместив контактор дальше от Arduino; экранирование проводов, по которым идет коммутируемый ток; и экранирование всех проводов, подключенных к Arduino, которые также проходят рядом с контактором.

Если вы сможете уточнить свой вопрос, мы сможем сузить список предложений.

,

1

Контактор будет создавать переходные процессы при включении/выключении, поэтому вам необходимо стабилизировать питание вашего Arduino.

Вы можете подавить это с помощью какого-нибудь LC-фильтра, схем Зенера и т. д., хорошая статья «Устройства подавления переходных процессов» https://www.electronics-tutorials.ws/power/transient-suppression.html

или

https://interferencetechnology.com/input-filters-key-successful-emc-validation/

,