Boa noite garagistas, estou com uma placa SIM900 controlando acionamento de um pivo central, esta dando erro ao compilar o codigo alguem pode me ajudar ?

o erro é o seguinte >> 

  • ACIONAMENTO_PIVO.ino: In function 'void menus()': ACIONAMENTO_PIVO:138: error: invalid use of void expression

o codigo é o seguinte >>

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


#define sensor 8 //PORTA DIGITAL PARA ACS712
#define botao 6 //PORTA DIGITAL PARA O BOTAO DO MENU
#define porta 7
#define start 9

SMSGSM sms;

boolean started=false;
char smsbuffer[160];
//char n[20];
//int inc=10;


int menu = 0; //VARIAVEL PARA CONTROLE DAS TELAS DO MENU
char number[]="+5516981002339"; //NUMERO DO TELEFONE

//Variáveis utilizadas para o cálculo do valor eficaz da corrente em AC
float valorSensor_aux = 0;
float valorSensor = 0;
float valorCorrente = 0;
float voltsporUnidade = 0.0048828125;
float s_valorCorrente = 0.0;
int status = 1;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//======================================================================

void setup(){

Serial.begin(9600);
lcd.begin(16, 2);

pinMode(porta, OUTPUT);
pinMode(start, OUTPUT);
pinMode(sensor, OUTPUT);
pinMode(botao, INPUT);

digitalWrite(sensor, HIGH);
digitalWrite(botao, HIGH);
//Mantem Modulo GSM desligado assim que iniciar o programa
digitalWrite(start, HIGH);
delay(1000); //tempo de 1 segundo para ligar o modulo GSM
digitalWrite(start, LOW);

lcd.clear();
lcd.setCursor(0,0);
lcd.print("FAZ STA BARBARA");
lcd.setCursor(0,1);
lcd.print(" INICIANDO... ");
delay(10000);
lcd.clear();

//Start configuration of shield with baudrate.
if (gsm.begin(9600)){
Serial.println("\nstatus=READY");
if (sms.SendSMS(number, "SISTEMA REINICIALIZANDO"))
started=true;
}
else
Serial.println("\nstatus=IDLE");
if(started){
delsms();
}

}

void loop() {

ajusteSensor(); //CHAMA FUNCAO PARA CALCULO DA CORRENTE
checaStatus(); // CHAMA FUNCAO PARA CHECAR STATUS DO PIVO
respondeSMS(); //CHAMA FUNCAO PARA RESPONDER SMS
menus(); //CHAMA FUNCAO DE MENU


}

void menus(){

if (menu == 0) {

lcd.setCursor(0,0);
lcd.print("FAZ STA BARBARA");
lcd.setCursor(0,1);
if(valorCorrente >= 0.22){
lcd.print(" LIGADO ");
}
if(valorCorrente < 0.22){
lcd.print(" DESLIGADO ");
}
if (digitalRead(botao) == LOW){
delay(250);
lcd.clear();
menu = 1;
}
}

if (menu == 1) {

lcd.setCursor(0,0);
lcd.print("STATUS CORRENTE");
lcd.setCursor(0,1);
lcd.print("VALOR:");
lcd.setCursor(6,1);
lcd.print(valorCorrente);
if (digitalRead(botao) == LOW){
delay(250);
lcd.clear();
menu = 2;
}
}

if (menu == 2) {

lcd.setCursor(0,0);
lcd.print("N. CELULAR");
lcd.setCursor(0,1);
lcd.print(number);
if (digitalRead(botao) == LOW){
delay(250);
lcd.clear();
menu = 3;
}
}

if (menu == 3) {

lcd.setCursor(0,0);
lcd.print("NIVEL DO SINAL");
lcd.setCursor(0,1);
lcd.print(gsm.SimpleWrite("AT+CSQ"));  < dando erro aqui
if (digitalRead(botao) == LOW){
delay(250);
lcd.clear();
menu = 0;
}
}

}

