SIM800L - Quando fica sem sinal desejo que o programa siga para a próxima ação

Bom dia amigos!

Sou iniciante em Arduino, logo minha duvida tende a ser banal,

Estou com um problema em monitorar um sistema de liga e desliga luz em uma chácara onde as vezes fico sem sinal de SMS no meu SIM800L e acaba travando o meu sketch na linha do envio de SMS, que queria que mesmo sem sinal ele seguisse para a próxima linha, talvez um TIMEOUT...nao sei, eu pensei em fazer uma condicional que se o arduino testasse o SIM800L e tivesse sinal, ele envia SMS, caso contrario passa para a próxima ação, alguém possui uma solução para isso?

*detalhe: quando tem sinal ele funciona perfeitamente.

Abaixo meu Void loop;

void loop()
{
if (analogRead(pino_sensor)>50)// Se a lampada apagou
{
u8g.firstPage();// mostra na tela
do
{
draw();
}
while ( u8g.nextPage() );
delay(150);
}

if (analogRead(pino_sensor)<50)// Se a lampada ascende
{
Sim800l.sendSms(numero, texto);//envia texto de desligado
Serial.println("SMS Enviado...")
while (analogRead(pino_sensor)<50 )//fica no loop desligado
{
delay(200);
}
Sim800l.sendSms(numero, texto1);//lampada apaga e manda sms de aviso
Serial.println("SMS Enviado...");
}

Exibições: 587

Responder esta

Respostas a este tópico

Dá uma olhada no código fonte da biblioteca : Github - master/Sim800l

No .h você vê o cabeçalho das funções e no .cpp o código fonte em si.


Há uma função que apresenta a qualidade de sinal void Sim800l::signalQuality(). Ela apenas imprime o valor cujo significado é descrito nos comentários no código.

Você pode adaptar esse código para retornar o valor ao invés de apenas imprimi-lo. Feito isto, fazer a condicional em seu Sketch.

João Vitor, 

Muito Obrigado pela informacao, achei na biblioteca conforme voce sugeriu e acho que isso poder ser a solução, estou "apanhando" para saber como fazer essa função retornar o valor ao invés de apenas imprimir...voce saberia como usar essa função e como colocar no Sketch? 

Fiz um curso de Arduino básico no SENAI e nao entramos nesse nível...estou arriscando de curioso mesmo para um projeto pessoal.

Obrigado mais uma vez!

No arquivo Sim800l.cpp  (LINK), na linha 121 ele imprime o valor. Esse valor que veio como resposta do comando dado na linha anterior.

A linha 122 contém um _readSerial(), função declarada na linha 50, que retorna a resposta em String. Porém apenas imprime o valor já que está dentro de um print.

Você pode fazer o seguinte:

String Sim800l::signalQuality()
{
    SIM.print (F("AT+CSQ\r\n")); //Requisita o nível de sinal

    String r = _readSerial(); //Resposta do nivel do sinal
    Serial.println(r); //Printa o valor

    return r;  //Retorna o valor
}

OBS.: Como o cabeçalho da função foi alterada, você precisa fazer a mesma modificação no .h (trocar o void para Sring).



Pronto. Agora você pode chamar a função no seu Sketch, por exemplo:

String nivelSinal = Sim800l.signalQuality();

Agora basta tratar o valor e fazer as devidas condicionais.  Nos comentários da linha 107 a 119 explica o que significa os valores retornados.

Joao Vitor,

Vou testar hoje de noite e te aviso, já agradeço imensamente de antemão e não tinha ideia de como seria útil esse forum do Laboratório Garagem, 

Att,

Realmente nao estou sabendo fazer isso...seria dessa forma?

void setup();

{
Serial.begin(9600);
pinMode(pino_sensor, INPUT);
SIM.begin(9600); // initializate the library.
String Sim800l::signalQuality(){
SIM.print (F("AT+CSQ\r\n")); //Requisita o nível de sinal
String r = _readSerial(); //Resposta do nivel do sinal
Serial.println(r); //Printa o valor
return r; //Retorna o valor
}
}

/////////////////////////////////////////////////////////////////

void loop(void)
{


if (analogRead(pino_sensor)<50)// Se a lampada ascende
{
String nivelSinal = Sim800l.signalQuality();
if ( nivelSinal >10)
{
Sim800l.sendSms(numero, texto);//envia texto de desligado
}
while (analogRead(pino_sensor)<50 )//fica no loop desligado
{
delay(200);
}
Sim800l.sendSms(numero, texto1);//lampada apaga e manda sms de aviso

}

nivelSinal é retornado como uma String.

Você precisa tratar o dado antes de fazer a comparação/operação com valores numéricos. O texto "123" é diferente do número 123. (Caso tenha a curiosidade, veja a tabela ASCII)

Neste caso, pode-se fazer a conversão, se não me engano, usando o toInt().

int nivelSinal = (int)Sim800l.signalQuality().toInt();

Agora sim você pode fazer comparações numéricas. Quanto aos  valores que vão entrar nos seus ifs, aconselho você a ir testando.Por exemplo, ir exibindo na serial o nível de sinal a cada X segundos e avaliar o valor limite em que seu sistema apresenta bom funcionamento. Desta forma, definindo um valor de sinal aceitável como critério para o envio (ou não) do SMS.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço