Найти нужное значение в Serial port и выполнить с ним действие

Meteoros
Offline
Зарегистрирован: 01.06.2018

Всем привет, задача такая:

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

 gsm.SimpleWriteln("AT+CSQ"); но как правильно это реализовать? точнее в порт вываливается информация со значением, такого формата: +CSQ: 23,0. Мне нужно забрать значение 23  и дальше его сравниваться. Никак не пойму как его поймать в порте. Что почитать или может пример есть у кого, все это хочу прикрутить к коду (код не ругайте,только учусь)

#include "SIM900.h"
#include <SoftwareSerial.h>
#include <EEPROM.h>
#include "sms.h"
#include "call.h"
SMSGSM sms;
CallGSM call;

//=================Пины 2 и 3 для Подключения GSM модуля


int flag1=0;
int flag_dvig=0;
boolean started=false;
char smsbuffer[160];
char n[20];
String n1 = "+7хххххххх";
String input_string = "";
String smsContent = "";
char PowerON[] = "Signalka  vkluchena!";
char PowerOFF[] = "Snyato s ohrani";
char v[] ="Ya v seti";
char koncevik1[] ="Otkrita dver #1";
char koncevik2[] ="Otkrita dver #2";
char dvigenie[] ="dvigenie v komnate";
char CameraON[] = "Camera ON";
char CameraOFF[] = "Camera OFF";
char SirenaON[] = "SirenaON";
char SirenaOFF[] = "SirenaOFF";
char ok[] ="Vse OK)!";
char pos;
char sendsms[160];

//Таймер сброса  от зависания
unsigned long rst_time = (long)60*60*1000; //раз в час сброс
unsigned long rst_timer;

//Таймер сброса  от зависания
unsigned long cam_time = (long)120*1000; //раз в час сброс
unsigned long cam_timer;

//подключаем заголовочный файл библиотеки EEPROM
  uint8_t counter; //Здесь будем хранить счетчик,uint8_t - тип данных, занимающий 1 байт,и хранящий значение от 0 до 255
  
void setup() {
  
 //Установки для счетчика
    counter = EEPROM.read(0);//Читаем счетчик из EEPROM:
       counter++;  // увеличиваем его на единицу
            EEPROM.write(0, counter);//Записываем значение счетчика
            
// "сбросить" таймер Ресет+Сеть
 rst_timer = millis();
  cam_timer = millis();
 
   //Пин вход
  pinMode(4, INPUT); // Концевик №1
  pinMode(5, INPUT); // Концевик №2
  pinMode(6, INPUT); // Датчик движения
 
   //Пин выход
  pinMode(7, OUTPUT); // Камера
  pinMode(8, OUTPUT); // Сирена
  pinMode(11, OUTPUT); // RST Sim800l
  
    //Выкл пины
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH);
  
  delay(2000); // Ждем 2с
  pinMode(12, OUTPUT); // rst Arduino
  digitalWrite(11, HIGH);

  
  Serial.begin(9600);
  
//Выводим счетчик в порт:
  Serial.print("It's reset #");
  Serial.println(counter, DEC);
  delay(1000); // Ждем 2с

  
  if (gsm.begin(4800)) {
    Serial.println("\nstatus=READY");
      started=true;
        n1.toCharArray(n,20);
         Serial.print("220v ON");
          sms.DeleteSMS(1);memset(n,0,20);
          char smsbuffer[160]="";
             } else Serial.println("\nstatus=IDLE");        
     }
  
