Jump to content
array

contador de energia

Recommended Posts

array

Boa Tarde

Estou a realizar um contador de energia electrica com arduino e o modulo SM5100B-D.

Estou com um pequeno problema que consiste no seguinte: Aquando o modulo gsm envia a mensagem desejava que na sms constasse como exemplo o valor da potencia . Sera necessario converter para valor int ou da para enviar como float.

#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"
#include <EEPROMex.h>
#include <EEPROMvar.h>



//.....................Variáveis para guardar comandos emitidos pelo modulo...
char listacomandos[10][55];
int numerocomando = 0;
boolean comandoencontrado = false;

//.....................SETUP terminado........................................
boolean pronto = false;

//.....................ESTADO FINAL...........................................
boolean erro = false;

//.....................Modulo gsm................
SoftwareSerial cell(2,3); // - Pino 2 ARDUINO == RX Pino 3 ARDUINO == TX.
//............................................................................
//.....................Define o RTC_DS1307....................................
RTC_DS1307 RTC;
//............................................................................
//...................Declaração das variáveis.................................
const int maxAllowedWrites = 20;
const int memBase = 120;
int addressFloat;
int S=0;
int MIN=0;
int H=0;
int D=0;
int Mes=0;
int Uaux;
int Iaux;
int cont=0;
byte value;
const int AnalogPin = A1;
float Umaxarduino = 5;
float Uin = 1023;
float V_sensor, I_instantaneo, A, Vrms, I_eficaz,Aparente;
float Energia, Energial, Potencia, Energia_Total;
float Tensao_eficaz = 230.0;
int P;
int k;
//............................................................................