void checaStatus(){

if(valorCorrente >= 0.22){ //AQUI ELE CHECA SE ESTA LIGADO, SE ESTIVER ELE ENTRA
if(status == 0){ // SE status FOR IGUAL A ZERO, QUER DIZER QUE HOUVE MUDANÇA DE ESTADO
sms.SendSMS(number, "STATUS: PIVO LIGADO"); //ENVIA O SMS AVISANDO
status = 1; //MUDA O status PARA 1, ASSIM ELE NÃO VAI FICAR ENVIANDO MENSAGENS TODA HORA
s_valorCorrente = valorCorrente; //PEGA O VALOR DA CORRENTE
}
}else{ //OS ITENS ABAIXO É O MESMO DE CIMA MAS PARA O ESTADO DE DESLIGADO
if(status == 0){
sms.SendSMS(number, "STATUS: PIVO DESLIGADO");
status = 1;
s_valorCorrente = valorCorrente;
}
}

if (s_valorCorrente < 0.22 && valorCorrente >= 0.22){ //ESSE IF CHECA SE FOI ALTERADO O VALOR DA CORRENTE DESDE A ULTIMA VEZ QUE ELE VALIDOU
status = 0; //SE O ESTADO ESTIVER MUDADO, VOLTA A VARIAVEL status PARA ZERO PARA SER INFORMADO POR SMS O NOVO ESTADO
}else{
if (s_valorCorrente >= 0.22 && valorCorrente < 0.22){
status = 0;
}
}

}

void respondeSMS(){
int pos=0;
if(started){
pos=sms.IsSMSPresent(SMS_ALL);
if(pos){
Serial.println("IsSMSPresent at pos ");
Serial.println(pos);
sms.GetSMS(pos,n,smsbuffer,100);
Serial.println(n);
Serial.println(smsbuffer);
if(!strcmp(smsbuffer,"D")){
Serial.println("BLOQUEADO");
digitalWrite(porta,LOW);
ajusteSensor();
if(valorCorrente < 0.22){
sms.SendSMS(number, "PIVO DESLIGADO");
}
delay(100);
Serial.println("\nSMS sent OK");
}
if(!strcmp(smsbuffer,"L")){
Serial.println("LIBERADO");
digitalWrite(porta,HIGH);
if(valorCorrente >= 0.22){
sms.SendSMS(number, "PIVO ACIONADO");
}
delay(100);
Serial.println("\nSMS sent OK");
}
if(!strcmp(smsbuffer,"S")){ //SE FOR ENVIADO A LETRA "S" ELE INFORMA O STATUS ATUAL DO PIVO
Serial.println("STATUS");
if(valorCorrente >= 0.22){
sms.SendSMS(number, "PIVO FUNCIONANDO NORMALMENTE");
}
if(valorCorrente < 0.22){
sms.SendSMS(number, "PIVO SE ENCONTRA DESLIGADO");
}
delay(100);
Serial.println("\nSMS sent OK");
}
delsms();
}
}
}

void delsms(){
Serial.println("delsms");
for (int i=0; i<10; i++){ //do it max 10 times
int pos=sms.IsSMSPresent(SMS_ALL);
if (pos!=0){
Serial.print("\nFind SMS at the pos ");
Serial.println(pos);
if (sms.DeleteSMS(pos)==1){
Serial.print("\nDeleted SMS at the pos ");
Serial.println(pos);
}
else{
Serial.print("\nCant del SMS at the pos ");
Serial.println(pos);
}
}
}
}

void ajusteSensor(){ //Função para o cálculo do valor eficaz da corrente aferida

for(int i=500; i>0; i--){
valorSensor_aux = (analogRead(A0) - 511); // Faz a leitura do sensor e subtrai 511 (511 = sem corrente no circuito = 0A)
valorSensor += pow(valorSensor_aux,2); // Soma os quadradosos das leituras no laço
}
valorSensor = (sqrt(valorSensor/ 500)) * voltsporUnidade; // Tira a raiz quadrada da média da somatória dos valores aferidos
valorCorrente = (valorSensor/66)*1000; // Calcula a corrente considerando a sensibilida do sensor para 60mV/A

}

Exibições: 915

Responder esta

Respostas a este tópico

Bom dia,

Você esta tentando mostrar o valor de RSSI, este valor terá que ser guardado em uma variável antes de mostrar no LCD.

"Acredito que seja isto "

Não tenho uma placa para testar...

