Skip to content

Repositorio para o Projeto de Controle de Carregamento de Bateria com Painel Solar da Disciplica de Projetos de Sistemas Ubiquos de 23.2 na UFSC

License

Notifications You must be signed in to change notification settings

TarefasUFSC/Sunchaser-Solar_Charging_System

Repository files navigation

Sunchaser-Solar_Charging_System: Controle de Carga PWM com ESP32 e Placa Fotovoltaica

Introdução

Este projeto foi desenvolvido como parte de um trabalho para Projeto de Sistemas Ubiquos na UFSC, para o controle eficiente da carga de baterias de chumbo-ácido ou de lítio, utilizando uma placa fotovoltaica de 20W. O sistema emprega uma metodologia de modulação de largura de pulso (PWM) controlada por um ESP32 para regular a tensão e a corrente fornecida pela placa solar, assegurando uma tensão estável na bateria. Os dados de carregamento são monitorados e transmitidos para um Broker MQTT, integrando-se ao projeto do Pluviômetro existente. Adicionalmente, um aplicativo móvel fornece acesso local aos dados através de uma API REST.

O projeto é dividido em várias etapas de desenvolvimento, com testes dedicados para cada componente, seguindo princípios de orientação a objetos. Esta documentação fornece uma visão detalhada da estrutura do projeto, descrições de hardware e software, além de instruções operacionais e de diagnóstico.

Descrição do Projeto

O sistema é projetado para operar em locais remotos, onde a estabilidade da conexão de internet pode ser intermitente. Portanto, ele armazena dados localmente e tenta transmitir informações retroativas quando uma conexão está disponível. A abordagem de design permite o acesso local aos dados do ESP32, que pode alternar entre modos cliente e servidor para facilitar a interação com o usuário por meio de um aplicativo móvel.

Objetivos

  • Manter uma tensão estável de 12V na bateria, conforme especificações técnicas do fabricante.
  • Monitorar e armazenar dados de corrente e tensão para análises de longo prazo.
  • Permitir o acesso local aos dados via aplicativo móvel para monitoramento e controle.
  • Transmitir dados acumulados para um sistema centralizado quando conectado à internet.

Continue lendo para uma visão detalhada da implementação do projeto, incluindo instruções de montagem de hardware, configuração de software, e operação do sistema.

Visão de Alto Nível do Sistema

Diagrama Alto Nivel

FEITO COM PROTEUS 8.9

Visão Geral

O coração do projeto Sunchaser é uma solução de hardware meticulosamente projetada para o controle eficiente de carga de baterias através de energia solar. Este sistema é construído com um conjunto de placas interconectadas, cada uma desenhada para executar funções específicas dentro do mecanismo de carga.

Compatibilidade do Proteus

Importante frisar que todo o design foi realizado utilizando o Proteus 8.9. Versões mais recentes do Proteus podem abrir os arquivos do projeto, mas há uma incompatibilidade retroativa: projetos salvos em versões mais novas do software não poderão ser reabertos na versão 8.9. Esta informação é crucial para a manutenção e futuras iterações do projeto por outras equipes.

O design inicial foi acomodado na pasta Placa de Controle/Controle de Carga PWM/hardware proteus 8.9. Para superar desafios encontrados durante os testes, optou-se por uma abordagem modular, segmentando o hardware em diferentes funções:

  • ESP com Sensores
  • Controle PWM
  • Controle da Carga
  • Reguladores

Esta estruturação facilitou a identificação e solução de problemas, permitindo testes isolados e otimização de cada módulo.

Modularização das Placas

Imagens e Descrições dos Circuitos Abaixo, as imagens dos circuitos correspondem às seções descritas, proporcionando uma representação visual dos componentes e sua disposição.

Circuito da Placa do ESP e Sensores

O circuito do ESP e sensores constitui o núcleo de processamento e coleta de dados, onde o ESP32 opera como a unidade central, gerenciando tanto a comunicação quanto o processamento dos dados de sensores.

Circuito Controle PWM

O circuito de controle PWM manipula a tensão fornecida pela placa fotovoltaica à bateria, utilizando um MOSFET de canal P para modular a carga com precisão, baseando-se nas leituras de tensão da bateria.

