Мониторинг отключения питания с помощью Arduino UNO и ZMPT101B

Я занимаюсь внедрением системы оповещения об отключении питания, подаю в суд на Arduino UNO и однофазное реле ZMPT101B.

Мой код выглядит следующим образом

#include <Filters.h> //Простая библиотека для вычислений

float testFrequency = 50;                     // частота тестового сигнала (Гц)
float windowLength = 40.0/testFrequency;     // как долго усреднять сигнал для статистики

int Sensor = 0; //Аналоговый вход датчика, здесь A0

float intercept = -0.04; // корректируется на основе калибровочных испытаний
float slope = 0.0405; // корректируется на основе калибровочных испытаний
float current_Volts; // Напряжение

unsigned long printPeriod = 1000; //Частота обновления
unsigned long previousMillis = 0;

void setup() {
    Serial.begin( 9600 );    // запускаем последовательный порт
}

void loop() {

    RunningStatistics inputStats;                // Легкие линии жизни, фактический расчет среднеквадратичного значения требует большого количества кода
    inputStats.setWindowSecs( windowLength );

    while( true ) {   
        Sensor = analogRead(A0);  // читаем аналог в значении:
        inputStats.input(Sensor);  // войти в функцию статистики

        if((unsigned long)(millis() - previousMillis) >= printPeriod) {
            previousMillis = millis();   // время обновления каждую секунду

            Serial.print( "\n" );

            current_Volts = intercept + slope * inputStats.sigma(); //Калибровки смещения и амплитуды
            current_Volts= current_Volts*(40.3231);                //Дальнейшие калибровки амплитуды

            Serial.print( "\tVoltage: " );
            Serial.print( current_Volts ); //Отображение расчетов и значений выполнено, остальное, если вы используете OLED-дисплей

            if (current_Volts <229) {
                test_loop();
            }
        }
    }
}

void test_loop(){
    Serial.print( "Warning!! Server Room Power Down" );
    delay(1000);
}

Я получаю правильные показания напряжения. При отключении питания пишет Power Down. Но когда питание поднялось, оно по-прежнему показывает снижение мощности со старыми показаниями. Я думаю, причина в том, что мой код не может остановить цикл. И если я уберу задержку (1000) в функции test_loop, она сработает, но я намерен использовать эту систему оповещения по смс, и для этого мне нужна эта задержка, чтобы остановить ненужные оповещения.

Мой код для оповещения по SMS,

Serial.print( "\tVoltage: " );
Serial.print( current_Volts ); //Отображение расчетов и значений выполнено, остальное, если вы используете OLED-дисплей

if (current_Volts <229) {
    SendMessage();
}

void test_loop() {
    mySerial.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
    delay(1000);  // Задержка 1000 миллисекунд или 1 секунда
    mySerial.println("AT+CMGS=\"xxxxxxxxx\"\r"); // Заменить x на номер мобильного телефона
    delay(1000);
    mySerial.println("Warning!! Server Room Power Down");
    delay(100);
    mySerial.println((char)26);// ASCII-код CTRL+Z
    delay(150000);
    mySerial.println("AT+CMGD=2");
} 

Этот код работает при самом первом отключении питания, но после включения также отключает питание. Первая часть последовательной печати в коде test_loop Serial.print используется для отладки.

, 👍1


1 ответ


Лучший ответ:

1

Получил ответ на проблему,

Прикрепляю код, кому интересно.

/*
   Design by Vinod Amarathunga 26.08.2018
   FSSG R&D Team
*/


#include <OneWire.h>
#include <DallasTemperature.h>
#include <SoftwareSerial.h>
#define ONE_WIRE_BUS 2
SoftwareSerial mySerial(11, 10); //SIM800L Rx Tx
char msg;
String textMessage;

bool D7_alarmSent = false;
bool Temp_alarmSent = false;


OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

void setup()
{
  mySerial.begin(9600);   // Установка скорости передачи GSM-модуля
  Serial.begin(9600);    // Установка скорости передачи Serial Monitor (Arduino)
  delay(100);
}

void PowerSMS()
{
  Serial.println("Warning!! Server Room Power Down");
  mySerial.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
  delay(1000);  // Задержка 1000 миллисекунд или 1 секунда
  mySerial.println("AT+CMGS=\"No1\"\r");
  delay(1000);
  mySerial.println("Warning!! Server Room Power Down");
  mySerial.println((char)26);// ASCII-код CTRL+Z
  delay(1000);
  mySerial.println("AT+CMGD=2");


  mySerial.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
  delay(1000);  // Задержка 1000 миллисекунд или 1 секунда
  mySerial.println("AT+CMGS=\"No2\"\r");
  delay(1000);
  mySerial.println("Warning!! Server Room Power Down");
  mySerial.println((char)26);// ASCII-код CTRL+Z
  delay(1000);
  mySerial.println("AT+CMGD=2");



  mySerial.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
  delay(1000);  // Задержка 1000 миллисекунд или 1 секунда
  mySerial.println("AT+CMGS=\"No3\"\r");
  delay(1000);
  mySerial.println("Warning!! Server Room Power Down");
  mySerial.println((char)26);// ASCII-код CTRL+Z
  delay(1000);
  mySerial.println("AT+CMGD=2");



}