void loop() {

   // Таймер камеры
    if (flag1==1  || flag1==3){
      if (millis() - cam_timer >= cam_time) {
        Serial.print("CameraOFF");
          digitalWrite(7, LOW); //выключаем sim800l
             delay(1000); // Ждем 1 секунд
               flag1++;
                cam_timer = millis();
   } 
 }

 // Раз в день перезагрузка модема
 if (millis() - rst_timer >= rst_time) {
     Serial.print("RST");
      digitalWrite(12, LOW); //выключаем sim800l
         delay(1000); // Ждем 1 секунд
              rst_timer = millis();
     
 }
  
// Раз в неделю отпраляем смс, что все ок
  if (counter>5 && digitalRead(4)==LOW && digitalRead(5)==LOW && digitalRead(6)==LOW) { 
     n1.toCharArray(n,20);
      sms.SendSMS(n, ok); //смс ОК
      Serial.print("vse OK");
        sms.DeleteSMS(1);memset(n,0,20);
          char smsbuffer[160]="";
            delay(1000*5); // Ждем 5 секунд
             counter=0;
              EEPROM.write(0, counter);
     
 }
 
//Открытие двери №1
  if ((digitalRead(6)==HIGH) && (flag1==0 || flag1==2)){ //Если открыта первая дверь и переменная равна нулю
    digitalWrite(7, HIGH); //Включаем камеру
     n1.toCharArray(n,20);
      sms.SendSMS(n, koncevik1); //Отправляем смс, что открыта первая дверь 
      Serial.print("koncevik1");
        sms.DeleteSMS(1);memset(n,0,20);
          char smsbuffer[160]="";
           delay(1000); // Ждем 1с
             flag1++;
             flag_dvig=1;
              
  }
  
//Открытие двери №2
  if ((digitalRead(5)==HIGH) && (flag1==0 || flag1==2)){ //Если открыта вторая дверь после первой или кто-то отрыл дверь войдя в окно
   digitalWrite(7, HIGH); //Включаем камеру
    n1.toCharArray(n,20);
      sms.SendSMS(n, koncevik2);            // Отправляем смс, что открыта вторая дверь 
      Serial.print("koncevik2");
        sms.DeleteSMS(1);memset(n,0,20);
          char smsbuffer[160]="";
            delay(1000); // Ждем 120 секунд
             flag1++;
             flag_dvig=1;
               
 }

 //Срабатывание датчика движения
  if (digitalRead(4)==HIGH && flag_dvig==1) { //Если открыт одан из дверей
    n1.toCharArray(n,20);
      sms.SendSMS(n, dvigenie);            // Посылаем СМС о том, что движение в комнате
      Serial.print("dvigenie");
        sms.DeleteSMS(1);memset(n,0,20);
           delay(1000); // Ждем 1 с
             flag_dvig=2;
               
 }
pos = sms.IsSMSPresent(SMS_UNREAD); // смотрим непрочитанные СМС
      if (pos) {                    // Если непрочитанные СМС есть, то...
        
getsms(); // получаем непрочитанную СМС  


// Команда "0" - снять с охраны
     if (input_string=="0"){
       flag1=4;
        Serial.print("Snyato s ohrani!");
         n1.toCharArray(n,20);
          sms.SendSMS(n, PowerOFF); 
            sms.DeleteSMS(1);memset(n,0,20); 
              input_string=""; 
                char smsbuffer[160]=""; 
                 
 }
// Команда "1" - Поставить на охрану     
     if (input_string=="1"){
      flag1=0;
        Serial.print("Postanovka na ohranu!");
          n1.toCharArray(n,20); 
            sms.SendSMS(n, PowerON); 
              sms.DeleteSMS(1);
                memset(n,0,20); 
                  input_string=""; 
                    char smsbuffer[160]="";
}
        
 // Команда "2" - вкл камеру на 2 минуты    
     if (input_string=="2"){
      flag1=1;
      digitalWrite(7, HIGH); //Включаем камеру
       Serial.print("camera on");
          n1.toCharArray(n,20); 
            sms.SendSMS(n, CameraON); 
             delay(1000); // Ждем 1c
                sms.DeleteSMS(1);
                  memset(n,0,20); 
                   input_string=""; 
                    char smsbuffer[160]="";
}
// Команда "3" - вкл сирену на 2 минуты    
     if (input_string=="3"){
      digitalWrite(8, HIGH); //Включаем Сирену
       Serial.print("Sirena on");
          n1.toCharArray(n,20); 
            sms.SendSMS(n, SirenaON); 
             delay(1000*30); // Ждем 30 секунд
               digitalWrite(8, LOW); //Выключаем камеру
                sms.SendSMS(n, SirenaOFF);
                 sms.DeleteSMS(1);
                  memset(n,0,20); 
                   input_string=""; 
                    char smsbuffer[160]="";
}
// Команда "4" - Звонок    
     if (input_string=="4"){
       if(call.CallStatus()!=CALL_ACTIVE_VOICE);{
        Serial.print("звонок");
          call.Call(n);
}
    
}
   
sms.DeleteSMS(pos); // удаляем СМС  из симки
}

delay(1000); // Ждем 1 секунд

}

void getsms()
{
sms.GetSMS(1,n,20,smsbuffer,160);
input_string =String(smsbuffer);
          }

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

В строке 226 ошибка - лишняя точка с запятой.