Estação de recarga de energia elétrica com medidor de energia pré-pago usando Arduino

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. Protótipo de estação de recarga de eletricidade pré-paga baseada em Arduino
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 Diagrama de blocos da estação de recarga de eletricidade pré-paga baseada em Arduino
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. Tabela de listagem de configuração de pinos da EEPROM externa AT24C02
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 – Tabela listando os pinos do Arduino e suas funções na estação de recarga de eletricidade pré-paga
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 – Tabela de listagem de configuração de pinos do receptor RF
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 – Tabela de listagem de configuração de pinos da EEPROM externa AT24C02
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. Conexões de circuito de listagem de tabelas entre Arduino Uno e LCD de caracteres
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: Tabela de listagem de configuração de pinos do transmissor RF
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

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.