Работа с 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?