Библиотека SIM900, АТ команды, запрос баланса.

vanila
Offline
Зарегистрирован: 25.08.2015

Есть рабочий код вывода баланса в сериал:

#include "SIM900.h"
#include <SoftwareSerial.h>

int numdata;
char inSerial[40];
int i=0;


#include <Wire.h>//айтуси библиотека
#include <LiquidCrystal_I2C.h>//библиотека экрана
LiquidCrystal_I2C lcd(0x27,16,2);//определяем лсд - адрес, кол-во столбцов, кол-во строк




void setup()
{
  lcd.init();  //вкл экран
lcd.backlight( ); //вкл подсветка
  
     
     //Serial connection.
     Serial.begin(9600);
     Serial.println("GSM Shield testing.");
     //Start configuration of shield with baudrate.
     //For http uses is raccomanded to use 4800 or slower.
     if (gsm.begin(9600)) {
          Serial.println("\nstatus=READY");
          lcd.setCursor(0, 0);
          lcd.print ("OK");
          }
     else {Serial.println("\nstatus=IDLE");
          lcd.setCursor(0, 0);
          lcd.print ("FAIL");     
     }
  delay(2000);
  //Стираем 
  lcd.clear();


     
};


void loop()
{
     //Read for new byte on serial hardware,
     //and write them on NewSoftSerial.
     serialhwread();
     //Read for new byte on NewSoftSerial.
     serialswread();
};

void serialhwread()
{
     i=0;
     if (Serial.available() > 0) {
          while (Serial.available() > 0) {
               inSerial[i]=(Serial.read());
               delay(10);
               i++;
          }

          inSerial[i]='\0';
          if(!strcmp(inSerial,"/END")) {
               Serial.println("_");
               inSerial[0]=0x1a;
               inSerial[1]='\0';
               gsm.SimpleWriteln(inSerial);
          }
          //Send a saved AT command using serial port.
          if(!strcmp(inSerial,"TEST")) {
               Serial.println("BALANCE");
             //   gsm.SimpleWriteln("AT+CSQ");    //СИГНАЛ
            //    gsm.SimpleWriteln("AT+COPS?");  //ОПЕРАТОР
                  gsm.SimpleWriteln(" ATD*105*5#");  //БАЛАНС
          } else {
               Serial.println(inSerial);
               gsm.SimpleWriteln(inSerial);
          }
          inSerial[0]='\0';
     }
}

void serialswread()
{
     gsm.SimpleRead();
}

Который при вводе "TEST" выдает в сериал :

BALANCE

OK

+CUSD: 0,"OCTATOK 406.10 p.",64

Так вот никак не могу понять, как он работает, что и куда нужно вставить чтобы он написал последнюю строчку на экране lcd.

В конечном итоге строчка будет отправляться в смс, но пока хотябы так.

vanila
Offline
Зарегистрирован: 25.08.2015

библиотеку кажись отсюда брал: https://github.com/MarcoMartines/GSM-GPRS-GPS-Shield

 

vanila
Offline
Зарегистрирован: 25.08.2015

Убрал из кода все лишнее:


#include "SIM900.h"
#include <SoftwareSerial.h>

int i=0;

void setup()
{
Serial.begin(9600);
      
}//setup

void loop()
{
  if (i==0) {
     gsm.SimpleWriteln("ATD*105*5#");  //БАЛАНС
     i=300;
            }
    
  gsm.SimpleRead();
}//loop

 

в итоге монитор выдает

OK

+CUSD: 0,"OCTATOK 406.10 p.",64

Внимание вопрос!

Где почитать как эту строку прочитать и  записать в переменную char?

vanila
Offline
Зарегистрирован: 25.08.2015

хз, насколько верно, но работает:

#include "SIM900.h"
#include <SoftwareSerial.h>

int i=0;
String currStr = "";
String balance = "";

#include <Wire.h>//айтуси библиотека
#include <LiquidCrystal_I2C.h>//библиотека экрана
LiquidCrystal_I2C lcd(0x27,16,2);//определяем лсд - адрес, кол-во столбцов, кол-во строк



void setup()
{
lcd.init();  //вкл экран
lcd.backlight( ); //вкл подсветка
Serial.begin(9600);
      
}//setup

void loop()
{
  if (i==0) {
     gsm.SimpleWriteln("ATD*105*5#");  //БАЛАНС
     i++;
  }

if (gsm.available()){
    char simbol = gsm.read();
   //  Serial.write(simbol);
if ('\r' == simbol) {  //если символ перевод каретки
      if  (currStr.startsWith("+CUSD: 0,")) {
        int b = currStr.indexOf('.p');
        balance=currStr.substring(10,b+2); //баланс на сим карте
        Serial.print(balance);
      }
      currStr = "";
    } 

else if ('\n' != simbol) { //если символ НЕ новая строка
      currStr += String(simbol);
    }          

}

         lcd.setCursor(0, 0);
          lcd.print (balance);     
    
 

}//loop