Projecto de domótica

Projetos na área da eletrónica.
Avatar do Utilizador
diogoc
Equipa Moderadores
Equipa Moderadores
Mensagens: 150
Registado: 31 mai 2018, 14:32
Enviou: 16 vezes
Agradecimento recebido: 108 vezes

23 out 2018, 13:09

Inicialmente tinha projetado incluir no servidor a gateway que recebe as comunicações dos vários módulos.
Como essa solução não funcionou bem optei por fazer a gateway à parte com comunicação por wifi.

Os 3 leds indicam o estado da ligação Wifi, o estado da ligação MQTT, e o estado das comunicações com os módulos.

Caixa:
"Visivel apenas para utilizadores registados"

Imagem

Montagem:
Imagem

Finalizado:
Imagem
Estes utilizadores agradeceram ao autor diogoc pela mensagem:
exhit (13 out 2019, 10:26)
Classificação: 12.5%
Avatar do Utilizador
Bojkas
Newbie Maker
Newbie Maker
Mensagens: 6
Registado: 13 out 2019, 08:00
Enviou: 1 vez
Agradecimento recebido: 0

13 out 2019, 08:24

"Visivel apenas para utilizadores registados" Escreveu: "Visivel apenas para utilizadores registados"
17 set 2018, 16:09
Cada vez mais são instalados nas nossas casas os chamados contadores elétricos inteligentes, .
oi @diogoc , preciso de ajuda por favor. Eu tenho tentado encontrar um código que leia as informações do medidor de eletricidade por muitos dias. você gostaria de compartilhar seu projeto Arduino? Você tem um github ou algo assim? desculpe pelo meu português, eu uso o google translate.
Avatar do Utilizador
diogoc
Equipa Moderadores
Equipa Moderadores
Mensagens: 150
Registado: 31 mai 2018, 14:32
Enviou: 16 vezes
Agradecimento recebido: 108 vezes

13 out 2019, 10:22

Ola @Bojkas,
O seu medidor de eletricidade tem uma porta ótica compativel com o protocolo IEC62056-21 ?
Verifique nas especificações do medidor.
Avatar do Utilizador
Bojkas
Newbie Maker
Newbie Maker
Mensagens: 6
Registado: 13 out 2019, 08:00
Enviou: 1 vez
Agradecimento recebido: 0

13 out 2019, 15:00

ola @diogoc , sim, meu medidor é compatível com iec62056-21. É um logarax, se comunica a 9600 baud e precisa dos mesmos comandos que o seu. <ACK>"000"<CR><LF> and <ACK>050<CR><LF>
Estou procurando uma solução há muitos dias, passei por centenas de sites e dezenas de códigos no Arduino. Infelizmente não sou um programador capaz e preciso de ajuda.

Aqui está um link para o manual, infelizmente em alemão. "Visivel apenas para utilizadores registados"
Avatar do Utilizador
diogoc
Equipa Moderadores
Equipa Moderadores
Mensagens: 150
Registado: 31 mai 2018, 14:32
Enviou: 16 vezes
Agradecimento recebido: 108 vezes

14 out 2019, 10:07

A comunicação é iniciada a 300 bps, 7 bits, parity even, 1 stop bit, através do comando:
/?!<CR><LF>

O medidor responde:
/XXX5YYYYY<CR><LF> (XXX is the manufacturer ID; YYYYY is the meter ID; 5 is the new baudrate = 9600 bps)

Confirma-se com um ack:
<ACK>050<CR><LF>

