Работа с GSM

kenti-polt
Offline
Зарегистрирован: 08.02.2016


Привет!

Для реализации проекта дистанционного управления котлом отопления (его сброс в случае остановки) был сотворен прибор  из: 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"); 
    }
  }
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

gsm модуль очень критичен к питанию, ему нужен ток около 2 ампер, чем вы его питаете?

kenti-polt
Offline
Зарегистрирован: 08.02.2016

Valera19701 пишет:

gsm модуль очень критичен к питанию, ему нужен ток около 2 ампер, чем вы его питаете?

Блок питания от ПК. Взято 5В. Реакцию на питание замечал, когда брал питание с самой Ардуины. Просаживало сильно в момент инициализации.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

вы 5 вольт напрямую на м590 подаете или через диод?

kenti-polt
Offline
Зарегистрирован: 08.02.2016

Valera19701 пишет:

вы 5 вольт напрямую на м590 подаете или через диод?

Напрямую. Там же 5В стабилизированое. Паралельно с этого же блока и Ардуина питаеться.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

а что за gsm модуль, картинку в студию

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Были точно такие же грабли, после того, как запитал модуль от 5 вольт через диод, получив 4,3 вольта на модуле непосредственно, все проблемы исчезли. Но все же использую сторожевой таймер, береженного Бог бережет. :)

kenti-polt
Offline
Зарегистрирован: 08.02.2016

Valera19701 пишет:

а что за gsm модуль, картинку в студию

Вот такой .. 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

не видно, а диод на нем есть?

kenti-polt
Offline
Зарегистрирован: 08.02.2016

Gres пишет:

Были точно такие же грабли, после того, как запитал модуль от 5 вольт через диод, получив 4,3 вольта на модуле непосредственно, все проблемы исчезли. Но все же использую сторожевой таймер, береженного Бог бережет. :)

Да, я про питание понял, сегодня попробую. А про сторожок поподробней можно, какой именно.

kenti-polt
Offline
Зарегистрирован: 08.02.2016

Valera19701 пишет:

не видно, а диод на нем есть?

Да, действительно, за кондером есть.

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Модуль очень чувствителен к питанию, диапазонпитающих напряжений от 3,3 до 4,5 вольт, рекомендовано 3,9 вольта и током до 2 ампер. Но мой вис через несколько дней при питании в 4 вольта, от 4,3 работает без сбоев несколько месяцев. Вот тут мануал на модуль.

Watchdog - сторожевой таймер, устанавливаете время ожидания, включаете и обязаны в программе обнулить его счетчик раньше, чем он дойдет до своего, установленного Вами предела. То есть, ставите к примеру 8 секунд(есть выбор, 8 секунд максимум), и при каждом обороте цикла сбрасываете его счетчик, цикл должен обернуться быстрее 8 секунд. Если МК завис, то по прошествии 8 секунд сторожевой таймер перезагрузит МК и программа начнется с начала.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

еще попробуйте керамические конденсаторы поставить по питанию модуля и ардуино, бывает бп от компа очень сильно шумит, или какую нибудь зарядку от планшета попробуйте они обычно на 5 в 2.1 а

kenti-polt
Offline
Зарегистрирован: 08.02.2016

Gres пишет:

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

Гдето здесь читал, что эта функция не с каждым загрузчиком работает. Можно напороться на проблему после ребута. 

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

kenti-polt пишет:

Гдето здесь читал, что эта функция не с каждым загрузчиком работает. Можно напороться на проблему после ребута. 

Да, тоже читал об этом, но на деле не встречал. У меня Уно и Про Мини, Уно работает замечательно, а в Про Мини сразу вкатил загрузчик Уно. Мега есть еще, но с ней не пробовал, небыло необходимости. Сейчас свежие загрузчики, идущие с ИДЕ вроде избавлены уже от этого, но утверждать не буду. С загрузчиком Уно работает точно.

Есть еще вот такая очень интересная, древняя тема.

kenti-polt
Offline
Зарегистрирован: 08.02.2016

Промежуточный итог:

1. Отдельный блок питания с нужными параметрами;
2. Допонительный диод с понижением напряжения до 4,3 - 4,5 В;
3. Внедрения "сторожка" в код.

Спасибо Gres и Valera19701

Сегодня все сделаю и завтра отпишусь.

По поводу "косяков" в коде никто ничего не увидел ?..

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

строка 68 увеличить до 5000

kenti-polt
Offline
Зарегистрирован: 08.02.2016

Да, действительно, проблема оказалась в питании. Поставил дополнительный диод, сменил БП. Полет нормальный, за 11 часов работы без зависаний. Всем спасибо. 

P.S. Но "сторожек" в код внедрю.

sersahar
Offline
Зарегистрирован: 04.06.2014

kenti-polt, подскажи пожалуйста, как подключил шилд к нано? На нано выходы RX и TX?