Работа с GSM
- Войдите на сайт для отправки комментариев
Привет!
Для реализации проекта дистанционного управления котлом отопления (его сброс в случае остановки) был сотворен прибор из: Arduino Nano v.3, GSM модуль Neoway M590, датчик температуры DTH11 и одноканальное реле. Для управления этим делом было создано простенький код (на мой взгляд). Опыт в этом деле у меня минимальный, прошу сильно не хохотать с кода.
Проблема.
Все работает как надо, - звоню с одного телефона - звонок сбрасывается и мне приходит СМС, звоню с другого - срабатывает реле на 1,5 сек. и сбрасывает котел. Но вот никак не могу понять периодические зависания то модуля, то ардуины. Причем может работать несколько часов без запинки, а потом виснет. Засомневался в правильности кода. Если кто увидит чего плохого, - маякните. А может, кому просто код пригодиться.
#include "DHT.h"
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
int ch = 0;
int rel = 4;
#define DHTPIN 5
#define DHTTYPE DHT11
String val = "";
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
pinMode(rel, OUTPUT);
digitalWrite(rel, HIGH);
delay(2000);
mySerial.begin(19200);
delay(100);
mySerial.println("AT+CLIP=1");
delay(100);
mySerial.println("AT+CMGF=1");
delay(100);
mySerial.println("AT+CSCS=\"GSM\"");
dht.begin();
}
void loop()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
if (mySerial.available())
{
while (mySerial.available())
{
ch = mySerial.read();
val += char(ch);
delay(10);
}
if (val.indexOf("RING") > -1)
{
if (val.indexOf("7xxxxxxxxxx1") > -1)
{
delay(150);
mySerial.println("ATH0");
digitalWrite(rel, LOW);
delay(1500);
digitalWrite(rel, HIGH);
val = "";
}
if (val.indexOf("7xxxxxxxxxx2") > -1)
{
delay(150);
mySerial.println("ATH0");
delay(1500);
mySerial.println("AT+CMGS=\"+7xxxxxxxxxx1\"");
delay(150);
mySerial.print("Humidity: ");
mySerial.print(h);
mySerial.print(" %, ");
mySerial.print("Temperature: ");
mySerial.print(t);
mySerial.print(" *C");
delay(150);
mySerial.print((char)26);
delay(50);
mySerial.println();
delay(150);
val = "";
delay(500);
}
else
delay(2500);
mySerial.println("ATH0");
}
}
}
gsm модуль очень критичен к питанию, ему нужен ток около 2 ампер, чем вы его питаете?
gsm модуль очень критичен к питанию, ему нужен ток около 2 ампер, чем вы его питаете?
Блок питания от ПК. Взято 5В. Реакцию на питание замечал, когда брал питание с самой Ардуины. Просаживало сильно в момент инициализации.
вы 5 вольт напрямую на м590 подаете или через диод?
вы 5 вольт напрямую на м590 подаете или через диод?
Напрямую. Там же 5В стабилизированое. Паралельно с этого же блока и Ардуина питаеться.
а что за gsm модуль, картинку в студию
Были точно такие же грабли, после того, как запитал модуль от 5 вольт через диод, получив 4,3 вольта на модуле непосредственно, все проблемы исчезли. Но все же использую сторожевой таймер, береженного Бог бережет. :)
а что за gsm модуль, картинку в студию
Вот такой ..
не видно, а диод на нем есть?
Были точно такие же грабли, после того, как запитал модуль от 5 вольт через диод, получив 4,3 вольта на модуле непосредственно, все проблемы исчезли. Но все же использую сторожевой таймер, береженного Бог бережет. :)
Да, я про питание понял, сегодня попробую. А про сторожок поподробней можно, какой именно.
не видно, а диод на нем есть?
Да, действительно, за кондером есть.
Модуль очень чувствителен к питанию, диапазонпитающих напряжений от 3,3 до 4,5 вольт, рекомендовано 3,9 вольта и током до 2 ампер. Но мой вис через несколько дней при питании в 4 вольта, от 4,3 работает без сбоев несколько месяцев. Вот тут мануал на модуль.
Watchdog - сторожевой таймер, устанавливаете время ожидания, включаете и обязаны в программе обнулить его счетчик раньше, чем он дойдет до своего, установленного Вами предела. То есть, ставите к примеру 8 секунд(есть выбор, 8 секунд максимум), и при каждом обороте цикла сбрасываете его счетчик, цикл должен обернуться быстрее 8 секунд. Если МК завис, то по прошествии 8 секунд сторожевой таймер перезагрузит МК и программа начнется с начала.
еще попробуйте керамические конденсаторы поставить по питанию модуля и ардуино, бывает бп от компа очень сильно шумит, или какую нибудь зарядку от планшета попробуйте они обычно на 5 в 2.1 а
Watchdog - сторожевой таймер, устанавливаете время ожидания, включаете и обязаны в программе обнулить его счетчик раньше, чем он дойдет до своего, установленного Вами предела.
Гдето здесь читал, что эта функция не с каждым загрузчиком работает. Можно напороться на проблему после ребута.
Гдето здесь читал, что эта функция не с каждым загрузчиком работает. Можно напороться на проблему после ребута.
Да, тоже читал об этом, но на деле не встречал. У меня Уно и Про Мини, Уно работает замечательно, а в Про Мини сразу вкатил загрузчик Уно. Мега есть еще, но с ней не пробовал, небыло необходимости. Сейчас свежие загрузчики, идущие с ИДЕ вроде избавлены уже от этого, но утверждать не буду. С загрузчиком Уно работает точно.
Есть еще вот такая очень интересная, древняя тема.
Промежуточный итог:
1. Отдельный блок питания с нужными параметрами;
2. Допонительный диод с понижением напряжения до 4,3 - 4,5 В;
3. Внедрения "сторожка" в код.
Спасибо Gres и Valera19701
Сегодня все сделаю и завтра отпишусь.
По поводу "косяков" в коде никто ничего не увидел ?..
строка 68 увеличить до 5000
Да, действительно, проблема оказалась в питании. Поставил дополнительный диод, сменил БП. Полет нормальный, за 11 часов работы без зависаний. Всем спасибо.
P.S. Но "сторожек" в код внедрю.
kenti-polt, подскажи пожалуйста, как подключил шилд к нано? На нано выходы RX и TX?