Проблема с СМС (Sim900+Arduino UNO+DHT11)

Тема в разделе "Arduino & Shields", создана пользователем StepVik, 13 ноя 2019.

  1. StepVik

    StepVik Нуб

    Доброго времени суток. Прошу не судить строго, т.к. с Arduino столкнулся впервые.
    Суть проблемы: Необходима отправка смс на номер с показаниями датчика DHT11 ( температура + влажность ) Знаю, что выбор не лучший, но пока так. Насобирал код и вроде все работает, но при отправке СМС приходят только показания температуры (t) или влажности (h), если поставить ее первой. Укажите на ошибку, заранее спасибо!

    Код (C++):
    #include <GPRSk_Shield_Arduino.h>
    #include <sim900.h>


    // библиотека для эмуляции Serial порта
    // необходима для работы библиотеки GPRSk_Shield_Arduino
    #include <SoftwareSerial.h>
    // библиотека для датчика DHT11
    #include "DHT.h"
    DHT sensorDHT(2, DHT11);
    // создаём объект mySerial и передаём номера управляющих пинов RX и TX
    SoftwareSerial mySerial(7, 8);
    // номер на который будем отправлять сообщение
    #define PHONE_NUMBER  "+7***********"
    // создаём объект класса GPRS и передаём в него объект Serial1
    GPRSk gprs(mySerial);
    // пороговое значение температуры
    #define TEMPP 21
    unsigned long millissend;
    void setup()
    {
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(9600);
      // запуск датчика DHT
      sensorDHT.begin();
     
      // открываем Serial-соединение с GPRS Shield
      mySerial.begin(9600);
      // ждём пока не откроется монитор последовательного порта
      // для того, чтобы отследить все события в программе
      while (!Serial) {
      }
      Serial.print("Serial init OKrn");
      // включаем GPRS-шилд
      gprs.powerOn();
      // проверяем, есть ли связь с GPRS-устройством
      while (!gprs.init()) {
        // если связи нет, ждём 1 секунду
        // и выводим сообщение об ошибке;
        // процесс повторяется в цикле,
        // пока не появится ответ от GPRS-устройства
        delay(1000);
        Serial.print("GPRS Init errorrn");
      }
      // вывод об удачной инициализации GPRS Shield
      Serial.println("GPRS init success");
    }
    void loop()
    {
      if (millis()-millissend>600*1000) { // показания каждые 30 секунд?
          // получение данных с датчика DHT
          float h = sensorDHT.readHumidity();
          float t = sensorDHT.readTemperature();
         
          Serial.println(h);
          Serial.println(t);
             
          if(t<TEMPP) {
             // отправить SMS
             // подготовка сообщения для отправки:
             char message[16];
             sprintf(message,"%s %i","temp, hum, ", t, h );
                   
             // сообщаем о начале отправки SMS по указанному номеру
             Serial.println("Start to send message ...");
           
             // отправляем сообщение по указанному номеру с заданным текстом
             if (gprs.sendSMS(PHONE_NUMBER, message))
                Serial.println("Success");
             else
                Serial.println("Error");
             // ждем 10 минут
             delay(10*60*1000);
          }
          millissend=millis();
       }
    }
     
  2. SergeiL

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

    Так и должно быть по Вашему коду.
    Исправьте на такой вариант:
    Код (C++):
    sprintf(message,"Temp: %f;  Hum: %f", t, h );
     
    StepVik нравится это.
  3. SergeiL

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

    И сделайте с запасом буфер
    Код (C++):
    char message[32];
     
    StepVik нравится это.
  4. StepVik

    StepVik Нуб

    Спасибо ! Текст СМС теперь : Temp: ?; Hum: ? в чем может быть проблема ?
     
  5. StepVik

    StepVik Нуб

    В мониторе порта данные ( температура и влажность ) отображаются, но в СМС они не приходят.
     
  6. SergeiL

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

    А если после sprintf добавить строчку
    Код (C++):
        Serial.println(message);
     
    Что будет в мониторе порта выводиться?
     
  7. SergeiL

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

    Что то Вы не так делаете, нет тут ошибок, все должно отправляться правильно.
    Выложите измененный код.
     
  8. Airbus

    Airbus Радиохулиган Модератор

    Улыбнуло delay(10*60*1000)
     
  9. SergeiL

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

    Да пофиг, ну не нужно ему ничего делать эти 10 минут. ;)
     
  10. a1000

    a1000 Гуру

    Целую библиотеку соорудили для модуля. АТ команды запретили к использованию? Так скоро библиотеки на зажигание светодиода появятся.;)
     
    Airbus нравится это.
  11. Airbus

    Airbus Радиохулиган Модератор

    А сразу написать 600000?
    Не умеет он ни АТ командами ни аппаратным Сериалом.
     
  12. a1000

    a1000 Гуру

    Так АТ командами на сколько проще. Подключаешь модуль к компу и через гипертерминал не спеша, ручками отправляешь по одной команде. Сразу видно где что-то не так. Потом отработанную последовательность команд пихаешь в скетч и в 99,9% всё работает.
     
    Airbus нравится это.
  13. DetSimen

    DetSimen Guest

    sprintf не работает с данными типа float без спицальных телодвижений. Переведи температуру и влажность в целые и выводи. Или используй dtostrf().
     
    Andrey12 и Airbus нравится это.
  14. SergeiL

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

    Без дополнительных телодвижений:
    Код (C++):
    setup()
    {
                float h = 1.4567890;
                float t = 45.6543298654;
                char message[32];
                sprintf(message,"Temp: %0.2f;  Hum: %0.2f", t, h );
                Serial.println(message);
    }
    Результат:
    Temp: 45.65; Hum: 1.46
     
  15. DetSimen

    DetSimen Guest

    у тебя опция линкера нужная стоИт. По умолчанию, float версия vprintf не прилинковывается и sprintf не работает с плавающими.
    У мня на 1.8.10 по умолчанию выводит
    Temp: ?; Hum: ?
     
    Andrey12 нравится это.
  16. Airbus

    Airbus Радиохулиган Модератор

    А зачем Спринтер?Отправлять обычным образом.Частями.Меж ними делей(100).В конце crrl+z.Оно же 26.Можно даже совсем без библиотек.Как сказал а1000.
     
  17. SergeiL

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

    Странно, вроде не включал ничего по флоат дополнительно...
     
  18. DetSimen

    DetSimen Guest

  19. SergeiL

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

    Тогда заменяем строчку со sprintf на эту:
    Код (C++):
         sprintf(message,"Temp: %d.%02d;  Hum: %d.%02d", (int) t, abs(((int)(t*100) % 100)), (int) h, abs(((int)(h*100) % 100)));
     
     
    Последнее редактирование: 14 ноя 2019
    StepVik и DetSimen нравится это.
  20. SergeiL

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

    Так не менял же опций по умолчанию.