Normalmente os agregados familiares têm ligações eléctricas pós-pagas. Do lado do consumidor, as conexões pós-pagas têm a desvantagem de que o consumo de energia elétrica não é monitorado pelos consumidores e muitas vezes eles ficam chocados quando recebem contas altas. A causa de contas altas geralmente não são as altas tarifas de eletricidade, mas o uso excessivo inconsciente de eletricidade. As ligações eléctricas pré-pagas são normalmente sugeridas como a solução viável para este problema. Numa ligação eléctrica pré-paga, o consumidor necessitaria de recarregar a quantidade de electricidade que pretende consumir. Num tal sistema, os contadores de electricidade domésticos precisam de ser equipados com um sistema que possa ser reconhecido pela quantidade recarregada pelo consumidor e possa contar o consumo de electricidade desde a quantidade recarregada até zero. Quando o medidor chegar a zero, a alimentação principal será automaticamente cortada e poderá ser reiniciada somente após a próxima recarga.
Este projeto é uma tentativa de realizar um sistema semelhante. Neste projeto é projetado um circuito que funcionaria como estação de recarga de eletricidade e um circuito adicional que poderia ser integrado aos medidores de energia domésticos regulares e capaz de fazer a contagem regressiva do consumo de energia e cortar o fornecimento principal quando a contagem regressiva do uso de energia chegar a zero. Como alternativa ao cartão inteligente, é utilizado um cartão de memória que armazenará as informações de recarga da estação de recarga e poderá ser conectado ao circuito integrado aos medidores de energia para regulação da alimentação principal.
Fig. 1: Protótipo de estação de recarga de eletricidade pré-paga baseada em Arduino
A estação de recarga também enviará uma mensagem de confirmação para o número de celular cadastrado do consumidor a cada recarga. A estação de recarga e o medidor de energia pré-pago são mostrados conectados entre si via módulo RF no projeto para que o medidor de energia pré-pago possa enviar um alerta de valor de recarga esgotado para a estação de recarga e a estação de recarga possa enviar um SMS ao consumidor para fazer uma recarga logo novamente. Portanto, do ponto de vista do hardware, este sistema elétrico pré-pago consiste nos seguintes dispositivos –
1) Estação de recarga de eletricidade – Um dispositivo embarcado que pode gravar informações de recarga em um sistema de memória. Para simplificar, o sistema de memória utilizado é um chip de memória. Uma versão comercial do sistema realizado aqui pode ter cartões inteligentes para facilitar as recargas de energia elétrica. A estação de recarga também utiliza um módulo GSM/GPRS para enviar uma mensagem de confirmação a cada recarga bem-sucedida e está conectada ao medidor de energia pré-pago via módulo RF para receber alerta sobre o valor de recarga esgotado e a estação pode enviar um SMS para recarregar em breve. Uma versão comercial do sistema pode ter estação de recarga e medidor de energia pré-pago conectados via internet. Infelizmente, atualmente a Internet não está disponível em todos os lugares nem é gratuito fornecer tal recurso em um avatar comercial de tal sistema.
2) Dispositivo inteligente para armazenar a quantidade de recarga – O projeto utiliza um cartão de memória para demonstrar o funcionamento de um dispositivo de recarga inteligente. Uma versão comercial do sistema pode ter cartões inteligentes.
3) Medidor de energia pré-pago – Um dispositivo incorporado que pode ser integrado a medidores domésticos comuns para ler a quantidade de recarga e rastrear o consumo de energia em ordem decrescente até chegar a zero. O dispositivo é capaz de cortar as fontes principais regulando as fontes principais através de um circuito de relé.
No projeto, a estação de recarga de eletricidade é construída no Arduino UNO e o medidor de energia pré-pago é construído em torno do Arduino Mega. O cartão de memória utilizado como alternativa ao cartão de recarga inteligente é o AT2402. O AT2402 é um cartão de memória de 2Kb que se conecta a qualquer microcontrolador na interface I2C. O Arduino IDE é usado para escrever os esboços do Arduino para a estação de recarga e medidor de energia pré-pago e o AVR Dude é utilizado para gravar códigos de programa nas placas do microcontrolador.
Componentes necessários –
Para construir uma estação de recarga, serão necessários os seguintes componentes –
• Arduino UNO
• Módulo GSM
•HT12D
• Módulo RF de 433 KHz
• Teclado de 4 interruptores
• LCD
• Reguladores de tensão 7805/7812.
• Transformador 12-0,2Amp
• Resistores de 1K ohm
• Resistor de 47K ohms
• Diodo IN4007
• 4700uF, capacitor de 25V
• Fio elétrico
• Plugue de dois pinos
O cartão de memória AT2402 é usado como dispositivo de recarga inteligente. Para construir medidores de energia pré-pagos, serão necessários os seguintes componentes –
• Arduino Mega
• LCD
• Codificador – HT12E
• Módulo RF de 433 KHz
• Medidor de energia de 3.200 imp/kwh
• Comparador LM358
• LIDERADO
• Relé 12v
• Transistor BC547
• Diodo IN4007
• Resistores de 1k ohm
• Resistor de 1M ohm
• Carregar para testar
• Bloco terminal
• Fio elétrico
• Plugue de dois pinos
Diagrama de bloco
Fig. 2: Diagrama de blocos da estação de recarga de eletricidade pré-paga baseada em Arduino
Conexões de Circuito
Estação de recarga
A estação de recarga é construída no Arduino UNO. Possui display LCD e teclado de 4 interruptores para interação humana. O cartão de memória que armazena as informações de recarga pode ser conectado à placa Arduino através do protocolo I2C implementado nos pinos A4 e A5 do Arduino. A placa é conectada a um módulo GSM para envio de SMS de confirmação de recargas bem-sucedidas e mensagens de alerta para próxima recarga. A placa tem interface com o circuito receptor de RF para que possa se conectar ao medidor de energia pré-pago e detectar baixo balanço de energia. O circuito que funciona como estação de recarga possui diferentes componentes e módulos conectados à placa Arduino da seguinte maneira –
Display LCD 16X2 – O display LCD é usado para fornecer uma interface para interação humana e exibe mensagens orientando o usuário para recarregar o uso de eletricidade. Ele é conectado à placa Arduino conectando seus pinos de dados aos pinos 3 a 6 da placa Arduino. Os pinos RS e E do LCD estão conectados aos pinos 13 e 12 do Arduino UNO respectivamente. O pino RW do LCD está aterrado.
Fig. 3: Tabela listando conexões de circuito entre Arduino Uno e Character LCD
A biblioteca padrão de código aberto para interface do LCD com o Arduino UNO é usada no projeto. A biblioteca funciona conforme o esperado e não precisa de alterações ou modificações.
Teclado de 4 interruptores – Os interruptores táteis são usados para formar o teclado. Existem quatro interruptores no teclado que estão conectados aos seguintes pinos com determinadas funções atribuídas a eles –
Fig. 4: Tabela listando os pinos do Arduino e suas funções na Estação de Recarga de Eletricidade Pré-paga
Os interruptores são conectados entre o terra e os pinos do Arduino. Os pinos do Arduino por padrão são conectados ao VCC e recebem lógica HIGH. Ao pressionar um botão tátil, o respectivo pino do Arduino entra em curto-circuito para chão
e recebe uma lógica BAIXA.
Módulo GSM – O módulo GSM possui quatro pinos – Tx, Rx, Vcc e GRND. Os pinos Tx e Rx estão conectados aos pinos número 9 e 10 do Arduino UNO, respectivamente. Os pinos 9 e 10 são declarados como porta serial virtual no esboço do Arduino para comunicar dados com o módulo. Os pinos VCC e Terra do módulo são conectados ao pino 5V DC e GRND da placa Arduino UNO. Uma fonte de alimentação externa de 18V é usada para alimentar o módulo GSM.
Receptor RF – O receptor RF é utilizado para receber um alerta de baixo balanço energético dos medidores de energia pré-pagos. O módulo receptor RF possui 8 pinos e a seguinte configuração de pinos –
Fig. 5: Tabela listando a configuração dos pinos do receptor RF
A saída de dados serial do receptor RF é conectada ao pino 16 do IC decodificador HT12D.
IC decodificador HT12D – O sinal que transporta alerta de baixo equilíbrio de energia é detectado pelo receptor RF e passado para o decodificador HT12D. Ele converte os dados seriais de volta em dados paralelos após separar dados e endereços. O HT12D pertence à série 212 de decodificadores e pode ser emparelhado com a série 212 de codificadores com o mesmo número de endereços e formato de dados. O HT12D é capaz de decodificar 12 bits, dos quais 8 são bits de endereço e 4 são bits de dados. O byte de endereço do IC decodificador deve ser o mesmo do IC codificador para corresponder aos circuitos transmissor e receptor. No projeto, o byte de endereço dos módulos receptor e transmissor é definido como 0x00. Um resistor de 47 KΩ é conectado entre os pinos 14 e 15 do IC decodificador para corresponder à frequência de RF. O pino 17 é chamado de transmissão válida e possui um LED conectado a ele através de um resistor de 1 KΩ para indicar se o transmissor RF do Medidor de Energia Pré-Pago está pareado com o receptor ou não. Apenas o bit de dados D0 do decodificador é rastreado para detectar o sinal de alerta. O bit D0 do IC decodificador está conectado ao pino 7 do Arduino UNO.
EEPROM externa – AT24C02 é a EEPROM externa usada como dispositivo de recarga inteligente. O IC de 8 pinos tem a seguinte configuração de pinos –
Fig. 6: Tabela listando a configuração dos pinos da EEPROM externa AT24C02
Os pinos 5 e 6 do IC EEPROM se conectam aos pinos A4 e A5 do Arduino, onde A4 está configurado para SDA e A5 está configurado para SCL. Os pinos 1, 2 e 3 do IC EEPROM são conectados ao terra, pois a qualquer momento a estação de recarga terá apenas uma única EEPROM conectada. Os pinos são usados para endereçar EEPROMs individuais quando várias EEPROMs se conectam a um único microcontrolador ao mesmo tempo .
Fonte de alimentação – Um transformador abaixador é usado para converter 230 V CA em 18 V CA e, usando um retificador de ponte completa e um capacitor, ele é convertido para 18 V CC. Este 18V DC é convertido em 12V DC usando um regulador de tensão 7812 e é fornecido ao pino Vin da placa Arduino UNO. Os 18V DC são fornecidos ao módulo GSM. Todos os outros ICs e módulos são alimentados por 5V DC da placa Arduino.
Dispositivo de recarga inteligente
O IC EEPROM AT24C02 serve como dispositivo de recarga inteligente no projeto. Para simplificar, é utilizado como alternativa aos cartões inteligentes. O IC EEPROM armazena as informações de recarga e pode ser conectado à estação de recarga e ao medidor de energia pré-pago.
Medidor de energia pré-pago
O circuito desenvolvido deverá ser conectado entre as cargas e a saída neutra de um medidor de energia elétrica comum. Quando uma carga for ligada e começar a consumir eletricidade, a corrente também passará pelo medidor de energia pré-pago. O dispositivo terá um conjunto de circuito LDR para detectar o consumo de eletricidade, detectando o piscar do LED Imp / kWh no painel frontal do Medidor Eletrônico de Energia e acionará um circuito de relé para cortar o fornecimento da extremidade do fio neutro quando o saldo de uso de energia de recarga estiver esgotado . O dispositivo terá slot para conectar EEPROM para ler e diminuir o saldo de recarga e terá um display LCD para mostrar o saldo atual do uso de energia diminuindo com o consumo de energia. O dispositivo possui um circuito transmissor de RF para se conectar à estação de recarga para enviar o alerta de baixo saldo restante de uso. O circuito é construído no Arduino Mega e possui diferentes componentes e módulos conectados à placa da seguinte maneira –
Visor LCD 16X2 – O visor LCD é usado para mostrar o equilíbrio restante do uso de energia. Ele é conectado à placa Arduino conectando seus pinos de dados aos pinos 3 a 6 da placa Arduino. Os pinos RS e E do LCD estão conectados aos pinos 13 e 12 do Arduino UNO respectivamente. O pino RW do LCD está aterrado.
Fig. 7: Tabela listando conexões de circuito entre Arduino Uno e Character LCD
A biblioteca padrão de código aberto para interface do LCD com o Arduino MEGA é usada no projeto. A biblioteca funciona conforme o esperado e não precisa de alterações ou modificações.
EEPROM externa – A EEPROM externa será conectada ao dispositivo e conectada ao Arduino MEGA na interface de dois fios. Os pinos 5 e 6 do IC EEPROM se conectam aos pinos 20 e 21 do Arduino Mega respectivamente, onde o pino 20 da placa está configurado para SDA e o pino 21 está configurado para SCL.
Circuito de Relé – Um relé 12V 2A será usado para controlar as fontes principais. As cargas serão conectadas entre o fio de fase e o pino NO do relé. O fio neutro será conectado novamente a um medidor de eletricidade normal através do ponto COM. Quando o saldo de uso de energia se esgotar, o microcontrolador enviará uma lógica HIGH para o circuito de transistor chaveador BC547. O circuito do transistor causará um curto-circuito em uma das extremidades da bobina com o terra, enquanto a outra extremidade da bobina recebe alimentação de 12 V, desarmando o relé para o ponto NC.
Sensor LDR – O sensor LDR será colocado em conjunto antes do LED Imp/kWh do painel frontal do EEM regular. Um sensor LDR altera sua resistência de acordo com a intensidade da luz. Quando a luz incide no LDR, sua resistência permanece baixa, enquanto quando há ausência de luz sua resistência é alta. O sensor LDR é conectado ao pino 2 não inversor do comparador de tensão LM358, enquanto a tensão no pino 3 inversor do LM358 é passada através de uma resistência variável. O LED Imp/KWH do painel frontal do EEM pisca um determinado número de vezes de acordo com a classificação de impulso/KWH quando o consumo de eletricidade lido pelo medidor ultrapassa 1KWH de cada vez. Por padrão, o LDR possui baixa resistência e mas quando o LED Imp/kWh do painel frontal do EEM pisca, sua resistência é aumentada. A diferença entre a tensão inversora e não inversora é passada do pino de saída 1 do comparador para o pino analógico A0 do Arduino.
Transmissor RF – O transmissor RF será usado para transmitir mensagem de alerta de baixo equilíbrio de energia para o circuito receptor. O módulo transmissor de RF é um pequeno subconjunto de PCB. A configuração dos pinos do módulo transmissor é a seguinte:
Fig. 8: Tabela listando a configuração dos pinos do transmissor RF
Os dados serializados de codificador
é recebido no pino 2 do módulo e repassado para a antena a partir do pino 4 do módulo.
HT12E IC – O HT12E IC converte os dados paralelos em dados seriais para passá-los ao transmissor de RF. O codificador IC HT12E pertence à série 212 de codificadores. É emparelhado com decodificadores da série 212 com o mesmo número de endereços e formato de dados. O HT12E é capaz de codificar 12 bits, dos quais 8 são bits de endereço e 4 são bits de dados. Assim, o sinal codificado é um dado paralelo serializado de 12 bits composto por dados de 4 bits a serem transferidos anexados ao byte de endereço. Para definir a frequência do oscilador, um resistor de 1MΩ é conectado entre os pinos 15 e 16 do IC do codificador HT12E. Apenas o bit de dados D0 do codificador precisa ser usado para enviar alerta de baixo equilíbrio de energia para a estação de recarga. Portanto, o bit D0 do IC do codificador está conectado ao pino 7 do Arduino MEGA.
Fonte de alimentação – Um transformador abaixador é usado para converter 230 V CA em 18 V CA e, usando um retificador de ponte completa e um capacitor, ele é convertido para 18 V CC. Este 18V DC é convertido em 12V DC usando um regulador de tensão 7812 e é fornecido ao pino Vin da placa Arduino UNO e ao relé. Os 18V DC são convertidos em 5V DC usando o regulador de tensão 7805 que é fornecido ao restante dos componentes.
Como funciona o projeto
Um consumidor primeiro precisa fazer uma recarga de energia. Ele possui o EEPROM IC como dispositivo inteligente de recarga de energia. Para fazer a recarga, ele deve conectar o cartão de memória na Estação de Recarga e pressionar o botão interfaceado ao pino A2 do Arduino UNO. Ao pressionar o botão, o consumidor será solicitado a selecionar um valor de recarga por meio de mensagens piscantes na tela LCD. Serão sete pacotes de recarga disponíveis no valor de 2, 5, 7, 9, 12, 15 e 17 rúpias. O consumidor pode navegar para a ordem crescente dos pacotes de recarga pressionando o botão conectado ao pino A1 do Arduino UNO, enquanto pode navegar para a ordem decrescente dos pacotes de recarga pressionando o botão conectado ao pino A0 do Arduino UNO. Ao navegar até o pacote de recarga desejado, o consumidor pode confirmar a recarga pressionando o botão conectado ao pino A3 do Arduino UNO. Conforme o usuário pressiona o botão conectado ao pino A3 do Arduino UNO, o valor da recarga é salvo no local 1 do endereço B01010000 na EEPROM e as unidades de energia elétrica são recarregadas em termos de número de piscadas do LED Imp/kWh do painel frontal de EEM são salvos. Uma mensagem é enviada ao consumidor confirmando as informações da recarga através do módulo GSM.
O consumidor precisa retirar o cartão de memória e carregá-lo para conectar o medidor de energia pré-pago. Assim que o cartão de memória estiver conectado ao medidor de energia pré-pago, o circuito do medidor de controle do Arduino MEGA lê a quantidade de recarga da EEPROM e retoma o fornecimento de energia alternando o relé. O saldo da recarga é mostrado no painel LCD do medidor de energia pré-pago. O consumo de energia elétrica disponível é calculado pelo número de piscadas do LED Imp/KWH do EEM. O Arduino Mega aguarda o piscar do LED Imp/kWh do painel frontal do EEM e a cada piscada compara a tensão analógica detectada em seu pino A0 que é convertida para uma medida digital com valor calibrado. O valor calibrado para comparação com o valor do ADC foi definido como 300 durante os testes do projeto. Sempre que o LED Imp/kWh do painel frontal do EEM pisca, a resistência do LDR é aumentada no circuito divisor de potencial aumentando a tensão não inversora e maior tensão é detectada no pino 1 do IC comparador LM358. Assim, conforme a tensão detectada e digitalizada do A0 do Arduino MEGA ultrapassa o valor de referência 300, é registrado um único piscar do LED Imp / kWh do painel frontal do EEM e uma variável no código do programa contendo o número de unidades recarregadas no formulário O número de piscadas ou pulsos é diminuído em um.
Os EEMs vêm com uma classificação Impulse/KWH. Esta classificação significa que o LED Imp / kWh do EEM piscará pelo número de vezes indicado quando for consumido 1 KWH ou 1 unidade de eletricidade. Como se houvesse uma carga de 100 Watts, ela consumirá 100 Watts em uma hora. Em 10 horas, consumirá 1 KW de eletricidade. Portanto, em 10 horas, uma carga de 100 Watts consumirá 1KWH ou 1 unidade de eletricidade. Se um EEM for indicado com classificação de 1600 impulsos/KWH, no consumo de 1 KWH ou 1 unidade de eletricidade, seu LED Imp / kWh no painel frontal piscará 1600 vezes. O EEM regular usado nos testes do projeto tinha uma classificação de 3.200 impulso/KWH. Esta classificação pode variar de 800 impulso/KWH a 3600 impulso/KWH. No entanto, medidores com classificação de 1000 impulsos/KWH estão ganhando popularidade hoje em dia.
A classificação do medidor deve ser confirmada e bem conhecida para escrever o código Arduino para cálculo do consumo de energia e dedução do saldo. Para testar a classificação real de impulso/KWH do medidor, uma carga de potência fixa deve ser conectada ao medidor e fornecida energia por um minuto. O número de piscadas em um minuto durante o fornecimento à carga deve ser calculado.
A potência da carga está relacionada à classificação do medidor pela seguinte fórmula –
Potência da carga em KW = 3600/(Classificação do medidor em impulso/KWH * Segundos por Flash)
Os segundos por flash estão relacionados às piscadas por minuto da seguinte maneira –
segundos por flash = 60/piscas por minuto
Então,
Potência da carga em KW = (3600 * Piscas por minuto)/ (Classificação do medidor em impulso/KWH * 60)
Potência da carga em KW = (60* piscadas por minuto)/Classificação do medidor em impulso/KWH
Se a potência da carga for conhecida em Watts, então,
Potência da carga em Watts = (60* piscadas por minuto*1000)/Classificação do medidor em impulso/KWH
A partir da equação acima, a classificação do medidor pode ser confirmada pelas fórmulas –
Classificação do medidor em impulso/KWH = (60* piscadas por minuto*1000)/ Potência da carga em Watts
O EEM utilizado durante os testes do projeto tinha uma classificação de 3.200 impulsos/KWH mencionada nele. Ao ligar uma lâmpada de 100 Watts por intervalos de 1 minuto, foram recebidas em média 5.333 piscadas. Colocando os valores na equação acima –
Classificação do medidor em impulso/KWH = (60 * 5,333 * 1000)/100
= 3199,8
Portanto, a classificação do medidor foi confirmada em 3.200 impulsos/KWH. O mesmo número de piscadas será equivalente a 1 KWH ou 1 unidade de consumo de eletricidade.
O esboço do Arduino do medidor de energia pré-pago detecta as piscadas e executa um contador em ordem decrescente, medindo o consumo de cada 1 kWh ou unidade de eletricidade em 3.200 piscadas ou pulsos. Quando o consumo de eletricidade disponível é deixado em 30 por cento, o Arduino Mega aumenta o bit D0 do decodificador de RF, enviando uma confirmação de baixo equilíbrio de energia para a estação de recarga. Ao detectar o bit D0 alto no codificador RF, o Arduino UNO na estação de recarga se enquadra e envia uma mensagem de alerta ao consumidor utilizando o módulo GSM/GPRS. O consumidor precisa fazer uma recarga antes que o saldo energético disponível se esgote. Se o balanço de energia disponível se esgotar, o Arduino Mega aciona o contator do relé para o ponto NC cortando a alimentação principal. A alimentação principal é retomada à medida que o balanço de energia é recarregado e lido pelo medidor a partir da EEPROM recarregada.
Guia de programação
Esboço Arduino da estação de recarga
O código do programa será executado no Arduino UNO. No código do programa, primeiro são importadas as bibliotecas de código aberto padrão do Arduino para interface com LCD, porta serial virtual e comunicação serial.
#include
#include
#include
Um objeto da classe LCD é declarado e mapeado com os pinos do Arduino. A porta serial virtual é realizada nos pinos 9 e 10 do Arduino. Os pinos onde os interruptores táteis estão conectados são atribuídos às variáveis b1, b2, b3 e b4. O pino que faz interface com o bit D0 do decodificador RF é atribuído à variável RFin. As variáveis bs1, bs2, bs3, bs4, bs5 são declaradas para manter o status dos pinos do Arduino. Uma matriz contendo os valores de recarga é declarada. Um conjunto de variáveis de contador é declarado e uma matriz para armazenar bitmap para caracteres de rupia personalizados é declarada.
LiquidCrystal lcd(13, 12, 6, 5, 4, 3); // Pinos usados para RS,E,D4,D5,D6,D7
SoftwareSerial mySerial(9, 10); //RX,TX
intb1=A0; //Botão usado como * e < no pino A0
int b2 = A1; //Botão usado como > no pino A1
int b3 = A2; //Botão usado como EXIT no pino A2
int b4 = A3; // Botão usado como # e salvo no pino A3
int RFin=7;
int bS1 = 0;
int bS2 = 0;
int bS3 = 0;
int bS4 = 0;
int bS5 = 0;
int teriff(7) = { 2,5,7,9,12,15,17};
int i=0,j=0,k=0,l=0,m=0,puls=0,pos=0;
byte rúpias(8) ={ 0b00000,
0b11111,
0b00100,
0b11111,
0b00100,
0b01000,
0b00100,
0b00010
};
É definida uma função eeprom_i2c_write que grava dados em um endereço específico da EEPROM. Dentro da função, o método BeginTransmission da biblioteca wire é usado para iniciar a comunicação serial. O método write é usado para escrever dados e o método endTransmission é usado para fechar a transmissão.
void eeprom_i2c_write(endereço de byte, byte from_addr, dados de byte) {
Wire.beginTransmission(endereço);
Wire.write(from_addr);
Wire.write(dados);
Wire.endTransmission ;
}
Uma função eeprom_i2c_read é definida para ler dados de um endereço específico da EEPROM. Dentro da função, o método BeginTransmission da biblioteca wire é usado para iniciar a comunicação serial. O método write é usado para escrever a localização do endereço e o método endTransmission é usado para fechar a transmissão. Os dados de um endereço de memória são solicitados usando o método requestFrom e, se disponíveis, verificados pelo método available , são lidos usando o método read . caso contrário, a leitura dos dados será definida como 0xFF.
byte eeprom_i2c_read(int endereço, int from_addr) {
Wire.beginTransmission(endereço);
Wire.write(from_addr);
Wire.endTransmission ;
Wire.requestFrom(endereço, 1);
if(Wire.disponível )
retornar Wire.read ;
outro
retornar 0xFF;
}
Uma função setup é chamada na qual a taxa de transmissão para porta serial virtual e transmissão serial de dados para o LCD é definida para 9600 bits por segundo usando as funções mySerial.begin e Serial.begin respectivamente e a comunicação por TWI é inicializado usando o método Wire.Begin . Os pinos onde os interruptores táteis e o bit D0 do IC decodificador estão conectados são configurados para entrada digital. O LCD é inicializado usando a função LCD.begin e mensagens iniciais indicando o nome do projeto aparecem na tela.
configuração vazia {
meuSerial.begin(9600);
Wire.begin ;
Serial.begin(9600);
pinMode(b1, ENTRADA);
pinMode(b2, ENTRADA);
pinMode(b3, ENTRADA);
pinMode(b4, ENTRADA);
pinMode(RFin,INPUT);
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print(“Oficina de Engenheiros”);
lcd.setCursor(0,1);
lcd.print(”PRÉ PAGO EM“);
atraso(3000);lcd.clear ;
}
Uma função loop é chamada na qual a entrada digital dos interruptores táteis e o bit D0 do IC decodificador são lidos usando a função digitalRead . Uma mensagem solicitando que o usuário recarregue o equilíbrio de energia pisca no LCD. Se o usuário pressionar o botão conectado ao pino A2, a variável pos será definida como 20 e a tela LCD será apagada. Se o usuário pressionar o botão conectado ao pino A0, o saldo de recarga em rúpias e pulsos é lido na EEPROM e salvo nas variáveis r e s, respectivamente. O saldo atual disponível é mostrado no LCD. Se o bit D0 do IC decodificador estiver definido como ALTO, uma mensagem de alerta de saldo baixo será mostrada na tela LCD e a função para enviar alerta SMS será chamada.
loop vazio
{
bS1 = leituradigital(b1);
bS2 = leituradigital(b2);
bS3 = leituradigital(b3);
bS4 = leituradigital(b4);
bS5 = leituradigital(RFin);
digitalWrite(RFin,0);
lcd.setCursor(0,0);
lcd.print(“**PARA RECARREGAR**”);
lcd.setCursor(0,1);
lcd.print(”PRESSIONE SIM*“);
if(bS3==BAIXO){
pos=20; lcd.clear ;}
if(bS1==BAIXO){
lcd.claro ;
int r = eeprom_i2c_read(B01010000, 1);
ints = eeprom_i2c_read(B01010000, 2);
lcd.setCursor(0,0);
lcd.print(“QUANTIA RECARREGADA”);
lcd.setCursor(6,1);
imprimirDígitos2(r);
lcd.setCursor(9,1);
imprimirDígitos2(s);
enquanto(1){
atraso(3000);atraso(3000);
lcd.claro ;
quebrar;
}
}
if(bS5==ALTO){
lcd.setCursor(0,0);
lcd.print(“DETECÇÃO DE QUANTIDADE BAIXA”);
lcd.setCursor(0,1);
lcd.print(”PLS RECARREGAR“);
alerta baixoSMS ;
lcd.claro ;
}
Se a variável pos estiver definida como 20, a entrada digital dos botões será lida e uma mensagem indicando o processo de recarga será mostrada no LCD. O usuário pode aumentar ou diminuir o pacote de recarga pressionando os botões conectados aos pinos A0 e A1 do Arduino e ao pressionar o botão conectado ao pino A3, a recarga selecionada é mostrada no LCD e as informações de recarga são salvas na EEPROM em termos de ruppes também como pulsos. Uma mensagem de recarga bem-sucedida é enviada ao número do usuário chamando a função rechagreAlertSMS . O número de unidades recarregadas é calculado dividindo por 6 o valor da recarga mantido pela variável r. As unidades de recarga são convertidas em número de pulsos multiplicando por 3.200, que é a classificação de impulso/KWH do EEM.
enquanto(pos==20){
bS1 = leituradigital(b1);
bS2 = leituradigital(b2);
bS3 = leituradigital(b3);
bS4 = leituradigital(b4);
lcd.setCursor(0,0);
lcd.print(” VALOR DE RECARGA “);
lcd.createChar(1,rúpias);
lcd.setCursor(6,1);
lcd.write(1);
if(bS1==BAIXO && pos==20){
se(eu>0){
eu-;
atraso(400);
}
}
if(bS2==BAIXO && pos==20){
se(eu<6){
eu++;
atraso(400);
}
}
lcd.setCursor(8,1);
printDigits2(teriff(i));
if(bS4==BAIXO && pos==20){
lcd.claro ;
pos=1;
lcd.setCursor(3,0);
lcd.print(“QUANTIA”);
lcd.createChar(1,rúpias);
lcd.setCursor(10,0);
lcd.write(1);
lcd.setCursor(12,0);
printDigits2(teriff(i));
lcd.setCursor(0,1);
lcd.print(”SIM*NÃO#“);
atraso(500);
enquanto(pos==1){
bS3 = leituradigital(b3);
bS4 = leituradigital(b4);
if(bS3==BAIXO && pos==1){
eeprom_i2c_write(B01010000, 1, teriff(i));
atraso(200);
pos=30;
lcd.claro ;
quebrar;
}
if(bS4==BAIXO && pos==1){
lcd.claro ;
quebrar;
}
}
}
}
enquanto(pos==30){
byte r = eeprom_i2c_read(B01010000, 1);
lcd.setCursor(0,0);
lcd.print(“RECARGA “);
lcd.createChar(1,rúpias);
lcd.setCursor(10,0);
lcd.write(1);
lcd.setCursor(12,0);
printDigits2(teriff(i));
recarregaAlertSMS ;
pulso=(3200*r)/6; //6 rúpias por suposição de UNIT
eeprom_i2c_write(B01010000, 2, pulsos);
Serial.print(puls);
para(j=0;j<16;j++){
lcd.setCursor(j,1);
lcd.print(“*”);
atraso(500);
}
lcd.setCursor(0,1);
lcd.print(”CONCLUÍDO!!!“);
atraso(3000);atraso(3000);
lcd.claro ;
pos=40;
quebrar;
}
}
Uma função printDigits2 n é usada na função loop para formatar as strings que transportam números para um formato preenchido com zeros.
void printDigits2 (dígitos inteiros)
{
se(dígitos <10)
{
lcd.print(“0”);
lcd.print(dígitos);
}
outro
{
lcd.print(dígitos);
}
}
A função lowAlertSMS é usada para enviar mensagem de baixo balanço de energia ao usuário. Os comandos padrão do módulo GSM são passados para ele através da porta serial virtual. A mensagem é enviada para um número imaginário 91xxxxxxxxxx que pode ser substituído por qualquer número de celular real.
void lowAlertSMS {
atraso(100);
mySerial.println(“AT+CMGF=1”); //Configura o Módulo GSM em Modo Texto
atraso(1000); // Atraso de 1000 mili segundos ou 1 segundo
mySerial.println(“AT+CMGS=”+91xxxxxxxxxx”r”);
atraso(100);
mySerial.println(“LOW BALANCE PLEASE RECHANGE”);// O texto SMS que você deseja enviar
atraso(100);
mySerial.println((char)26);// Código ASCII de CTRL+Z
atraso(1000);
laço ;
}
A função rechargeAlertSMS é igual à função lowAlertSMS , exceto que o texto da mensagem é diferente. Novamente, a mensagem é enviada para um número imaginário 91xxxxxxxxxx que pode ser substituído por qualquer número de celular real.
void rechagreAlertSMS {
atraso(100);
mySerial.println(“AT+CMGF=1”); //Configura o Módulo GSM em Modo Texto
atraso(100); // Atraso de 1000 mili segundos ou 1 segundo
mySerial.println(“AT+CMGS=”+91xxxxxxxxxx “r”);
atraso(100);
mySerial.print(“Rechange Done, MRP:Rs.”);// O texto SMS que você deseja enviar
atraso(100);
mySerial.print(teriff(i));
atraso(100);
meuSerial.print(“n”);
atraso(100);
mySerial.println(“Use a eletricidade com sabedoria para evitar aumento de custos.”);
atraso(100);
mySerial.println((char)26);// Código ASCII de CTRL+Z
atraso(1000);
}
Isso encerra o esboço do Arduino para Recharge Station.
Esboço do Arduino para medidor de energia pré-pago
O código do programa será executado no Arduino Mega. No código do programa, primeiro são importadas as bibliotecas de código aberto padrão do Arduino para interface com LCD, porta serial virtual e comunicação serial.
#include
#include
#include
Um objeto da classe LCD é declarado e mapeado com os pinos do Arduino. A porta serial virtual é realizada nos pinos 9 e 10 do Arduino. Os pinos onde a chave tátil, o bit D0 se o Encoder IC e o relé estão conectados são atribuídos às variáveis b1, RFin e relé. Uma variável para armazenar o valor analógico do sensor LDR é declarada. Um conjunto de variáveis de contador é declarado e uma matriz para armazenar bitmap para caracteres de rupia personalizados é declarada.
LiquidCrystal lcd(13, 12, 6, 5, 4, 3); // Pinos usados para RS,E,D4,D5,D6,D7
SoftwareSerial mySerial(9, 10); //RX,TX
intb1=A0; //Botão usado como * e < no pino A0
int RFin=7;
relé interno = 24;
int sensorValor=0;
int i=0,j=0,k=0,l=0,m=0,Lpuls=0,puls=0;
byte rúpias(8) ={ 0b00000,
0b11111,
0b00100,
0b11111,
0b00100,
0b01000,
0b00100,
0b00010
};
É definida uma função eeprom_i2c_write que grava dados em um endereço específico da EEPROM. Dentro da função, o método BeginTransmission da biblioteca wire é usado para iniciar a comunicação serial. O método write é usado para escrever dados e o método endTransmission é usado para fechar a transmissão.
void eeprom_i2c_write(endereço de byte, byte from_addr, dados de byte) {
Wire.beginTransmission(endereço);
Wire.write(from_addr);
Wire.write(dados);
Wire.endTransmission ;
}
Uma função eeprom_i2c_read é definida para ler dados de um endereço específico da EEPROM. Dentro da função, o método BeginTransmission da biblioteca wire é usado para iniciar a comunicação serial. O método write é usado para escrever a localização do endereço e o método endTransmission é usado para fechar a transmissão. Os dados de um endereço de memória são solicitados usando o método requestFrom e, se disponíveis, verificados pelo método available , são lidos usando o método read . caso contrário, a leitura dos dados será definida como 0xFF.
byte eeprom_i2c_read(int endereço, int from_addr) {
Wire.beginTransmission(endereço);
Wire.write(from_addr);
Wire.endTransmission ;
Wire.requestFrom(endereço, 1);
if(Wire.disponível )
retornar Wire.read ;
outro
retornar 0xFF;
}
Uma função setup é chamada na qual o pino onde a chave tátil está conectada é definido como entrada digital, enquanto os pinos que conectam o bit D0 do codificador RF e a bobina do relé são definidos como saída digital. O relé e o bit D0 do codificador RF são configurados para lógica LOW por padrão. A taxa de transmissão para transmissão serial de dados para o LCD é definida para 9600 bits por segundo usando a função Serial.begin e a comunicação via TWI é inicializada usando o método Wire.Begin . Algumas mensagens iniciais aparecem na tela LCD.
configuração vazia {
pinMode(b1, ENTRADA);
pinMode(RFin, SAÍDA);
pinMode(relé, SAÍDA);
digitalWrite(relé,BAIXO);
digitalWrite(RFin,BAIXO);
Wire.begin ;
Serial.begin(9600);
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print(“Oficina de Engenheiros”);
lcd.setCursor(0,1);
lcd.print(”PRÉ PAGO EM“);
atraso(3000);
lcd.setCursor(0,0);
lcd.print(”PRÉ PAGO EM“);
lcd.setCursor(0,1);
lcd.print(” “);
}
Uma função loop é chamada na qual o saldo de recarga é lido dos locais de memória EEPROM e o saldo de recarga é mostrado na tela LCD. As unidades de energia recarregadas são salvas em pulsos variáveis e o relé é acionado para retomar a alimentação principal. A tensão analógica no pino A0 é lida e convertida em leitura digital usando a função analogRead . Se o valor do sensor exceder 300, a variável de pulsos será decrementada em um e o saldo reduzido em pulsos será gravado de volta na EEPROM. Se a variável de pulso for deixada em 30 por cento, ou seja, 70 por cento do balanço de energia é consumido, o bit D0 do codificador de RF é definido como HIGH. Se uma recarga válida for feita ou não, é verificado pela lógica if-else.
loop vazio
{
byte r = eeprom_i2c_read(B01010000, 1);
byte s = eeprom_i2c_read(B01010000, 2);
if(s>1&&s<100){
lcd.setCursor(0,0);
lcd.print(”SUA CONTA“);
lcd.setCursor(0,1);
lcd.print(“RECARGA “);
lcd.createChar(1,rúpias);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
imprimirDígitos2(r);
atraso(3000);
lcd.claro ;
atraso(2000);
digitalWrite(relé, ALTO);
digitalWrite(RFin,BAIXO);
byte r = eeprom_i2c_read(B01010000, 1);
byte s = eeprom_i2c_read(B01010000, 2);
pulso=s;
enquanto(1){
lcd.setCursor(0,0);
lcd.print(” DISPOSITIVO NO TEMPO “);
lcd.setCursor(1,1);
imprimirDígitos2(s);
lcd.setCursor(5,1);
lcd.print(“PULSOS”);
digitalWrite(RFin,BAIXO);
sensorValue =analogRead(A0)*(5.0/1023.0)*100;
if(sensorValor>=300){
eu++;
pulso–;
atraso(500);
lcd.setCursor(12,1);
imprimirDígitos2(i);
//eeprom_i2c_write(B01010000, 1, i);
eeprom_i2c_write(B01010000, 2, pulso);
}
Lpulsos=ss*.3;
if(i==Lpulsos){
lcd.setCursor(0,0);
lcd.print(“DETECÇÃO DE QUANTIDADE BAIXA”);
lcd.setCursor(0,1);
lcd.print(”PLS RECARREGAR“);
atraso(4000);
digitalWrite(RFin,ALTO);
enquanto(1){
sensorValue =analogRead(A0)*(5.0/1023.0)*100;
if(sensorValor>=300){
lcd.claro ;
quebrar;
}
}
}
se(eu==s){
eeprom_i2c_write(B01010000, 1, 0);
digitalWrite(relé, BAIXO);
lcd.setCursor(0,0);
lcd.print(”SALDO ZERO“);
lcd.setCursor(0,1);
lcd.print(“DESLIGAMENTO DO DISPOSITIVO “);
atraso(3000);atraso(3000);
eu=0;
s=0;
quebrar;
}
se(r>250){
quebrar;
}
}
}
outro{
lcd.setCursor(0,0);
lcd.print(“QUANTIA INVÁLIDA “);
lcd.setCursor(0,1);
lcd.print(”PLS RECARREGAR“);
digitalWrite(relé,BAIXO);
enquanto(1){
byte r = eeprom_i2c_read(B01010000, 1);
byte s = eeprom_i2c_read(B01010000, 2);
se(s>1){
quebrar;
}
}
}
}
Uma função printDigits2 n é usada na função loop para formatar as strings que transportam números para um formato preenchido com zeros.
void printDigits2 (dígitos inteiros)
{
se(dígitos <10)
{
lcd.print(“0”);
lcd.print(dígitos);
}
outro
{
lcd.print(dígitos);
}
}
Isso encerra o esboço do Arduino para medidor de energia pré-pago.
Código-fonte do projeto
###
//Program to
#include
#include
#include
LiquidCrystal lcd(13, 12, 6, 5, 4, 3);// Pins used for RS,E,D4,D5,D6,D7
SoftwareSerial mySerial(9, 10); // RX, TX
int b1 = A0; // Push button used as * and < at A0 pin
int b2 = A1; // Push button used as > at A1 pin
int b3 = A2; // Push button used as EXIT at A2 pin
int b4 = A3; // Push button used as # and save at A3 pin
int RFin=7;
int bS1 = 0;
int bS2 = 0;
int bS3 = 0;
int bS4 = 0;
int bS5 = 0;
int teriff(7) = { 2,5,7,9,12,15,17};
int i=0,j=0,k=0,l=0,m=0,puls=0,pos=0;
byte rupees(8) ={ 0b00000,
0b11111,
0b00100,
0b11111,
0b00100,
0b01000,
0b00100,
0b00010
};
void eeprom_i2c_write(byte address, byte from_addr, byte data) {
Wire.beginTransmission(address);
Wire.write(from_addr);
Wire.write(data);
Wire.endTransmission ;
}
byte eeprom_i2c_read(int address, int from_addr) {
Wire.beginTransmission(address);
Wire.write(from_addr);
Wire.endTransmission ;
Wire.requestFrom(address, 1);
if(Wire.available )
return Wire.read ;
else
return 0xFF;
}
void setup {
mySerial.begin(9600);
Wire.begin ;
Serial.begin(9600);
pinMode(b1, INPUT);
pinMode(b2, INPUT);
pinMode(b3, INPUT);
pinMode(b4, INPUT);
pinMode(RFin, INPUT);
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print("Engineers Garage");
lcd.setCursor(0,1);
lcd.print(" PRE PAID EM ");
delay(3000);lcd.clear ;
}
void loop
{
bS1 = digitalRead(b1);
bS2 = digitalRead(b2);
bS3 = digitalRead(b3);
bS4 = digitalRead(b4);
bS5 = digitalRead(RFin);
digitalWrite(RFin,0);
lcd.setCursor(0,0);
lcd.print("**TO RECHARGE**");
lcd.setCursor(0,1);
lcd.print(" PRESS YES* ");
if(bS3==LOW){
pos=20; lcd.clear ;}
if(bS1==LOW){
lcd.clear ;
int r = eeprom_i2c_read(B01010000, 1);
int s = eeprom_i2c_read(B01010000, 2);
lcd.setCursor(0,0);
lcd.print("AMOUNT RECHARGED");
lcd.setCursor(6,1);
printDigits2(r);
lcd.setCursor(9,1);
printDigits2(s);
while(1){
delay(3000);delay(3000);
lcd.clear ;
break;
}
}
if(bS5==HIGH){
lcd.setCursor(0,0);
lcd.print("LOW AMOUNT DETCT");
lcd.setCursor(0,1);
lcd.print(" PLS RECHARGE ");
lowAlertSMS ;
lcd.clear ;
}
while(pos==20){
bS1 = digitalRead(b1);
bS2 = digitalRead(b2);
bS3 = digitalRead(b3);
bS4 = digitalRead(b4);
lcd.setCursor(0,0);
lcd.print(" RECHARGE AMOUNT ");
lcd.createChar(1,rupees);
lcd.setCursor(6,1);
lcd.write(1);
if(bS1==LOW && pos==20){
if(i>0){
i--;
delay(400);
}
}
if(bS2==LOW && pos==20){
if(i<6){
i++;
delay(400);
}
}
lcd.setCursor(8,1);
printDigits2(teriff(i));
if(bS4==LOW && pos==20){
lcd.clear ;
pos=1;
lcd.setCursor(3,0);
lcd.print("AMOUNT");
lcd.createChar(1,rupees);
lcd.setCursor(10,0);
lcd.write(1);
lcd.setCursor(12,0);
printDigits2(teriff(i));
lcd.setCursor(0,1);
lcd.print(" YES* NO# ");
delay(500);
while(pos==1){
bS3 = digitalRead(b3);
bS4 = digitalRead(b4);
if(bS3==LOW && pos==1){
eeprom_i2c_write(B01010000, 1, teriff(i));
delay(200);
pos=30;
lcd.clear ;
break;
}
if(bS4==LOW && pos==1){
lcd.clear ;
break;
}
}
}
}
while(pos==30){
byte r = eeprom_i2c_read(B01010000, 1);
lcd.setCursor(0,0);
lcd.print("RECHARGE ");
lcd.createChar(1,rupees);
lcd.setCursor(10,0);
lcd.write(1);
lcd.setCursor(12,0);
printDigits2(teriff(i));
rechagreAlertSMS ;
puls=(3200*r)/6; //6 rupees per UNIT assumption
eeprom_i2c_write(B01010000, 2,puls);
Serial.print(puls);
for(j=0;j<16;j++){
lcd.setCursor(j,1);
lcd.print("*");
delay(500);
}
lcd.setCursor(0,1);
lcd.print(" DONE !!! ");
delay(3000);delay(3000);
lcd.clear ;
pos=40;
break;
}
}
void printDigits2(int digits) //this void function is really useful;
it adds a "0" to the beginning of the number, so that 5 minutes is displayed as "00:05:00", rather than "00:5 :00"
{
if(digits < 10)
{
lcd.print("0");
lcd.print(digits);
}
else
{
lcd.print(digits);
}
}
void lowAlertSMS {
delay(100);
mySerial.println("AT+CMGF=1"); //Sets the GSM Module in Text Mode
delay(1000); // Delay of 1000 milli seconds or 1 second
mySerial.println("AT+CMGS="+917357187588"r");
delay(100);
mySerial.println("LOW BALANCE PLEASE RECHANGE");// The SMS text you want to send
delay(100);
mySerial.println((char)26);// ASCII code of CTRL+Z
delay(1000);
loop ;
}
void rechagreAlertSMS {
delay(100);
mySerial.println("AT+CMGF=1"); //Sets the GSM Module in Text Mode
delay(100); // Delay of 1000 milli seconds or 1 second
mySerial.println("AT+CMGS="+917357187588"r");
delay(100);
mySerial.print("Rechange Done, MRP:Rs.");// The SMS text you want to send
delay(100);
mySerial.print(teriff(i));
delay(100);
mySerial.print("n");
delay(100);
mySerial.println("Use electricity wisely to avoid rising costs.");
delay(100);
mySerial.println((char)26);// ASCII code of CTRL+Z
delay(1000);
}
###
Diagramas de circuito
| Circuito-Diagrama-Arduino-Baseado-Eletricidade-Estação de Recarga-Medidor de Energia Pré-pago |
 |