Блог Тимура Казанского

Ардуино - смс оповещение при неисправности


Всем привет! Не так давно возникла идея создать систему для автоматического смс-оповещения персонала подстанции при срабатывании определенной защиты. Суть системы заключается в следующем - есть 6 лампочек постоянного напряжения 110В, каждая из которых загорается в определенной ситуации и имеет свое обозначение. Нам нужно отправлять смс с сообщением в котором будет указано, какая именно лампочка загорелась и в какое время это произошло, тем самым заранее давая понять, что случилось, важно это или нет и как на это реагировать. Для этого за 120 рублей на алиэкспресс была заказана китайская микросхема CH340 (совместимая с Ардуино Нано, далее Ардуино. Как подключить arduino nano и начать работу с ней, писал здесь), а также понадобились 2 резистора на 100 и 4 кОм, USB-модем, симка для отправки смс и ноутбук (компьютер). И так, алгоритм реализации следующий: запитываемся к каждой лампочки и понижаем напряжение со 110В до 4-5В, далее подключаем каждую лампочку к аналоговому пину ардуино, пишем скетч(программа для ардуино), который будет следить за аналоговыми пинами и при наличии напряжения на определенном пине подавать соответствующий сигнал на com-порт ноутбука, а затем пишем программу, которая будет обрабатывать этот сигнал и отправлять смс. А теперь по порядку:

Покупка модуля CH-340 на алиэкспресс

Если честно, никогда до этого не работал с ардуино и даже мало представлял, что это и как с этим работать, но скажу заранее, ничего в этом сложно нет, все очень просто и удобно.

Пришла посылка с алиэкспресс

Через недельки две пришла долгожданная посылка и за дело!

И так, для начала я написал скетч для ардуино, он выглядит следующим образом:


const int i = 500;

void setup() {
Serial.begin(9600);
}

void loop() {
int analog0 = analogRead(0);
delay(1000);
int analog1 = analogRead(1);
delay(1000);
int analog2 = analogRead(2);
delay(1000);
int analog3 = analogRead(3);
delay(1000);
int analog4 = analogRead(4);
delay(1000);
int analog5 = analogRead(5);
delay(1000);
int analog6 = analogRead(6);
delay(1000);
int analog7 = analogRead(7);
delay(1000);

if(analog0 > i && analog1 > i)
Serial.println("zero");
delay(500);

if(analog1 > i && analog2 > i)
Serial.println("one");
delay(500);

if(analog2 > i && analog3 > i)
Serial.println("two");
delay(500);

if(analog3 > i && analog4 > i)
Serial.println("three");
delay(500);

if(analog4 > i && analog5 > i)
Serial.println("four");
delay(500);

if(analog5 > i && analog6 > i)
Serial.println("five");
delay(500);

if(analog6 > i && analog7 > i)
Serial.println("six");
delay(500);

if(analog0 > i && analog7 > i)
Serial.println("seven");
delay(500);
}

Залил его в ардуино и тут я столкнулся с проблемкой, думал, что просто буду считывать показание напряжения на пине и если оно отлично от нуля, то значит загорелась та лампочка, на которую данный пин подвязан, но не тут-то было, оказалось что все аналоговые пины из-за наведенки и различного рода помех имели напряжение в пределах 1-2В, подумал не беда и поднял цифру в условии до 500 (примерно до 3В). Но на этом проблема не закончилась – при подаче напряжения на любой аналоговый пин, появлялось такое-же напряжение и на другом пине, пробовал подтягивать внутренние резисторы пинов, не помогло, усложнять схему, цепляя при этом дополнительное сопротивление, дабы избавиться от наведенки я тоже не хотел, поэтому немного повозившись нашел определенную закономерность и в следствии этого переделал условие в цикле программы. Подавал напряжение на аналоговые пины двумя подключенными последовательно пальчиковыми батарейками, минус подключил на землю (Gnd) платы, а плюсом касался пинов, тем самым имитируя наличия напряжения при загорании определенной лампочки.

Далее, написал простенькое WPF C# приложение для чтения сигналов ардуино c COM-порта ноутбука.


//метод для иницициализации com-порта
private void InitializeArduinoPort(string arduinoPortNumber)
{
arduinoPort = new SerialPort();

arduinoPort.BaudRate = 9600;
arduinoPort.DtrEnable = true;

arduinoPort.ReadTimeout = 1000;
arduinoPort.PortName = "COM" + arduinoPortNumber; // com-порт ардуино;

try
{
arduinoPort.Open();
}
catch
{
arduinoPort.Close();
}
}

//метод для получения сообщений от ардуино о наличии сигнала на соответствующем пине.
private void GetDataFromArduino()
{
while (true)
{
string messageFromArduino = arduinoPort.ReadExisting();
Thread.Sleep(500);

if (messageFromArduino.Contains("zero"))
CreateSms("0");
if (messageFromArduino.Contains("one"))
CreateSms("1");
if (messageFromArduino.Contains("two"))
CreateSms("2");
if (messageFromArduino.Contains("three"))
CreateSms("3");
if (messageFromArduino.Contains("four"))
CreateSms("4");
if (messageFromArduino.Contains("five"))
CreateSms("5");
if (messageFromArduino.Contains("six"))
CreateSms("6");
if (messageFromArduino.Contains("seven"))
CreateSms("7");
}
}

Подаем напряжение на любой аналоговый пин ардуино с помощью пока еще подручного средства – батарейки и получаем смс с номером пина, все работает!

Аналоговые пины ардуино

Подаем напряжение на ардуино с спомощью батарейки

Осталось только придумать, как легко понизить напряжение со 110В до 4В, для этого я использовал делитель напряжения, с помощью закона Ома рассчитал сопротивления для двух резисторов, получилось 100кОм и 4кОм соответственно, собираем схемку и на выходе получаем около 4В.

Схема делителя напряжения

Вот и все, ничего сложного, если есть вопросы или что-то будет непонятно, попробую описать какой-либо процесс более подробно. Всем пока!

Категория: Проекты и Стартапы

Читайте также - самые интересные истории обо мне

Оставьте ваш комментарий

Комментарии: 0