Circuito Controle do Switch da Carga

Esta parte do hardware gerencia a conectividade entre a bateria e a carga, assegurando que a transferência de energia seja feita de maneira eficaz e segura, pois o Relé é aberto caso a tensão da bateria seja muito baixa (o que danifica a vida uti dela) e caso a corrente seja alta demais para a bateria.

Circuito Reguladores

Os reguladores de tensão são componentes cruciais do projeto, desempenhando um papel vital ao fornecer tensões DC estáveis de 5V, 9V e 12V. Esta placa reguladora é uma unidade modular, projetada para ser flexível e potencialmente integrável em outros projetos. Recebendo uma tensão de entrada variando de 12 a 20V, os reguladores asseguram a estabilização nas saídas especificadas, proporcionando uma alimentação confiável e segura para todos os componentes eletrônicos do sistema.

Circuito Visão Geral

Observações Técnicas Importantes

  • A presença de uma resistência interna na simulação da bateria é vital para o comportamento adequado das tensões no circuito. A ausência desta foi contornada com a implementação de um resistor em paralelo com a fonte de alimentação durante os testes.
  • A utilização do ADC1 é obrigatória para leituras analógicas, pois o ADC2 se torna inoperante quando o Wi-Fi do ESP32 está ativado. Ademais, foi observado que a entrada de 5V em qualquer pino do ADC1 pode ocasionar leituras incorretas nos outros pinos. Para resolver isso, a tensão de pulldown da interrupção foi ajustada para 3.3V.

Futuras Melhorias e Iterações

O projeto é configurado para ser altamente escalável e adaptável. Recomenda-se que futuras equipes expandam as capacidades do sistema, incorporando novas configurações e aprimorando as especificações técnicas, como as relacionadas à bateria, para atender a novas demandas ou melhorar a eficiência do controle de carga usando MPPT.

Configuração de Software

Pinagem

Pino (Nome no Código) Número do Pino Arquivo de Declaração Observações
PWM_Pin 16 BatteryControl.h Utilizado para controle PWM.
S2_Pin 26 BatteryControl.h -
interrupt_pin 33 communicator.h Não pode ser 5V para evitar problemas com ADC1.
Battery_Voltage_Pin 39 Sensors.h Pino de leitura de tensão da bateria, deve estar no ADC1.
Solar_Voltage_Pin 34 Sensors.h Pino de leitura de tensão do painel solar, deve estar no ADC1.
INA219_Sensor1_SCL 11 Obrigatório SCL do primeiro sensor INA219.
INA219_Sensor1_SDA 10 Obrigatório SDA do primeiro sensor INA219.
INA219_Sensor2_SCL 11 Obrigatório SCL do segundo sensor INA219.
INA219_Sensor2_SDA 10 Obrigatório SDA do segundo sensor INA219.

Observações Gerais:

  • Os pinos de leitura analógica devem estar no ADC1 devido ao uso do Wi-Fi, que interfere com o ADC2.
  • O pino interrupt_pin não deve receber 5V para evitar conflitos com outras leituras no ADC1.

Ambiente de Desenvolvimento

O código-fonte foi desenvolvido na Arduino IDE, uma plataforma de desenvolvimento que permite a escrita, compilação e upload de programas para placas compatíveis com Arduino, como o ESP32 utilizado neste projeto.

Instalação

  1. Instale a última versão da Arduino IDE a partir do site oficial.
  2. Configure a Arduino IDE para suportar o ESP32 seguindo as instruções disponíveis na documentação do ESP32.
  3. Instale todas as bibliotecas necessárias mencionadas nos arquivos package.json e yarn.lock localizados na pasta App Mobile/mobile.

Descrição dos Programas de Teste

Os programas de teste localizados em Programas ESP/Desenvolvimento são fundamentais para validar o funcionamento individual de cada componente do sistema. Cada subdiretório contém um exemplo de código que pode ser compilado e carregado separadamente para testar sensores, comunicação, controle PWM, entre outros.

Programa Final