//............................................................................
void setup()
{
 Serial.begin(9600);
 cell.begin(9600);

 Wire.begin();
 RTC.begin();


 Serial.print("A iniciar modulo GSM");

 cell.print("AT+CFUN=1,1\r"); // 1º Faz o REBOOT do módulo
 colheComandos(); // 2º Colhe os comandos emitidos pelo módulo
 for(int i=0;i<numerocomando;i++) Serial.println(listacomandos[i]);


 Serial.print("OK");
 delay(1000);
 analisaComandos(); // 3º Analisa a informação

 // SMS no modo TEXTO
 cell.print("AT+CMGF=1\r");
 // Telefone do recipiente...
 cell.print("AT+CMGS=\"+351936015412\"\r");
 cell.print("A sua Contagem de Energia via gsm teve inicio agora.\x1A");
 cell.print("AT+CMSS=1\r");


 Serial.println("Mensagem Enviada");
 Serial.println();
  delay(1000);

//.....................Lê o que esta gravado na EEPROM e ==Energia............
double output=0.0;
output=EEPROM.readFloat(addressFloat);
Energia=output;

//............................................................................
//.......................Se o RTC não funciona da erro/atualiza a data e hora.
 if (! RTC.isrunning()) {
   Serial.println("RTC deixou de FUNCIONAR!");
   // Actualiza a data e hora pelo tempo que foi compilado..............................

   RTC.adjust(DateTime(__DATE__, __TIME__));
 }
//............................................................................
}
//----------------------------------------------------------------------------
// Função: analisaComandos()
// Descodifica o eco enviado pelo módulo
//----------------------------------------------------------------------------
void analisaComandos(){

 if(strcmp(listacomandos[0],"+SIND: 0")==0){
   Serial.print("Erro no SIM ");
   for(;;
 } else if (strcmp(listacomandos[0],"+SIND: 1")==0){
   Serial.print("  Cartao SIM... OK   ");
 } else {
   Serial.print("   Erro no Modulo ");
   for(; ;
 }
 delay(1000);

 if (strcmp(listacomandos[numerocomando-1],"+SIND: 4")==0){
   Serial.print("- Inicializado - ");
 } else {
   Serial.print("  Erro: Reinicie ");
   for(; ;
 }
 delay(1000);
}
//----------------------------------------------------------------------------
// Função: colheComandos()
// Guarda em listacomandos[] o conjunto de ecos emitidos pelo modulo
//----------------------------------------------------------------------------
void colheComandos(){
 static unsigned long watchdog = 0;
 static unsigned long tempoinicial = millis();

 while(watchdog < 30000){ // Previne que o sistema fique em ciclo infinito
   leComando();
   watchdog = millis() - tempoinicial;
  }
}

//----------------------------------------------------------------------------
//Função: leComando()
// Implementa máquina de estados para detectar comando enviado pelo GSM
//----------------------------------------------------------------------------
void leComando(){
 static int i = 0;
 static byte estado = 0;
 static char letra;
 if (cell.available() > 0){
   char letra = cell.read();
//****************************************************************************
// MÁQUINA DE ESTADOS
//****************************************************************************
   if(estado == 0 && letra == 13) estado = 1; // Aguarda pelo linefeed
   else if (estado == 1 && letra == 10) estado = 2; // Detecta inicio do comando
   else if (estado == 2 && letra > 31) estado = 3; // Lê novo comando
   else if (estado == 3 && letra == 13) estado = 4; // Detecta fim do comando
   else if (estado == 4 && letra == 10) estado = 0; // Aguarda novo comando
//****************************************************************************
// LÊ COMANDO
//****************************************************************************
if (estado == 3){
 comandoencontrado = false;
 listacomandos[numerocomando][i] = letra;
 listacomandos[numerocomando][i+1] = '\0';
 i++;
}
else if (estado == 4){

  Serial.print("*"); // Apresenta um "progress bar"
  comandoencontrado = true;
  numerocomando++;
  i=0;
 }
}
}
//----------------------------------------------------------------------------
// Fim: leComando()
//----------------------------------------------------------------------------
void loop() {
  if(cell.available() > 0)
  {
   Serial.print((char)cell.read());
  }
  if(Serial.available() > 0)
  {
  cell.print((char)Serial.read());
  }
//----------------------------------------------------------------------------
// Relógio
//----------------------------------------------------------------------------

 DateTime now = RTC.now();

   Serial.print("Data:");
   Serial.print(now.year(),DEC);
   Serial.print('/');
   Serial.print(now.month(),DEC);
   Serial.print('/');
   Serial.print(now.day(),DEC);
   Serial.print(' ');
   Serial.print("Hora:");
   Serial.print(now.hour(),DEC);
   Serial.print(':');
   Serial.print(now.minute(),DEC);
   Serial.print(':');
   Serial.print(now.second(), DEC);
   Serial.println();

   delay(3000);
//----------------------------------------------------------------------------
// Fim de relógio e mostra serial
//----------------------------------------------------------------------------

  delay(20);
  leitura(); // Função contabiliza a energia
//----------------------------------------------------------------------------
// Grava e envia sms
//----------------------------------------------------------------------------
//.....................Declaração de variáveis para comparação................
  S = now.second(), DEC;
  MIN = now.minute(), DEC;
  H = now.hour(), DEC;
  D = now.day(), DEC;
  Mes = now.month(), DEC;
//............................................................................
//..................... Gravar na EEPROM .....................................
   if(MIN==30 && S==10 )
   {
      if(H==9 || H==13 || H==16 || H==22)
      {
         double input =Energia_Total;
         EEPROM.writeFloat(addressFloat,input);
      }
   }
//............................................................................
//.....................Enviar sms com a contagem..............................

   //if(D==1 && H==10 && MIN==28 && S==0)
   //{


  {

    // SMS no modo TEXTO
    cell.print("AT+CMGF=1\r");
     // Telemovel receptor...
    cell.print("AT+CMGS=\"+351936015412\"\r");
    cell.print(" A sua Contagem de Energia e a seguinte:\x1A"); // Seria aqui que teria que inserir o valor da potencia
    cell.print("AT+CMSS=1\r");
    delay (1000);
    }

//}
//............................................................................
//----------------------------------------------------------------------------
// Fim de Grava e envia sms
//----------------------------------------------------------------------------
}
//----------------------------------------------------------------------------
// Função:leitura()
// contabilização da energia elétrica e mostra o resultado na serial
//----------------------------------------------------------------------------
   void leitura(){
   A=0;
   P=0;
   Iaux=0;

 for (k=0;k<1000;k++) // definição para o numero de amostras
 {
   V_sensor = analogRead(AnalogPin); // leitura da tensao do sensor de corrente

   I_instantaneo =(V_sensor*Umaxarduino/Uin)-2.5;// conversao dos valores da porta analogica para volts, ajuste da tensao continua para 0

   A+=pow(I_instantaneo,2); // soma de todas as amostras.
   Iaux=Iaux+I_instantaneo;
   Uaux=230;  

   delay(1);
 }


 Vrms=sqrt(A/1000); // calculo valor medio quadratico
 I_eficaz=Vrms/0.066; // sensibilidade do sensor
 Aparente=Vrms*I_eficaz;// calculo potencia aparente
 P=(Uaux*Iaux)/1000;// calculo potencia ativa
 //Potencia= I_eficaz*Tensao_eficaz;// calculo da potencia em Watt
 Potencia=1000;
 Energial+= (Potencia/3600)/1000; // calculo e contabilização da energia em KWh
 Energia_Total= Energia + Energial;


}

Edited by thoga31
Tags code + GeSHi

Share this post


Link to post
Share on other sites
siul72

Boas,

Pelo que percebi do codigo envias o SMS em formato de texto, internamente ser'a um char array.

Logo tens de converter o valor quere seja inteiro, float etc... para char array, em C existem funcoes para isso, por exemplo sprintf ....

Cumps

Share this post


Link to post
Share on other sites
array

Boa tarde sera que me poderia dar uma ajuda mais precisa e que por este caminho não estou a conseguir agradecia imenso

Share this post


Link to post
Share on other sites
HappyHippyHippo
#include <stdio.h>

char buffer[32];
float valor = 34.56;
snprintf(buffer,            // local onde gravar a mensagem
        32,                // tamanho do local onde gravar a mensagem (prevenir overflow)
        "um valor : %f\n", // o formato da mensagem
        valor);            // valor a ser inserido no formato da mensagem (neste caso, o primeiro %f que aparece)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
bubulindo

Estes 550 bytes podem vir a dar asneira um dia destes:

char listacomandos[10][55];

Ja experimentaste cell.print(contagem);?


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.