Найти нужное значение в Serial port и выполнить с ним действие
- Войдите на сайт для отправки комментариев
Пт, 03/04/2020 - 21:59
Всем привет, задача такая:
Имеется 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);
}
В строке 226 ошибка - лишняя точка с запятой.