GSM-модуль Arduino + строка SMS, отправляющая мусорное значение

Я хочу проверить уровень воды и получить SMS через модуль GSM. Герконы подключены к четырем аналоговым входам Arduino.

Я не могу добавить в программу строку и уровень бака (TKLVL). Программа отправляет какое-то мусорное значение через SMS. Но переменная TKLVL выводит правильное значение.

Что не так с моим кодом?

    #include <SoftwareSerial.h>
    SoftwareSerial SIM900(10, 11);
    String textMessage;
    #define LED1 2
    #define IRLED 3
    //# определить rf433DATA 4
    //D4 ПОДКЛЮЧЕН К ПРИЕМНИКУ RF433MHZ ИЗМЕНИТЬ СОГЛАСНО БИБЛИОТЕКЕ
    #define PIRpower 5
    int receiver = 6;
    #define VALVE1 7
    #define GSMRESET 8
    #define pumpONdetect 9
    #define VALVE2 12
    //#определить TANK_SENSPOWER 13 //
    #define TANK_SENS4 A0  //звуковой сигнал полного бака
    #define TANK_SENS3 A1
    #define TANK_SENS2 A2
    #define TANK_SENS1 A3  //низкий бак
    int TKLVL= 0;
    int LEVEL;

    void setup()
    { pinMode(LED1, OUTPUT);
      pinMode(IRLED, OUTPUT);
      pinMode(PIRpower, OUTPUT);
      // ПРОВЕРКА ПИНА ПРИЕМНИКА
      pinMode(GSMRESET, OUTPUT);
      pinMode(VALVE2, OUTPUT);
      // pinMode(TANK_SENSPOWER, OUTPUT); // ПОДАЧА НА ЭТОМ ВЫВОДЕ НИЗКИЙ ВКЛ. ПИТАНИЕ БАКА (PNP ТРАНЗИСТОР)
      pinMode(TANK_SENS4, INPUT); //ПОЛНЫЙ БАК С ЗВУКОВЫМ СИГНАЛОМ
      pinMode(TANK_SENS3, INPUT);
      pinMode(TANK_SENS2, INPUT);
      pinMode(TANK_SENS1, INPUT); //МАЛО ВОДЫ В БАКЕ
      // digitalWrite(TANK_SENSPOWER, HIGH); //выключает питание tanksenspower через PNP-транзистор..
      Serial.begin(9600);
      SIM900.begin(9600);
      Serial.print("SIM900 ready...");
      SIM900.println("AT+CMGD=1,4\r");
      delay(1000);
      // AT-команда для перевода SIM900 в режим SMS
      SIM900.println("AT+CMGF=1\r");
      delay(400);
      // Установите модуль для отправки данных SMS на серийный номер после получения
      SIM900.println("AT+CNMI=2,2,0,0,0\r");
      delay(400);
      digitalWrite(VALVE1, LOW);

    }

    void loop()
    {
      if (SIM900.available() > 0) {
        textMessage = SIM900.readString();
        Serial.print(textMessage);
        delay(10);
      }
      if (textMessage.indexOf("Von") >= 0)
      {
        G_valve1On();
        Serial.println("on loop");
        textMessage = "";
      }
      if (textMessage.indexOf("Voff") >= 0)
      {
        G_valve1Off();
        Serial.println("off loop");
        textMessage = "";
      }

      if (textMessage.indexOf("Tanklvl") >= 0)
      {
        Tanklvl_calc();
         Serial.print("TKLVL is=");
         Serial.println(TKLVL);
        // ТКЛВЛ=УРОВЕНЬ;
        // Serial.print("уровень ==");
        //Serial.println(LEVEL);
        String msg ="TANK IS " + TKLVL; 
        Serial.println(msg);   
        sendSMS(msg);
        textMessage = "";
      }

    }
    //функция ОТПРАВИТЬ СМС
    void sendSMS(String lvlmsg)
    {
      SIM900.print("AT+CMGF=1\r");
      delay(1000);
      SIM900.println("AT+CMGS=\"+9182375*****\"\r");
      delay(100);
      SIM900.println(lvlmsg);
      delay(100);
      SIM900.println((char)26);
      delay(1000);
      SIM900.println();
      delay(5000);
    }



    void G_valve1On()
    {
      digitalWrite(VALVE1, HIGH);
      Serial.println("...turning valve1 on...");
    }
    void G_valve1Off()
    {
      digitalWrite(VALVE1, LOW);
      Serial.println("...turningvalve1 off...");
    }


    int Tanklvl_calc()
    {
      if (digitalRead(TANK_SENS4) == HIGH)
      {    
        TKLVL = 100;
        Serial.println("TANK LEVEL 100%");
      }
      else if (digitalRead(TANK_SENS3) == HIGH)
      {    
        TKLVL = 75;
        Serial.println("TANL LEVEL 75%");
      }
      else if (digitalRead(TANK_SENS2) == HIGH)
      {    
        TKLVL = 50;
        Serial.println("TANK LEVEL 50%");
      }
      else if (digitalRead(TANK_SENS1) == HIGH)
      {
        TKLVL = 25;
        Serial.println("TANK LEVEL 25%");
      }
      else
      { 
        TKLVL = 0;
        Serial.println("TANK LEVEL IS LESS THAN 25%");
      }  
      return(TKLVL);
    }