A pasta Programas ESP/ProgramaFinal contém o código-fonte consolidado que será executado no ESP32. Inclui a integração das classes desenvolvidas, a lógica de controle PWM e a comunicação com o Broker MQTT.

Funcionamento Geral

Documentação do Código

O software do projeto é composto por várias classes, cada uma responsável por uma parte específica da lógica de controle e comunicação do sistema. Abaixo estão os arquivos principais e a descrição de suas responsabilidades e operações:

Classe BatteryControl
  • Arquivos: BatteryControl.cpp, BatteryControl.h
  • Responsabilidade: Controla o processo de carregamento da bateria ao modular a tensão fornecida pelo painel solar. Garante a manutenção da tensão da bateria nos níveis ideais para otimizar o carregamento e a vida útil da bateria.
  • Métodos Principais:
    • PWM_init(): Inicializa a configuração do PWM.
    • battery_loop(): Executa o loop principal de controle da bateria, ajustando o PWM conforme necessário.
    • check_error(float error): Verifica e lida com erros no sistema de carregamento.
    • stopCharging(): Interrompe o processo de carregamento da bateria.
    • bulk_stage(), absorption_stage(), float_stage(): Gerenciam as diferentes fases do processo de carregamento.
    • charging_control(): Controle lógico para a regulação do carregamento da bateria.
    • load_connection(): Gerencia a conexão e desconexão da carga da bateria.
    • changeDutyCycle(): Ajusta o ciclo de trabalho do PWM para regular a tensão.

Diagrama do Cotrole de Carga

Classe Sensors
  • Arquivos: Sensors.cpp, Sensors.h
  • Responsabilidade: Realiza a leitura da corrente e tensão da bateria e do painel solar.
  • Métodos Principais:
    • INA_init(): Inicializa os sensores INA219.
    • battery_current(), pv_current(): Retorna a corrente medida pela bateria e pelo sensor do painel solar.
    • battery_voltage(), pv_voltage(): Retorna a tensão medida pela bateria e pelo sensor do painel solar.
Classe TimeConfigurations
  • Arquivo: TimeConfigurations.h
  • Responsabilidade: Armazena as configurações de tempo relacionadas ao intervalo de leitura, tamanho máximo do cache e memória de longo prazo.
Classe TimerInterrupt
  • Arquivos: TimerInterrupt.cpp, TimerInterrupt.h

  • Responsabilidade: Gerencia as interrupções do temporizador para realizar operações periódicas.

  • Métodos Principais:

    • timer_init(): Inicializa o timer.
    • timer_interruption(): Método chamado em cada interrupção do temporizador.
    • tryToSendCacheToServer(): Tenta enviar dados do cache para o servidor.