Altera-se o baudrate para os 9600 e recebe-se as leituras:
C.1(201236731.0(01:39 25-08-18)
1.8.1(0004398506*Wh)
1.8.2(0000000000*Wh)
1.8.3(0008198809*Wh)
1.8.4(0000000000*Wh)
1.8.5(0000000000*Wh)
1.8(0012597315*Wh)
2.8(0000000000*Wh)
!
D


Pelo manual que enviaste a mensagem com as leituras do teu medidor é um pouco diferente do meu, por isso tens que adaptar o código da descodificação.

Código: "Visivel apenas para utilizadores registados"

#include <string.h>

char rcv_msg[190];
long vazio = 0;
long fora_vazio = 0;
long total = 0;


void parse_msg(){
  char *line;
  char *param;
  char *val;
  char *rest;

  vazio = 0;        // reset variables
  fora_vazio = 0;

   /* get the first line */
   line = strtok_r(rcv_msg, "\r\n", &rest);
   
   /* walk through other lines */
   while( line != NULL ) {
    Serial.println(line);
    
    param = strtok_r(line, "(", &line);
    
    if(strcmp (param,"1.8.1") == 0){
      val = strtok_r(line, "*", &line);
      vazio = atol(val);
    }else if(strcmp (param,"1.8.3") == 0){
      val = strtok_r(line, "*", &line);
      fora_vazio = atol(val);
    }else if(strcmp (param,"1.8") == 0){
      val = strtok_r(line, "*", &line);
      total = atol(val);
    }
    
      line = strtok_r(NULL, "\r\n", &rest);
   }
}


bool read_meter(){
  unsigned long rxindex = 0;
  unsigned long starttime = 0;
  byte r=0;
  bool fim = false;

  mySerial.begin(300, CSERIAL_7E1);
  mySerial.write("/?!\r\n");

  starttime = millis();

  while(r != '\n'){    			// loop until EOL received or timeout
    if(millis()-starttime > MeterTimeout){  // handle rx timeout
      mySerial.end();
      return false;
    }

    while(mySerial.available()>0) {   // handle incoming data
      r = mySerial.read();            // receive byte
      rcv_msg[rxindex] = r;
      rxindex++; 
      starttime = millis();           //Refresh timeout after a char has been recieved
    }
  }

  mySerial.write(0x06);
  mySerial.write("050\r\n");

  mySerial.flush();
  mySerial.end();
  mySerial.begin(9600, CSERIAL_7E1);

  starttime = millis();
  rxindex = 0;

  while(fim == false){    // loop until '!' received or timeout
    if(millis()-starttime > MeterTimeout){  // handle rx timeout
      mySerial.end();
      return false;
    }

    while(mySerial.available()>0) {   // handle incoming data
      r = mySerial.read();            // receive byte

      if((r != '!') && (fim == false)){
        rcv_msg[rxindex] = r;
        rxindex++; 
        starttime = millis();           //Refresh timeout after a char has been recieved
      }else{
        fim = true;
      }
    }
  }

  mySerial.end();

  return true;
}


void loop(){
	if(read_meter() == true){
	  Serial.println(F("Recebida contagem"));

	  parse_msg();
	  
	  if((vazio != 0) && (fora_vazio != 0)){
		Serial.print(F("Vazio: "));
		Serial.println(vazio);
		
		Serial.print(F("Fora vazio: "));
		Serial.println(fora_vazio);
	   
		Serial.print(F("Total: "));
		Serial.println(total);
	  }else{
	   Serial.println(F("Erro de leitura"));
	  }
	}else{
	  Serial.println(F("Erro de comunicacao"));
	}
}
Avatar do Utilizador
Bojkas
Newbie Maker
Newbie Maker
Mensagens: 6
Registado: 13 out 2019, 08:00
Enviou: 1 vez
Agradecimento recebido: 0

14 out 2019, 10:20

Olá, obrigado pela sua resposta. eu sou iniciante onde defino os diodos IR RX e TX? posso simplesmente conectar o Arduino e esses diodos?
"Visivel apenas para utilizadores registados"

Eu tenho NodeMcu 0.9 e Wemos D1 R2 com wifi. Tentando compilar o código, mas ele relata um erro.

Código: "Visivel apenas para utilizadores registados"

Volby pro sestavení se změnily; sestavuji vše znovu 
C:\Users\bojkas\Documents\Arduino\opticka_ctecka_portugal\opticka_ctecka_portugal.ino: In function 'bool read_meter()':

opticka_ctecka_portugal:49:3: error: 'mySerial' was not declared in this scope

   mySerial.begin(300, CSERIAL_7E1);

   ^

opticka_ctecka_portugal:49:23: error: 'CSERIAL_7E1' was not declared in this scope

   mySerial.begin(300, CSERIAL_7E1);

                       ^

opticka_ctecka_portugal:55:29: error: 'MeterTimeout' was not declared in this scope

     if(millis()-starttime > MeterTimeout){  // handle rx timeout

                             ^

opticka_ctecka_portugal:79:29: error: 'MeterTimeout' was not declared in this scope

     if(millis()-starttime > MeterTimeout){  // handle rx timeout

                             ^

exit status 1
'mySerial' was not declared in this scope
EDIT:
Tentei definir softwareserial no NodeMCU nos pinos tx e rx. A compilação ocorreu, mas novamente outro problema.
#include "SoftwareSerial.h"
SoftwareSerial mySerial(3, 1); // RX, TX

Código: "Visivel apenas para utilizadores registados"

C:\Users\bojkas\Documents\Arduino\opticka_ctecka_portugal\opticka_ctecka_portugal.ino: In function 'bool read_meter()':

opticka_ctecka_portugal:51:23: error: 'CSERIAL_7E1' was not declared in this scope

   mySerial.begin(300, CSERIAL_7E1);

                       ^

opticka_ctecka_portugal:57:29: error: 'MeterTimeout' was not declared in this scope

     if(millis()-starttime > MeterTimeout){  // handle rx timeout

                             ^

opticka_ctecka_portugal:81:29: error: 'MeterTimeout' was not declared in this scope

     if(millis()-starttime > MeterTimeout){  // handle rx timeout

                             ^

exit status 1
'CSERIAL_7E1' was not declared in this scope
Avatar do Utilizador
diogoc
Equipa Moderadores
Equipa Moderadores
Mensagens: 150
Registado: 31 mai 2018, 14:32
Enviou: 16 vezes
Agradecimento recebido: 108 vezes

14 out 2019, 11:14

Aqui está o esquema dos diodos
Imagem

Substitui todos os mySerial por Serial

A seguir ao #include adiciona:

Código: "Visivel apenas para utilizadores registados"

#define  MeterTimeout 2000  // timeout in ms
Assim já deverá compilar. Esse código foi simplificado em relação ao que uso, por isso não o compilei.
Avatar do Utilizador
Bojkas
Newbie Maker
Newbie Maker
Mensagens: 6
Registado: 13 out 2019, 08:00
Enviou: 1 vez
Agradecimento recebido: 0

14 out 2019, 11:24

@diogoc Ainda tenho um problema, vejo mais um segundo erro. Sinto muito, sou muito amador, mas adoraria conectar o medidor ao Home Assistant. Eu olho para o esquema e não sou muito sábio. Você tem o circuito com os próprios diodos, já existem alguns circuitos nos meus diodos. Poderia funcionar?
Avatar do Utilizador
diogoc
Equipa Moderadores
Equipa Moderadores
Mensagens: 150
Registado: 31 mai 2018, 14:32
Enviou: 16 vezes
Agradecimento recebido: 108 vezes

14 out 2019, 12:07

Os circuitos que mostrou do aliexpress, o transmissor serve.
O receptor é para sinais de 38kHz como os comandos remotos, não deve funcionar neste caso.
Avatar do Utilizador
Bojkas
Newbie Maker
Newbie Maker
Mensagens: 6
Registado: 13 out 2019, 08:00
Enviou: 1 vez
Agradecimento recebido: 0

14 out 2019, 12:42

Eu já vi o uso disso também. "Visivel apenas para utilizadores registados"
Responder