Монитор сети и батареи с задержкой включения и выключения

Я новичок в Arduino. На самом деле я совершенно новичок во встроенной системе. Я использовал другие платформы для своих экспериментов, в частности PIC.

Я только что перешел на Arduino для более легкого кодирования, но я где-то зацепился.

Вот ограничения:

В коде, который я опубликую ниже;

  1. Когда сеть MAINS присутствует и находится в пределах допустимого диапазона, оба параметра MAINS_OK & ENABLE Контакты перейдут в состояние HIGH после 3-секундной задержки (без блокировки).

  2. Когда сеть MAINS ПЛОХАЯ, на выводе MAINS_OK сразу становится НИЗКИЙ уровень, а на выводе ENABLE будет ждать 3 секунды, прежде чем перейти в НИЗКИЙ уровень.

  3. Если сеть MAINS восстановлена и снова находится в пределах допустимого диапазона, последовательность, описанная в «1». необходимо соблюдать и т.д.

Я пробовал так много способов, но это не работает должным образом. Только мигание светодиода SYSTEM работает нормально.

// константы не изменятся. Используется здесь, чтобы
// устанавливаем номера выводов:
const int enablePin     = 7;      // количество функциональных контактов
const int lvdPin        = 6;
const int sysledPin    = 5;
const int mainsokPin   = 4;


// Переменные изменятся:
int mainsPin = A0;
int batteryPin = A2;
int MAINS;
int BATT;
int ENABLE = LOW;
int LVD = LOW;
int SYS_LED = LOW;
int MAINS_OK = LOW; // Состояние, используемое для установки функциональных контактов

long previousMillis1 = 0;
long previousMillis2 = 0;// будем хранить время последнего обновления PIN-кода
long previousMillis3 = 0;
long previousMillis4 = 0;
long previousMillis5 = 0;


long ENABLE_ON        = 3000;
long ENABLE_OFF       = 3000;
long LVD_ON           = 3000;
long LVD_OFF          = 3000;
long MAINS_DELAY_ON   = 3000;
long MAINS_DELAY_OFF  = 0;
long SYS_LED_ON       = 1000;
long SYS_LED_OFF      = 1000; //Длительность времени задержки (миллисекунды)

void setup()
{
  pinMode(ENABLE, OUTPUT);  // устанавливаем цифровой вывод в качестве выхода:
  pinMode(LVD, OUTPUT);     // устанавливаем цифровой вывод в качестве выхода:
  pinMode(SYS_LED, OUTPUT); // устанавливаем цифровой вывод в качестве выхода:
  pinMode(MAINS_OK, OUTPUT); // устанавливаем цифровой вывод в качестве выхода:
  pinMode(A0, INPUT); //установить контакт как аналоговый вход
  pinMode(A1, INPUT); //установить контакт как аналоговый вход
}
void loop()
{
  unsigned long currentMillis1 = millis();
  unsigned long currentMillis2 = millis();
  unsigned long currentMillis3 = millis();
  unsigned long currentMillis4 = millis();



  if ((SYS_LED == LOW) && (currentMillis1 - previousMillis1 >= SYS_LED_OFF))
  {
    SYS_LED = HIGH;  // Выключи
    previousMillis1 = currentMillis1;  // Запоминаем время
    digitalWrite(sysledPin, SYS_LED);  // Обновить фактический SYS_LED
  }
  if ((SYS_LED == HIGH) && (currentMillis1 - previousMillis1 >= SYS_LED_ON))
  {
    SYS_LED = LOW;  // включить его
    previousMillis1 = currentMillis1;   // Запоминаем время
    digitalWrite(sysledPin, SYS_LED);    // Обновить фактический SYS_LED
  }

  MAINS = analogRead(mainsPin);

  //======================== СЕТЬ ОК ===================== ==================
  /* If MAINS supply is ok, the MAINS_OK and ENABLE Pins will wait for 3sec
      before going high. Both Pins will go high at the same time.
  */

  if (MAINS >= 84 && MAINS <= 177) // >=0,410 В && <=0,864 В >=140 В && <=250 В
    if ((MAINS_OK == LOW) && (currentMillis2 - previousMillis2 >= MAINS_DELAY_ON))
    {
      MAINS_OK = HIGH;  // Включаем MAINS_OK с задержкой в 3 секунды
      previousMillis2 = currentMillis2;  // Запоминаем время
      digitalWrite(mainsokPin, MAINS_OK);  // Обновить фактический MAINS_OK
    }
  if (MAINS >= 84 && MAINS <= 177) // >=0,410 В && <=0,864 В >=140 В && <=250 В
    if ((ENABLE == LOW) && (currentMillis3 - previousMillis3 >= ENABLE_ON))
    {
      ENABLE = HIGH;    //Включить ENABLE с задержкой в 3 секунды
      previousMillis3 = currentMillis3;  // Запоминаем время
      digitalWrite(enablePin, ENABLE);  // Обновить фактический MAINS_OK
    }

  //=================== НЕТ СЕТИ ИЛИ НИЗКОЕ/ВЫСОКОЕ НАПРЯЖЕНИЕ ==================== "="
  /* As soon as MAINS is lost, whether it enters low voltage or high voltage,
     the PINs MAINS_OK will go LOW imedatly without delay while ENABLE will wait for
     3sec before going LOW. Then If MAINS is restored OK, the initial delay sequence
     must be followed.
  */
  if (MAINS <= 53 || MAINS >= 258) // <= 0,260 В || >=1,26 В// Ниже <= 120 В и >= 276 В
    if ((MAINS_OK == HIGH) && (currentMillis2 - previousMillis2 >= MAINS_DELAY_OFF))
    {
      MAINS_OK = LOW;  // Выключить MAINS_OK после задержки 0 секунд
      previousMillis2 = currentMillis2;  // Запоминаем время
      digitalWrite(mainsokPin, MAINS_OK);  // Обновить фактический MAINS_OK
    }
  if (MAINS <= 53 || MAINS >= 258) // <= 0,260 В || >=1,26 В// Ниже <= 120 В и >= 276 В
    if ((ENABLE == HIGH) && (currentMillis3 - previousMillis3 >= ENABLE_OFF))
    {
      ENABLE = LOW;    //Выключаем ENABLE после 3-секундной задержки
      previousMillis3 = currentMillis3;  // Запоминаем время
      digitalWrite(enablePin, ENABLE);  // Обновить фактический ENABLE
    }


  BATT = analogRead(batteryPin);

  //============================ НАСТРОЙКИ БАТАРЕИ =================== ============
  /* If Battery is below 21V LVD Pin go HIGH with 3sec delay
      When it goes high, it remains high the Batter goes up to 27.6V
      LVD will then go LOW ahter 3sec delay
  */
  if (BATT <= 391) //(1,91 В) 21 В // БАТАРЕЯ Низкий уровень
    if ((LVD == LOW) && (currentMillis4 - previousMillis4 >= LVD_ON))
    {
      LVD = HIGH; // Включаем LVD с задержкой в 3 секунды
      previousMillis4 = currentMillis4;  // Запоминаем время
      digitalWrite(lvdPin, LVD);  // Обновить фактический LVD
    }

  if (BATT >= 512) // (2,50 В) 27,6 В // БАТАРЕЯ разряжена Восстановление
    if ((LVD == HIGH) && (currentMillis4 - previousMillis4 >= LVD_OFF))
    {
      LVD = LOW; // выключаем LVD после 3-секундной задержки
      previousMillis4 = currentMillis4;  // Запоминаем время
      digitalWrite(lvdPin, LVD);  // Обновить фактический LVD
    }
}

