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...");
}
Tags:
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por