Мониторинг отключения питания с помощью 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 ответ
Лучший ответ:
Получил ответ на проблему,
Прикрепляю код, кому интересно.
/*
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");
}
}
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Проблема в AT+CIPSEND(CTRL-Z) GPRS GMS A6
- SIM800L не отвечает на AT-команды
- GSM SIM900A Содержимое SMS не отображается
- SIM800L и Arduino Sleep — получение странного последовательного вывода после 5 вызовов
- Как связаться с GPS SIM900a без serial monitor
- Соединение AI A7 Thinker с Arduino
- Как узнать частоту дискретизации?
Можно принять ваш собственный ответ в качестве решения., @VE7JRO