Classe SaveToFlash
  • Arquivos: SaveToFlash.cpp, SaveToFlash.h

  • Responsabilidade: Gerencia o armazenamento e recuperação de dados de leituras na memória flash.

  • Métodos Principais:

    • mountLittleFS(): Monta o sistema de arquivos LittleFS.
    • saveToCache(), saveToLongTerm(): Salva as leituras no cache ou na memória de longo prazo.
    • get_readings_from_cache(), get_readings_from_longterm(): Recupera leituras do cache ou da memória de longo prazo.
  • Diagrama Memoria

    Classe Communicator
    • Arquivos: communicator.cpp, communicator.h, communicator_client_module.cpp, communicator_interruption_module.cpp, communicator_mqtt_module.cpp, communicator_server_module.cpp
    • Responsabilidade: Esta classe gerencia toda a comunicação do ESP32, atuando como um cliente para se conectar ao Broker MQTT, e como um servidor para interagir com o aplicativo móvel. A classe também gerencia a transição entre o modo de economia de energia e operação normal e lida com interrupções externas que podem sinalizar a necessidade de mudança no estado de operação.

    Diagrama do Wifi Client Diagrama do Wifi Server

    Métodos Principais

    • init(): Configura os componentes necessários e inicia a conexão Wi-Fi.
    • sleep(): Desativa o Wi-Fi para economizar energia.
    • reconnect_client(): Reconecta o ESP32 à rede Wi-Fi e ao broker MQTT após o período de sono.
    • attach_interruption(): Configura a interrupção externa que permite ao ESP32 alternar entre os modos cliente e servidor.
    • check_interruption_flag(): Verifica se uma interrupção ocorreu, indicando que o estado de operação deve ser alterado.
    • startServer(): Inicia o servidor HTTP para comunicação local com o aplicativo móvel.
    • connectToMQTT(): Estabelece conexão com o Broker MQTT e gerencia a reconexão se necessário.
    • handleClientRequests(): Processa as requisições recebidas quando o ESP32 está operando como servidor HTTP.
    • _setup_mqtt(): Configura o cliente MQTT com o servidor e porta corretos, e define a função de callback para mensagens recebidas.
    • _mqtt_loop(): Mantém a conexão MQTT ativa e processa qualquer mensagem recebida.
    • _wifi_ap_config(): Configura o ponto de acesso Wi-Fi quando o ESP32 está no modo servidor.
    • _stop_ap(): Desativa o ponto de acesso Wi-Fi e o servidor HTTP quando não são mais necessários.

    Observações

    • O método sleep() é crítico para a conservação de energia, especialmente em ambientes remotos onde a energia é limitada.
    • O sistema de interrupção permite que o dispositivo mude dinamicamente entre os modos de operação sem a necessidade de reinicialização ou interação manual.
    • A implementação do MQTT é robusta, com mecanismos de reconexão e callbacks para garantir a entrega de mensagens mesmo em condições de rede instáveis.

    Operação do Programa

    O ciclo de execução principal do programa é controlado pelo arquivo ProgramaFinal.ino, que coordena as operações das classes e gerencia o fluxo de controle do sistema. O arquivo contém a função setup() para inicialização e a função loop() para o ciclo de execução contínuo.

    • Na função setup(), o sistema inicia conectando-se à rede Wi-Fi e sincronizando o horário para garantir que os dados sejam timestamped corretamente.
    • Em seguida, os módulos de controle de carga e sensores são inicializados, preparando o sistema para começar o monitoramento e controle.
    • A função loop() entra em um ciclo onde:
      • A lógica de controle de carga é executada para ajustar o PWM e manter a tensão da bateria.
      • As leituras dos sensores são feitas e armazenadas periodicamente no cache local.
      • O sistema tenta enviar dados acumulados para o Broker MQTT e, em caso de sucesso, transfere esses dados para a memória de longo prazo.
      • Se o switch de acesso local for ativado, o ESP32 muda para o modo servidor, permitindo que o aplicativo móvel se conecte e interaja com o sistema.

    Documentação das APIs

    A comunicação com o ESP32 pode ser realizada através das seguintes APIs, disponíveis quando o ESP está em modo servidor:

    Operação Rota Query Params Body Retorno Observações
    GET /cache page: Numeric - JSON: Lista de leituras do cache, total de itens, itens por página (10) Máximo de 10 itens por página
    GET /ltm page: Numeric - JSON: Lista de leituras da memória, total de itens, itens por página (10) Máximo de 10 itens por página
    POST /reading - - JSON: Novas medições -
    POST /settings - JSON: Novas configurações - O app verifica o sucesso pela resposta do status code
    GET /settings - - JSON: Configurações atuais -
    GET /check - - String: "conectado!" Utilizado para verificar a conexão com o ESP

    Diagrama do Aplicativo

    Diagnóstico de Problemas e Soluções

    Durante o desenvolvimento, foram identificados e solucionados diversos desafios:

    • Problema de Versão do Proteus: Limitação da versão 8.9 do Proteus para salvar e abrir arquivos sem perder a compatibilidade.
    • Comportamento Inesperado de Tensões: Solucionado com a inclusão de uma resistência em paralelo à fonte de bancada.
    • Limitações dos ADCs do ESP32: Ajustes nas leituras analógicas para evitar conflitos entre o ADC2 e o uso do Wi-Fi e erros causados por tensões altas nos pinos do ADC1.

    Melhorias e Manutenção

    Algumas sugestões para melhorias futuras incluem:

    • Inclusão de novas configurações na classe de ajustes, como especificações técnicas variáveis da bateria.
    • Aumento da robustez do sistema contra falhas de conectividade.
    • Interface de usuário aprimorada no aplicativo móvel para facilitar a interação e o monitoramento.

    Manter a documentação atualizada e criar testes para novas funcionalidades são essenciais para a manutenção contínua do projeto.

    Estrutura de Arquivos

    O projeto está organizado em diretórios que separam cada componente e fase de desenvolvimento, facilitando a navegação e compreensão do sistema como um todo. Abaixo está a árvore de arquivos com a descrição de cada diretório e arquivo-chave:

    Mostrar File Tree
    .
    ├── App Mobile
    │   └── mobile
    │       ├── App.js
    │       ├── app.json
    │       ├── babel.config.js
    │       ├── package.json
    │       ├── src
    │       │   ├── assets
    │       │   │   ├── *.png
    │       │   ├── components
    │       │   │   └── components.js
    │       │   ├── pages
    │       │   │   ├── graph.js
    │       │   │   ├── home.js
    │       │   │   └── settings.js
    │       │   └── routes
    │       │       └── routes.js
    │       └── yarn.lock
    ├── Documentação
    │   ├── Cronograma/
    │   ├── Diagramas/
    │   ├── Planejamento/
    │   ├── Relatorios/
    │   └── Revisão de Lietratura/
    ├── logo/
    ├── Placa de Controle
    │   ├── Controle de Carga PWM
    │   │   ├── ESP32-Pinout.jpg
    │   │   ├── hardware/ -> (Antigo)
    │   │   ├── hardware proteus 8.9/ -> Placa Geral com tudo incluso
    │   │   ├── hardware_sep_by_function
    │   │   │   ├── controle_de_pot/
    │   │   │   ├── controle_de_pot-PWM/
    │   │   │   ├── controle_de_pot-SWITCH/
    │   │   │   ├── esp_and_sensors/
    │   │   │   └── reguladores_de_tensao/
    │   │   ├── imagens dos circuitos/
    │   │   ├── teste controle MOSFETs/
    │   ├── Cuk Converter/ -> Testes do inicio do projeto usando o conversor cuk (Não é usado mais)
    ├── Programas ESP
    │   ├── Desenvolvimento
    │   │   ├── 1-CurrentSensorExample/
    │   │   ├── 2-VoltageReadingExample/
    │   │   ├── 3-Current_Voltage_reading/
    │   │   ├── 4-PWMControlExample/
    │   │   ├── 5-BatteryControl/
    │   │   ├── 6-TimerInterrupt/
    │   │   ├── 7-BLE_server/
    │   │   ├── 8-LittleFS/
    │   │   ├── ESP-GetTime/
    │   │   ├── MainProject/
    │   │   └── Wifi-Server_Client/
    │   ├── ProgramaFinal
    │   │   ├── BatteryControl.cpp
    │   │   ├── BatteryControl.h
    │   │   ├── communicator_client_module.cpp
    │   │   ├── communicator.cpp
    │   │   ├── communicator.h
    │   │   ├── communicator_interruption_module.cpp
    │   │   ├── communicator_mqtt_module.cpp
    │   │   ├── communicator_server_module.cpp
    │   │   ├── FinalProgram.md
    │   │   ├── FinalProgram.xml
    │   │   ├── ProgramaFinal.ino
    │   │   ├── PubSubClient.cpp
    │   │   ├── PubSubClient.h
    │   │   ├── SaveToFlash.cpp
    │   │   ├── SaveToFlash.h
    │   │   ├── Sensors.cpp
    │   │   ├── Sensors.h
    │   │   ├── TimeConfigurations.h
    │   │   ├── TimerInterrupt.cpp
    │   │   └── TimerInterrupt.h
    │   └── pubsubclient-master.zip
    ├── README.md
    └── Referencias que o professor deu no inicio
      ├── *.pdf
    
    

    About

    Repositorio para o Projeto de Controle de Carregamento de Bateria com Painel Solar da Disciplica de Projetos de Sistemas Ubiquos de 23.2 na UFSC

    Topics

    Resources

    License

    Stars

    Watchers

    Forks

    Releases

    No releases published

    Packages

    No packages published

    Languages