void SendMessage()
{

  Serial.println("Warning!! Server Room Temperature is Critical");

  mySerial.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
  delay(1000);  // Задержка 1000 миллисекунд или 1 секунда
  mySerial.println("AT+CMGS=\"No1\"\r"); // Заменить x на номер мобильного телефона
  delay(1000);
  mySerial.println("Warning!! Server Room Temperature is Critical");
  mySerial.println(String("Reading : ") + sensors.getTempCByIndex(0) + String("*C"));
  delay(100);
  mySerial.println((char)26);// ASCII-код CTRL+Z
  delay(1000);
  mySerial.println("AT+CMGD=2");



  mySerial.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
  delay(1000);  // Задержка 1000 миллисекунд или 1 секунда
  mySerial.println("AT+CMGS=\"No2\"\r");
  delay(1000);
  mySerial.println("Warning!! Server Room Temperature is Critical");
  mySerial.println(String("Reading : ") + sensors.getTempCByIndex(0) + String("*C"));
  delay(100);
  mySerial.println((char)26);// ASCII-код CTRL+Z
  delay(1000);
  mySerial.println("AT+CMGD=2");



  mySerial.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
  delay(1000);  // Задержка 1000 миллисекунд или 1 секунда
  mySerial.println("AT+CMGS=\"No3\"\r");
  delay(1000);
  mySerial.println("Warning!! Server Room Temperature is Critical");
  mySerial.println(String("Reading : ") + sensors.getTempCByIndex(0) + String("*C"));
  delay(100);
  mySerial.println((char)26);// ASCII-код CTRL+Z
  delay(1000);
  mySerial.println("AT+CMGD=2");




}


void loop()
{
  sensors.requestTemperatures(); // Отправляем команду для получения показаний температуры
  delay(1000);
  Serial.println(String("Temp Reading : ") + sensors.getTempCByIndex(0) + String("*C"));
  Serial.println(String("Voltage Digital: ") + digitalRead(7));
  Serial.println(Temp_alarmSent ? "True" : "False" );
  Serial.println(D7_alarmSent ? "True" : "False" );
  Serial.println("***********");
  ReceiveMessage();


  if (digitalRead(7) == 1 || sensors.getTempCByIndex(0) > 29 || D7_alarmSent == true || Temp_alarmSent == true ) {
    if (digitalRead(7) == 1 ) {
      if (!D7_alarmSent) {
        D7_alarmSent = true;
        PowerSMS();
      }

    }

    else if (sensors.getTempCByIndex(0) > 29 ) {
      if (!Temp_alarmSent) {
        Temp_alarmSent = true;
        SendMessage();
      }


    }

    else {

      if (D7_alarmSent){                  //alarmSent == true означает, что предыдущее состояние было "Power Down"
          SendMessage_After_Power_Down();          //Отправить сообщение
          D7_alarmSent = false;
          Temp_alarmSent = false;             //Сброс состояния тревоги
        }


    }
  }




}

void SendMessage_Normal()
{
  Serial.println("Temperature and Power is OK");

  mySerial.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
  delay(1000);  // Задержка 1000 миллисекунд или 1 секунда
  mySerial.println("AT+CMGS=\"No1\"\r");
  delay(1000);
  mySerial.println("Temperature and Power is OK");
  mySerial.println(String("Reading : ") + sensors.getTempCByIndex(0) + String("*C"));
  delay(100);
  mySerial.println((char)26);// ASCII-код CTRL+Z
  delay(1000);



  mySerial.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
  delay(1000);  // Задержка 1000 миллисекунд или 1 секунда
  mySerial.println("AT+CMGS=\"No2\"\r");
  delay(1000);
  mySerial.println("Temperature and Power is OK");
  mySerial.println(String("Reading : ") + sensors.getTempCByIndex(0) + String("*C"));
  delay(100);
  mySerial.println((char)26);// ASCII-код CTRL+Z
  delay(1000);


  mySerial.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
  delay(1000);  // Задержка 1000 миллисекунд или 1 секунда
  mySerial.println("AT+CMGS=\"No3\"\r");
  delay(1000);
  mySerial.println("Temperature and Power is OK");
  mySerial.println(String("Reading : ") + sensors.getTempCByIndex(0) + String("*C"));
  delay(100);
  mySerial.println((char)26);// ASCII-код CTRL+Z
  delay(1000);



}
void SendMessage_After_Power_Down(){

  Serial.println("Power Back Online");

  mySerial.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
  delay(1000);  // Задержка 1000 миллисекунд или 1 секунда
  mySerial.println("AT+CMGS=\"No1"\r");
  delay(1000);
  mySerial.println("Power Back Online");
  delay(100);
  mySerial.println((char)26);// ASCII-код CTRL+Z
  delay(1000);



  mySerial.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
  delay(1000);  // Задержка 1000 миллисекунд или 1 секунда
  mySerial.println("AT+CMGS=\"No2\"\r");
  delay(1000);
  mySerial.println("Power Back Online");
  delay(100);
  mySerial.println((char)26);// ASCII-код CTRL+Z
  delay(1000);


  mySerial.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
  delay(1000);  // Задержка 1000 миллисекунд или 1 секунда
  mySerial.println("AT+CMGS=\"No3\"\r");
  delay(1000);
  mySerial.println("Power Back Online");
  delay(100);
  mySerial.println((char)26);// ASCII-код CTRL+Z
  delay(1000);






  }


void ReceiveMessage()
{
  if (mySerial.available() > 0)
  {
    mySerial.println("AT+CNMI=2,2,0,0,0"); // AT-команда для получения живого SMS
    delay(1000);
    textMessage = mySerial.readString();
    Serial.print(textMessage);
    delay(10);
  }
  if (textMessage.indexOf("Status") >= 0) {
    SendMessage_Normal();
    mySerial.println("AT+CMGD=2");

  }
}
,

Можно принять ваш собственный ответ в качестве решения., @VE7JRO