O outro erro é que as variáveis char n[20] e  int inc=10; estão comentadas.... //char n[20]; //int inc = 10;


Abs

Como guardo em uma variavel pode me dar um exemplo ?

Tentei de tudo aqui meu modulo SIM900 parece que não reage a comandos AT...

quais variaveis que estão comentadas ?

Concertei as variaveis somente o valor de RSSI que não estou dando conta de fazer mostrar de maneira alguma pode me ajudar ?

Olá,

O comando AT+CSQ (Signal Quality Report) funciona da seguinte maneira: ao se enviar AT+CSQ, seu modem responde os parâmetros <rssi>, que correspondem da seguinte maneira:

  • 0          -115 dBm ou menos
  • 1          -111 dBm
  • 2...30   -110...-54 dBm
  • 31        -52 dBm ou maior
  • 99         não detectou sinal

Portanto, depois de enviar o comando corretamente para o sim900 você deverá ler a resposta do sim900, e em seguida tratar a string recebida, retirando o valor desejado do rssi, salvando-o em uma variavel para então enviar ao lcd...  

Segue um sketch que faz a leitura do rssi do sim900 e imprime o mesmo no serial monitor do arduino, estude-o, entenda como é que funciona, pois com certeza deverá ser necessário algumas modificações principalmente na instance da porta serial... dificilmente o nome da porta serial usada no sketch do exemplo ( no caso mySerial ) coincidirá com a que que foi usada no seu sketch, para verificar isso você deverá abrir a library do sim900 e verificar qual o nome usado...

O sketch:

  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(23);
  3.  
  4. // AUX GSM Leitura de dados
  5. String  linhaAtual = "";              
  6. String  db = "";  
  7. boolean lendoDB = false;
  8.  
  9. void setup()
  10. {
  11.   mySerial.begin(19200); // inicia conexao SIM900
  12.   Serial.begin(9600); // inicia conexao PC
  13. }
  14. void loop()
  15. {  
  16.   delay(500); // delay de envio de dados
  17.   mySerial.println("AT+CSQ"); // envia comando ao SIM900
  18.   while(mySerial.available()>0) // se existem dados na porta serial
  19.   {
  20.     char dados = mySerial.read(); // variavel dados recebe informacoes
  21.     linhaAtual += dados; // variavel linha recebe dados
  22.     if (dados == '\n') // se tiver um ENTER em dados
  23.     {
  24.       linhaAtual = ""; // apaga dados da linha
  25.     }
  26.     if (linhaAtual.endsWith(" ")) // se a linha terminar com espaco em branco
  27.     {
  28.       lendoDB = true; // estamos lendo dados
  29.       db = ""; // limpo variavel que vai receber dados em DB
  30.     }
  31.     if (lendoDB) // se estamos lendo os dados
  32.     {
  33.       if (dados != ',') // faz leitura ate encontrar virgula
  34.       {
  35.         db += dados; // adiciona info a variavel db
  36.       }
  37.       else // se nao estamos lendo
  38.       {
  39.         lendoDB = false; // sem leitura
  40.         Serial.println(db); // enviamos os dados para o computador pela porta serial
  41.       }
  42.     }
  43.   }
  44. }

fonte: http://microembarcado.blogspot.com.br/2013/11/sim900-labview-fazend...

Espero que isto possa lhe ajudar a conseguir ver a indicação do sinal no seu display lcd.

Abraço.

Sabia que não ia me abandonar Wiechert =P

estou com problemas, quando compilo esse codigo sozinho para testar funciona normalmente substituindo a mySerial de 19200 para 9600. Porem implementei esse codigo ao meu, compilou certinho mas não esta aparecendo nada creio que é na instance da porta serial como faço pra descobrir a porta que estou usando ?

segue o codigo implementado está correto ?

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


#define sensor 8 //PORTA DIGITAL PARA ACS712
#define botao 6 //PORTA DIGITAL PARA O BOTAO DO MENU
#define porta 7
#define start 9
SoftwareSerial mySerial(2, 3);
SMSGSM sms;
String linhaAtual = "";
String db = "";
boolean lendoDB = false;
boolean started=false;
char smsbuffer[160];
char n[20];
int inc=10;