, 👍0

Обсуждение

Вы получаете смс от UNO? Напечатал ли серийный монитор правильное значение?, @Mitu Raj

Мусорные значения, полученные в смс, @Nikhil P

@MITURAJ plz chk string msg command, я думаю, что это не комбинация оператора + переменная уровня., @Nikhil P

Serial.println (сообщение); <-- Это сработало? Я сомневаюсь, что он печатает нежелательное значение, потому что TKLVL имеет тип int. Преобразуйте его в строку, используя ---> String msg = "TANK IS" + String(TKLVL), @Mitu Raj

@MITURAJ Нет, эта строка не выводит никакого значения., @Nikhil P

Пытаться String msg = "TANK IS" + String(TKLVL), @Mitu Raj

String msg= "led is" + ledstate эта строка работает. но ledstate это логическая переменная., @Nikhil P

Есть ли другой способ, с помощью которого я могу отправить смс клапан регулировки уровня в баке??, @Nikhil P

if (textMessage.indexOf("Tanklvl") >= 0) <--- смс отправляется ТОЛЬКО если выполняется это условие. Вы сначала проверили, сработало ли это?, @Mitu Raj

Да, я проверил это условие., @Nikhil P

String msg = "TANK IS" + String(TKLVL) <-- это сработало?, @Mitu Raj

Шаг за шагом: отправьте жестко заданную строку в SMS. Если SMS в порядке-> проблема возникла из-за того, как вы создаете msg. Если смс неверная->проблема возникла с отправкой. Обратите внимание на одну деталь: кажется, вы не можете отправлять все виды символов в SMS. Я сделал Android-приложение для обмена SMS, и мне пришлось избегать некоторых символов, которые были получены как мусор., @Peter


2 ответа


0

TKLVL — целочисленный тип. Преобразуйте его в объект String и добавьте :-

String msg = "TANK IS" + String(TKLVL)

,

1

Использование строк в микроконтроллере запрещено. Сначала попробуйте отправить тестовое SMS, чтобы убедиться, что все работает на SIM800-Arduino и т. д.

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

byte sizeOfBuffer = 10;
char smsString[sizeOfBuffer] = {'\0'};

Что мы сделали, так это создали массив smsString из 10 байтов, 9 байтов для данных и 1 байт для нашего специального символа конца строки. Поскольку мы не хотим, чтобы Arduino работал со строками, мы должны сообщить микроконтроллеру, где заканчивается эта строка. Вот что делает '\0'.

Затем измените функцию отправки, чтобы она принимала этот тип данных.

//Функция SEND SMS с массивом символов
void send_SMS_charArray(char *lvlmsg, byte sizeOfsms)
{
  SIM900.print("AT+CMGF=1\r");
  delay(1000);
  SIM900.println("AT+CMGS=\"+918237504767\"\r");
  delay(100);
  for (byte i=0; i<sizeof(sizeOfsms); i++){
    SIM900.print(lvlmsg[i]);
  }
  Serial.println();
  delay(100);
  SIM900.println((char)26);
  delay(1000);
  SIM900.println();
  delay(5000);
}

Наконец, чтобы вызвать новую функцию, вы должны сделать что-то вроде

sprintf_P(smsString, PSTR("TANK IS: %i"), TKLVL);
send_SMS_charArray(smsString, sizeOfBuffer);

Обратите внимание на sprintf_P при использовании статических сообщений, таких как "TANK IS". Это спасет вам жизнь через несколько месяцев.

,