Вопрос по смс от sim800l

Тема в разделе "Arduino & Shields", создана пользователем piter pen, 16 янв 2020.

  1. piter pen

    piter pen Нерд

    Добрый день. Прошу помощи знающих и умеющих :) изучаю sim800l. нашел один проект - запрос температуры с датчика и получение оной в смс. все вроде нормально кроме одного - смс в ответ не приходят. в мониторе порта ответ есть. сим модуль рабочий, баланс сим-карты положительный. подскажите пожалуйста - почему не получаю смс? пробовал разную скорость... собрано на Уно...
    Код (C++):

    // Include DHT library and Adafruit Sensor Library
    #include "DHT.h"
    #include <Adafruit_Sensor.h>
    //Include Software Serial library to communicate with GSM
    #include <SoftwareSerial.h>

    // Pin DHT is connected to
    #define DHTPIN 2
     
    // Uncomment whatever type of sensor you're using
    //#define DHTTYPE DHT11   // DHT 11
    #define DHTTYPE DHT22   // DHT 22  (AM2302)
    //#define DHTTYPE DHT21   // DHT 21 (AM2301)

    // Initialize DHT sensor for normal 16mhz Arduino
    DHT dht(DHTPIN, DHTTYPE);

    // Create global varibales to store temperature and humidity
    float t; // temperature in celcius
    float f; // temperature in fahrenheit
    float h; // humidity

    // Configure software serial port
    SoftwareSerial SIM900(7, 8);

    // Create variable to store incoming SMS characters
    char incomingChar;

    void setup() {
      dht.begin();
     
      Serial.begin(19200);
      SIM900.begin(19200);

      // Give time to your GSM shield log on to network
      delay(20000);
      Serial.print("SIM900 ready...");

      // AT command to set SIM900 to SMS mode
      SIM900.print("AT+CMGF=1\r");
      delay(100);
      // Set module to send SMS data to serial out upon receipt
      SIM900.print("AT+CNMI=2,2,0,0,0\r");
      delay(100);
    }

    void loop(){
      if (SMSRequest()){
        if(readData()){
          delay(10);
          // REPLACE THE X's WITH THE RECIPIENT'S MOBILE NUMBER
          // USE INTERNATIONAL FORMAT CODE FOR MOBILE NUMBERS
          SIM900.println("AT + CMGS = \"+7ХХХХХХХХХХ\"");
          delay(100);
          // REPLACE WITH YOUR OWN SMS MESSAGE CONTENT
          String dataMessage = ("Temperature: " + String(t) + "*C " + " Humidity: " + String(h) + "%");
          // Uncomment to change message with farenheit temperature
          // String dataMessage = ("Temperature: " + String(f) + "*F " + " Humidity: " + String(h) + "%");    
         
          // Send the SMS text message
          SIM900.print(dataMessage);
          delay(100);
          // End AT command with a ^Z, ASCII code 26
          SIM900.println((char)26);
          delay(100);
          SIM900.println();
          // Give module time to send SMS
          delay(5000);
        }
      }
      delay(10);
    }

    boolean readData() {
      //Read humidity
      h = dht.readHumidity();
      // Read temperature as Celsius
      t = dht.readTemperature();
      // Read temperature as Fahrenheit
      f = dht.readTemperature(true);

      // Compute temperature values in Celcius
      t = dht.computeHeatIndex(t,h,false);

      // Uncomment to compute temperature values in Fahrenheit
      //f = dht.computeHeatIndex(f,h,false);
     
      // Check if any reads failed and exit early (to try again).
      if (isnan(h) || isnan(t) || isnan(f)) {
        Serial.println("Failed to read from DHT sensor!");
        return false;
      }
      Serial.print("Humidity: ");
      Serial.print(h);
      Serial.print(" %\t");
      Serial.print("Temperature: ");
      Serial.print(t);
      Serial.print(" *C ");
      //Uncomment to print temperature in Farenheit
      //Serial.print(f);
      //Serial.print(" *F\t");
      return true;
    }

    boolean SMSRequest() {
      if(SIM900.available() >0) {
        incomingChar=SIM900.read();
        if(incomingChar=='S') {
          delay(10);
          Serial.print(incomingChar);
          incomingChar=SIM900.read();
          if(incomingChar =='T') {
            delay(10);
            Serial.print(incomingChar);
            incomingChar=SIM900.read();
            if(incomingChar=='A') {
              delay(10);
              Serial.print(incomingChar);
              incomingChar=SIM900.read();
              if(incomingChar=='T') {
                delay(10);
                Serial.print(incomingChar);
                incomingChar=SIM900.read();
                if(incomingChar=='E') {
                  delay(10);
                  Serial.print(incomingChar);
                  Serial.print("...Request Received \n");
                  return true;
                }
              }
            }
          }
        }
      }
      return false;
    }
     
  2. SergeiL

    SergeiL Оракул Модератор

    А номер то заменен на номер своего мобильника свой в этой строке:
    Код (C++):
          // REPLACE THE X's WITH THE RECIPIENT'S MOBILE NUMBER
          // USE INTERNATIONAL FORMAT CODE FOR MOBILE NUMBERS
          SIM900.println("AT + CMGS = \"+7ХХХХХХХХХХ\"");
     
  3. piter pen

    piter pen Нерд

    Да. Ради интереса пробовал и +7 и 8 в начале номера. Номер затер перед публикацией кода
     
  4. SergeiL

    SergeiL Оракул Модератор

    без пробелов и черточек?
     
  5. piter pen

    piter pen Нерд

    Без них... В похожем скетче все работает как надо... И смс приходят... А в этом никак...
     
  6. SergeiL

    SergeiL Оракул Модератор

    Ну выкладывайте тот , что работает. Посмотрим в чем разница :)
     
  7. piter pen

    piter pen Нерд

    Эх. Все на рабочем компе... Если найду ссылку выложу.
     
  8. SergeiL

    SergeiL Оракул Модератор

    В свое время пробовал из wiki на Амперке, код нормально отправлял СМС.
    Посмотрите здесь, там переделать ничего не стоит. По крайней мере можно попробовать.
    Там модуль SIM800C, но он не отличается по AT командам.
    Вам нужно пробовать пример пример SoftwareSerial, поменять пины на 7, 8 в строке:
    Код (C++):
    SoftwareSerial mySerial(10, 11);
    Ну и номер телефона, на который отправлять.
     
  9. piter pen

    piter pen Нерд

    Пробовал скетч который просто смс отправляет при включении. Опять же все на работе... Правда все с иноязычных сайтов
     
  10. piter pen

    piter pen Нерд


    Код отсюда работает. То что смог сейчас найти...
     
  11. SergeiL

    SergeiL Оракул Модератор

    Вот блин "Нихт ферштейн" :)
    Как сейчас от деда помню.
     
  12. piter pen

    piter pen Нерд

    Акцент у автора огонь))) там в описании есть код... Он немного похож на тот что в начале... И работает...
     
  13. b707

    b707 Гуру

    если тот код "похож" - то надо его тщательно сравнить с вашим и найти различия.
    А если это трудно - можно вариант попроще, берете и потепенно переносите свои данные в тот скетч. И смотрите на каждом шаге - работает ли
     
    SergeiL нравится это.
  14. piter pen

    piter pen Нерд

    Честно говоря я уже пробовал переносить :) " И чем я его только не пробовал"
     
  15. parovoZZ

    parovoZZ Гуру

    Смотреть логическим анализатором процесс обмена. Там сразу станет понятно, где косяк.
     
  16. piter pen

    piter pen Нерд

    ну у меня такого нет... если конечно речь идет о чем то таком https://habr.com/ru/post/165853/
     
  17. piter pen

    piter pen Нерд

    вот рабочий код. правда тут запрос по звонку идет...
    Код (C++):
    #include "Sim800l.h"
    #include <SoftwareSerial.h>
    #include "call.h"
    #include <DHT.h>
    #include "sms.h"
    SoftwareSerial mySerial(2, 3); // RX, TX

    SMSGSM sms;
    #define DHTPIN 7
    #define DHTTYPE DHT11  

    CallGSM call;
    boolean started=false;
    char sms_text[160];

    DHT dht(DHTPIN, DHTTYPE);

    void setup()
    {
        dht.begin();
        Serial.begin(9600);
       
        if (gsm.begin(9600))
        {
            Serial.println("\nstatus=READY");
            started=true;
        }
        else
            Serial.println("\nstatus=IDLE");
    }

    void loop()
    {
       float humidity, temperature;
       String smsText ="";

      switch (call.CallStatus())
      {
        case CALL_NONE: // Nothing is happening

          break;

        case CALL_INCOM_VOICE : // Yes! Someone is calling us

          Serial.println("RECEIVING CALL");
           call.HangUp();
           delay(2000);
           humidity = dht.readHumidity();
           temperature = dht.readTemperature();
           delay(2000);
           smsText = "Temperature: "+String(temperature,1)+"C Humidity: "+String(humidity,1)+"%";
           smsText.toCharArray(sms_text,160);
           //Serial.println(smsText);
           sms.SendSMS("+7XXXXXXXXXX",sms_text);
          break;

        case CALL_COMM_LINE_BUSY:  // In this case the call would be established

          Serial.println("TALKING. Line busy.");
         
          break;
      }
      delay(1000);
    }
     
  18. parovoZZ

    parovoZZ Гуру

    самый простой - 500 рублей в известном месте.
     
  19. b707

    b707 Гуру

    ну и зачем же вы врете, что коды "похожие" ? как же вы их сравнивали? В вашем коде работа непосредственно через порт, а в этом - с использованием библиотеки.

    В этом коде вся отправка СМС - это одна строка
    sms.SendSMS("+7XXXXXXXXXX",sms_text);

    Разбирайтесь, тут все элементарно. Ну или заказывайте разработку в платном разделе.
     
  20. piter pen

    piter pen Нерд

    Спасибо за ответ. Конечно элементарно. Для Вас, для гуру в своем вопросе. Может быть для кого то еще. Для меня - не элементарно. Поэтому я написал сюда.
    Прошу прощения за то, что ввел Вас в заблуждение своим "враньем" по своему незнанию и неопытности в этом деле. Основной вопрос в моем первом сообщении состоит в том, что бы понять причину с помощью более опытных. Я не просил никого написать мне готовый код, что бы отсылать меня в платный отдел, про существование которого мне известно.