int menu = 0; //VARIAVEL PARA CONTROLE DAS TELAS DO MENU
char number[]="+5516981002339"; //NUMERO DO TELEFONE

//Variáveis utilizadas para o cálculo do valor eficaz da corrente em AC
float valorSensor_aux = 0;
float valorSensor = 0;
float valorCorrente = 0;
float voltsporUnidade = 0.0048828125;
float s_valorCorrente = 0.0;
int status = 1;

LiquidCrystal lcd(12, 11, 5, 4, 10, 8);

//======================================================================

void setup(){
mySerial.begin(9600); // inicia conexao SIM900
Serial.begin(9600);
lcd.begin(16, 2);

pinMode(porta, OUTPUT);
pinMode(start, OUTPUT);
pinMode(sensor, OUTPUT);
pinMode(botao, INPUT);

digitalWrite(sensor, HIGH);
digitalWrite(botao, HIGH);
//Mantem Modulo GSM desligado assim que iniciar o programa
digitalWrite(start, HIGH);
delay(1000); //tempo de 1 segundo para ligar o modulo GSM
digitalWrite(start, LOW);

lcd.clear();
lcd.setCursor(0,0);
lcd.print("FAZ STA BARBARA");
lcd.setCursor(0,1);
lcd.print(" INICIANDO... ");
delay(10000);
lcd.clear();

//Start configuration of shield with baudrate.
if (gsm.begin(9600)){
Serial.println("\nstatus=READY");
if (sms.SendSMS(number, "PICO DE ENERGIA - SISTEMA REINICIALIZANDO.."))
started=true;
}
else
Serial.println("\nstatus=IDLE");
if(started){
delsms();
}

}

void loop() {

ajusteSensor(); //CHAMA FUNCAO PARA CALCULO DA CORRENTE
checaStatus(); // CHAMA FUNCAO PARA CHECAR STATUS DO PIVO
respondeSMS(); //CHAMA FUNCAO PARA RESPONDER SMS
menus(); //CHAMA FUNCAO DE MENU
sinal(); //CHAMA FUNÇAO SINAL


}
void sinal()
{
delay(500); // delay de envio de dados
mySerial.println("AT+CSQ"); // envia comando ao SIM900
while(mySerial.available()>0) // se existem dados na porta serial
{
char dados = mySerial.read(); // variavel dados recebe informacoes
linhaAtual += dados; // variavel linha recebe dados
if (dados == '\n') // se tiver um ENTER em dados
{
linhaAtual = ""; // apaga dados da linha
}
if (linhaAtual.endsWith(" ")) // se a linha terminar com espaco em branco
{
lendoDB = true; // estamos lendo dados
db = ""; // limpo variavel que vai receber dados em DB
}
if (lendoDB) // se estamos lendo os dados
{
if (dados != ',') // faz leitura ate encontrar virgula
{
db += dados; // adiciona info a variavel db
}
else // se nao estamos lendo
{
lendoDB = false; // sem leitura

}
}
}
}
void menus(){

if (menu == 0) {

lcd.setCursor(0,0);
lcd.print("FAZ STA BARBARA");
lcd.setCursor(0,1);
if(valorCorrente >= 0.22){
lcd.print("PIVO LIGADO");
}
if(valorCorrente < 0.22){
lcd.print("PIVO DESLIGADO");
}
if (digitalRead(botao) == LOW){
delay(250);
lcd.clear();
menu = 1;
}
}

if (menu == 1) {

lcd.setCursor(0,0);
lcd.print("STATUS CORRENTE");
lcd.setCursor(0,1);
lcd.print("VALOR:");
lcd.setCursor(6,1);
lcd.print(valorCorrente);
if (digitalRead(botao) == LOW){
delay(250);
lcd.clear();
menu = 2;
}
}

if (menu == 2) {

lcd.setCursor(0,0);
lcd.print("N. CELULAR");
lcd.setCursor(0,1);
lcd.print(number);
if (digitalRead(botao) == LOW){
delay(250);
lcd.clear();
menu = 3;
}
}

if (menu == 3) {

lcd.setCursor(0,0);
lcd.print("NIVEL DO SINAL");
lcd.setCursor(0,1);
lcd.print(db);
if (digitalRead(botao) == LOW){
delay(250);
lcd.clear();
menu = 0;
}
}

}

