Проблема с перезагрузкой 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();
}
}
@Jhalsingh, 👍1
Обсуждение2 ответа
Что за контактор, как он подключен к Arduino, какой ток потребляет его катушка при подключении? Какой ток он переключает? Два вероятных источника (мы не знаем больше, чем вы нам сказали):
катушка питается от Arduino или его источника питания и потребляет достаточный ток, чтобы напряжение на Arduino падало, вызывая сброс; или
контактор коммутирует достаточный ток, что создает помехи в близлежащих проводах, подключенных к Arduino, — электрический импульс, который мешает работе Arduino.
1) можно решить, запитав контактор от отдельного источника питания (т. е. не через Arduino) и используя транзисторный переключатель, подключенный к выводу Arduino, для включения и выключения контактора.
2) можно решить, (как вы и предполагали) переместив контактор дальше от Arduino; экранирование проводов, по которым идет коммутируемый ток; и экранирование всех проводов, подключенных к Arduino, которые также проходят рядом с контактором.
Если вы сможете уточнить свой вопрос, мы сможем сузить список предложений.
Контактор будет создавать переходные процессы при включении/выключении, поэтому вам необходимо стабилизировать питание вашего Arduino.
Вы можете подавить это с помощью какого-нибудь LC-фильтра, схем Зенера и т. д., хорошая статья «Устройства подавления переходных процессов» https://www.electronics-tutorials.ws/power/transient-suppression.html
или
https://interferencetechnology.com/input-filters-key-successful-emc-validation/
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Что вы имеете в виду под словами «с разъемом рядом?» Также покажите схему и схему, когда разъем, вероятно, подключен. Кроме того, постарайтесь уменьшить свой эскиз, чтобы найти место, где он идет не так (если это программное обеспечение)., @Michel Keijzers
@MichelKeijzers Я думаю, он имеет в виду «контактор», и проблема, скорее всего, вызвана EMI., @Majenko
@Маженко Я перередактировал вопрос; Спасибо., @Michel Keijzers