Шилд не отправляет СМС!

Тема в разделе "Arduino & Shields", создана пользователем NazarDiadiun, 29 мар 2016.

  1. NazarDiadiun

    NazarDiadiun Нуб

    Есть такой код. Это контроллер теплицы. Но когда я отправляю СМС Stats хочу получить общие данные, но получаю ничего.
    Код (C++):
    #include "QuadDisplay.h"
    #include <GPRS_Shield_Arduino.h>
    #include <sim900.h>
    #include <DHT.h>
    #include <SoftwareSerial.h>
    #define MESSAGE_LENGTH 160
    #define MESSAGE_ERROR  "Error...unknown command!"
    #define PHONE "+791088ххххх" //Введи свой номер сюда!
    #define MESSAGE_POLIV "Poliv on"
    #define MESSAGE_MIN "Tmin"
    #define MESSAGE_MAX "Tmax"
    boolean poliv = false;
    boolean fort = false;
    int messageIndex = 0;
    char phone[18];
    char message[MESSAGE_LENGTH];
    char datetime[24];
    GPRS gprs;


    const int HUMIDY_MIN = 200;
    const int HUMIDY_MAX = 700;

    const int TEMP_MIN = 2;
    const int TEMP_MAX = 40;

    #define DHTPIN 2
    #define DHTTYPE DHT11
    DHT dht(DHTPIN, DHTTYPE);
    int Relay1 = 8;
    int Relay2 = 9;
    int Relay3 = 10;
    void setup()
    {
      pinMode(3, OUTPUT);
      displayInt(3, 0);
      gprs.powerUpDown();
      dht.begin();
     
      pinMode(Relay1, OUTPUT);
      pinMode(Relay2, OUTPUT);
      pinMode(Relay3, OUTPUT);
      pinMode(A0, INPUT);
    }

    char intDigit(unsigned int val, char pos)
    {
      char buf[6];
     
      sprintf(buf, "%04u", val);
     
      return buf[3-pos]-'0';
    }

    unsigned int intDigitSet(unsigned int val, char pos, char d)
    {
      char buf[6];
     
      sprintf(buf, "%04u", val);
     
      buf[3-pos] = '0'+d;
     
      return atoi(buf);
    }

    unsigned int readHumidy(void)
    {
      static unsigned int oldval = 0;
      static unsigned int res = 0;
      static unsigned int stability[4] = { 0, 0, 0, 0 };
     
      char i;
      unsigned int val = analogRead(A0);
     
      for(i = 0; i < 4; i++) {
        if(intDigit(oldval, i) != intDigit(val, i)) {
          oldval = intDigitSet(oldval, i, intDigit(val, i));
          stability[i] = 0;
        }
        else {
          if(stability[i] < 10) stability[i]++;
          else res = intDigitSet(res, i, intDigit(val, i));
        }
      }
     
      return res;
    }

    void loop()
    {
      float h = dht.readHumidity();
      float t = dht.readTemperature();
      float val = analogRead(A0);
     

      messageIndex = gprs.isSMSunread();
      if (messageIndex > 0) {
        gprs.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
        gprs.deleteSMS(messageIndex);
        // выводим номер, с которого пришло смс
        Serial.print("From number: ");
        Serial.println(phone);

        // выводим дату, когда пришло смс
        Serial.print("Datetime: ");
        Serial.println(datetime);

        // выводим текст сообщения
        Serial.print("Recieved Message: ");
        Serial.println(message);
       
        setRelay(phone, message);
      }
     
    if(val < HUMIDY_MIN) //Если влажность меньше минимального порога, то
    {
      digitalWrite(Relay1, HIGH); //Включаем полив
      poliv = true; //Флаг для того, что бы знать, включен ли полив, или нет
    }
    else if(val > HUMIDY_MAX) //А если достигли максимального порога, то выключаем поливалку
    {
      digitalWrite(Relay1, LOW); //Выключили полив
      poliv = false;
    }


    if(t > TEMP_MAX) //Если температура стала больше заданной, то
    {
      gprs.sendSMS(phone, MESSAGE_MAX);
      digitalWrite(Relay2, HIGH); //Включаем мотор
      delay(200); //Ждем пока форточка откроется
      digitalWrite(Relay2, LOW); //Выключаем мотор, форточка открыта
      fort = true;
    }
    else if(t < TEMP_MIN) //Но, если температура опустилась ниже заданной, то
    {
      gprs.sendSMS(phone, MESSAGE_MIN);
      digitalWrite(Relay3, HIGH); //Включаем мотор для закрывания
      delay(200); //Ждем пока форточка закроется
      digitalWrite(Relay3, LOW); //Выключаем мотор, форточка закрыта
      fort = false;
    }
     
     

    delay(250);
    }
    void setRelay(char f_phone[], char f_message[])
    {
      int val = analogRead(A0);
      int h = dht.readHumidity();
      int t = dht.readTemperature();
      char s_temp[8];
      char s_humi[8];
      char s_mois[8];
      if(poliv == false)
      {
        #define MESSAGE_POL "Poliv now is On!"
      }
      else if(poliv == true)
      {
        #define MESSAGE_POL "Poliv now is Off!"
      }

      if(fort == false)
      {
        #define MESSAGE_FORT "Window now is closed!"
      }
      else if(fort == true)
      {
        #define MESSAGE_FORT "Window now is open!"
      }
     
      itoa(t, s_temp, 10);
      itoa(h, s_humi, 10);
      itoa(val, s_mois, 10);
     
      if (strcmp(f_message, "Stats") == 0)
      {
       char* tm = "Temperature: ";
       char* hm = "Humidity: ";
       char* ms = "Moisture: ";
       char* tmc = " °C";
       char* Hm = " %";
       char* tz = "; ";
       char* fr;
       char* pl;
       if(fort == false)
      {
        fr = "Window now is closed!";
      }
      else if(fort == true)
      {
        fr = "Window now is open!";
      }
      if(poliv == false)
      {
       pl = "Poliv now is On!";
      }
      else if(poliv == true)
      {
        pl = "Poliv now is Off!";
      }
       //Temperature c
       char* a = strcat(tm , s_temp);
       char* b = strcat(a, tmc);
       char* c = strcat(b, tz);
       //Humidity m
       char* d = strcat(hm, s_humi);
       char* r = strcat(d, Hm);
       char* m = strcat(r, tz);
       //Moisture e
       char* q = strcat(ms, s_mois);
       char* w = strcat(q, Hm);
       char* e = strcat(w, tz);
       //Relay statsus
       char* p = strcat(fr, tz);
       char* y = strcat(p, pl);
       char* u = strcat(y, tz);
       //Все в кучу =)
       char* z = strcat(c, m);
       char* x = strcat(z, e);
     
       char* v = strcat(x, u);
        gprs.sendSMS(phone, v);
        delay(2000);/*
        gprs.sendSMS(phone, s_humi);
        delay(2000);
        gprs.sendSMS(phone, s_mois);
        delay(2000);
        gprs.sendSMS(phone, MESSAGE_POL);
        delay(2000);
        gprs.sendSMS(phone, MESSAGE_FORT);
        delay(2000);*/

       
      }
      else if (strcmp(f_message, "On") == 0)
      {
        setPoliv();
        gprs.sendSMS(phone, MESSAGE_POLIV);
        delay(5000);
      }
      else
      {
        Serial.println("Error... unknown command!");
        delay(800);
        gprs.sendSMS(f_phone, MESSAGE_ERROR);
      }
    }

    void setPoliv()
    {
      int val = analogRead(A0);
      digitalWrite(Relay1, HIGH);
      poliv = true;
      if(val > HUMIDY_MAX)
      {
        digitalWrite(Relay1, LOW);
        poliv = false;
      }
    }
     
     
  2. BoNzo

    BoNzo Нуб

    Аналогично, делал СМС розетку. При существующей библиотеке на git не работает вообще ничего. После того как скачад с git библиотеку с исправлениями и добавлением строки AT+CNMI=2,2,0,0,0 получилось принимать сообщения, но при этом не отправляет на телефон смс. Попробовал из примера в библиотеке отправить - телефон получил смс. Помогите разобраться, в скетче где СМС разетка не отправляет на телефон сообщения
     

    Вложения:

    • GSMkey.ino
      Размер файла:
      4,7 КБ
      Просмотров:
      274
  3. SanЯ

    SanЯ Нуб

    Такая же проблема, принимает сообщение, но не отправляет ответное смс. Отправка сообщения зависает на команде AT+CMGF=1. Если запустить просто скетч отправки смс, то отправляет. Проблема возникает именно после получения входящего смс.
     
  4. BoNzo

    BoNzo Нуб

    Ответ тех. поддержки
    Ваш скетч полностью работает. Сообщения доходят, но мы в своём примере используем плату Iskra Neo (Arduino Leonardo)
    У вас плата Arduino Uno. Как я понял что бы прошить плату вы снимаете перемычки, а потом вставляете их. Вам надо перекинуть управляющие пины с 0 и 1 на любые другие:
    wiki.amperka.ru/продукты:gprs-shield (Работа через SoftwareSerial)

    и в скетче вместо строки:
    GPRS gprs;
    использовать как в примере:

    // создаём объект класса GPRS
    // и передаём ему номера пинов ST, PK, RX и TX.
    // с помощью него будем давать команды GPRS шилду
    GPRS gprs(2, 3, 11, 10);