void checaStatus(){

if(valorCorrente >= 0.22){ //AQUI ELE CHECA SE ESTA LIGADO, SE ESTIVER ELE ENTRA
if(status == 0){ // SE status FOR IGUAL A ZERO, QUER DIZER QUE HOUVE MUDANÇA DE ESTADO
sms.SendSMS(number, "STATUS: PIVO LIGADO"); //ENVIA O SMS AVISANDO
status = 1; //MUDA O status PARA 1, ASSIM ELE NÃO VAI FICAR ENVIANDO MENSAGENS TODA HORA
s_valorCorrente = valorCorrente; //PEGA O VALOR DA CORRENTE
}
}else{ //OS ITENS ABAIXO É O MESMO DE CIMA MAS PARA O ESTADO DE DESLIGADO
if(status == 0){
sms.SendSMS(number, "STATUS: PIVO DESLIGADO");
status = 1;
s_valorCorrente = valorCorrente;
}
}

if (s_valorCorrente < 0.22 && valorCorrente >= 0.22){ //ESSE IF CHECA SE FOI ALTERADO O VALOR DA CORRENTE DESDE A ULTIMA VEZ QUE ELE VALIDOU
status = 0; //SE O ESTADO ESTIVER MUDADO, VOLTA A VARIAVEL status PARA ZERO PARA SER INFORMADO POR SMS O NOVO ESTADO
}else{
if (s_valorCorrente >= 0.22 && valorCorrente < 0.22){
status = 0;
}
}

}

void respondeSMS(){
int pos=0;
if(started){
pos=sms.IsSMSPresent(SMS_ALL);
if(pos){
Serial.println("IsSMSPresent at pos ");
Serial.println(pos);
sms.GetSMS(pos,number,smsbuffer,100);
Serial.println(number);
Serial.println(smsbuffer);
if(!strcmp(smsbuffer,"D")){
Serial.println("DESLIGADO");
digitalWrite(porta,LOW);
ajusteSensor();
if(valorCorrente < 0.22){
sms.SendSMS(number, "PIVO DESLIGADO");
}
delay(100);
Serial.println("\nSMS sent OK");
}
if(!strcmp(smsbuffer,"L")){
Serial.println("PIVO ACIONADO");
digitalWrite(porta,HIGH);
if(valorCorrente >= 0.22){
sms.SendSMS(number, "PIVO ACIONADO");
}
delay(100);
Serial.println("\nSMS sent OK");
}
if(!strcmp(smsbuffer,"S")){ //SE FOR ENVIADO A LETRA "S" ELE INFORMA O STATUS ATUAL DO PIVO
Serial.println("STATUS");
if(valorCorrente >= 0.22){
sms.SendSMS(number, "PIVO FUNCIONANDO NORMALMENTE");
}
if(valorCorrente < 0.22){
sms.SendSMS(number, "PIVO SE ENCONTRA DESLIGADO");
}
delay(100);
Serial.println("\nSMS sent OK");
}
delsms();
}
}
}

void delsms(){
Serial.println("delsms");
for (int i=0; i<10; i++){ //do it max 10 times
int pos=sms.IsSMSPresent(SMS_ALL);
if (pos!=0){
Serial.print("\nFind SMS at the pos ");
Serial.println(pos);
if (sms.DeleteSMS(pos)==1){
Serial.print("\nDeleted SMS at the pos ");
Serial.println(pos);
}
else{
Serial.print("\nCant del SMS at the pos ");
Serial.println(pos);
}
}
}
}

void ajusteSensor(){ //Função para o cálculo do valor eficaz da corrente aferida

for(int i=500; i>0; i--){
valorSensor_aux = (analogRead(A0) - 511); // Faz a leitura do sensor e subtrai 511 (511 = sem corrente no circuito = 0A)
valorSensor += pow(valorSensor_aux,2); // Soma os quadradosos das leituras no laço
}
valorSensor = (sqrt(valorSensor/ 500)) * voltsporUnidade; // Tira a raiz quadrada da média da somatória dos valores aferidos
valorCorrente = (valorSensor/66)*1000; // Calcula a corrente considerando a sensibilida do sensor para 60mV/A

}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço