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