Пожалуйста, что я могу добавить или удалить из этого кода, чтобы он работал правильно?

Спасибо.

, 👍1

Обсуждение

Когда MAINS в порядке... я думаю, что вы получите нежелательное поведение с этим тестом, потому что это верно каждый раз, когда вы проверяете значение.... вы, вероятно, хотите Когда MAINS становится в порядке... это происходит только один раз при переходах между OK и NOT-OK, @jsotola

Когда MAINS в порядке, это означает, что сеть находится в пределах допустимого диапазона, но «MAINS_OK» является цифровым выходным контактом., @mcmsat

вы неправильно понимаете мой комментарий ... если вы проверяете, что СЕТЬ в порядке, вы будете снова и снова устанавливать 3-секундный таймер ... вам нужно проверить переход между НЕ-ОК и ОК, @jsotola


1 ответ


2

В вашем коде много проблем. Для начала, большая часть/весь этот код неверны:

  pinMode(ENABLE, OUTPUT);  // устанавливаем цифровой вывод в качестве выхода:
  pinMode(LVD, OUTPUT);     // устанавливаем цифровой вывод в качестве выхода:
  pinMode(SYS_LED, OUTPUT); // устанавливаем цифровой вывод в качестве выхода:
  pinMode(MAINS_OK, OUTPUT); // устанавливаем цифровой вывод в качестве выхода:
  pinMode(A0, INPUT); //установить контакт как аналоговый вход
  pinMode(A1, INPUT); //установить контакт как аналоговый вход

Эти линии должны устанавливать различные контакты в желаемое состояние ввода/вывода. Однако вы используете объявленные вами переменные для хранения их логического статуса, а не их номеров выводов.

Используемые вами переменные объявляются следующим образом:

int ENABLE = LOW;
int LVD = LOW;
int SYS_LED = LOW;
int MAINS_OK = LOW; // Состояние, используемое для установки функциональных контактов

Это не номера контактов, это переменные, содержащие логические значения.

Эта строка, например:

pinMode(MAINS_OK, OUTPUT); // устанавливаем цифровой вывод в качестве выхода:

Почти наверняка следует читать

pinMode(mainsokPin, OUTPUT); // устанавливаем цифровой вывод в качестве выхода:

Вместо этого.

То же самое касается enablePin, lvdPin и sysledPin

.

Две линии

pinMode(A0, INPUT); //установить контакт как аналоговый вход
pinMode(A1, INPUT); //установить контакт как аналоговый вход

Вероятно, стоит прочитать

pinMode(mainsPin, INPUT); //установить контакт как аналоговый вход
pinMode(batteryPin, INPUT); //установить контакт как аналоговый вход

Поскольку вы определяете переменные mainsPin и batteryPin.

,

Спасибо Дункан! Сейчас я пойду и отредактирую код в соответствии с вашим советом., @mcmsat