Fluxo do firmware
Estrutura do Código
Arquivos circulação
Os arquivos circulacao.h e circulacao.c são responsáveis pelo controle da bomba de circulação de água no sistema de hidroponia. Juntos, eles gerenciam a ativação e desativação da bomba de circulação com base na distância medida por um sensor ultrassônico, garantindo que a bomba funcione apenas quando necessário, de acordo com o nível da água no reservatório.
Arquivo circulacao.h
O arquivo circulacao.h é o cabeçalho onde são feitas as declarações das funções e variáveis que serão utilizadas em outros arquivos. Ele contém:
-
Função
init_circulacao()
A funçãoinit_circulacao()é declarada aqui e será responsável por inicializar os recursos necessários para o controle da bomba de circulação, como a configuração do pino e a criação da tarefa de controle da bomba. -
Variável Externa
circulacao_status
A variávelcirculacao_statusé declarada comoexternno cabeçalho, permitindo que seja acessada em outros arquivos do sistema. Ela é usada para armazenar o estado atual da bomba (ligada ou desligada).
Arquivo circulacao.c
O arquivo circulacao.c contém a implementação das funções que controlam diretamente o comportamento da bomba de circulação. Ele inclui a configuração do pino de controle e a lógica de operação da bomba com base no nível de água. A estrutura deste arquivo é a seguinte:
-
Definição da Variável
circulacao_status
A variávelcirculacao_statusarmazena o estado atual da bomba de circulação (ligada ou desligada). Inicialmente, o valor é definido comofalse(desligado). -
Função
config_circulacao()
A funçãoconfig_circulacao()configura o pino de controle da bomba de circulação como uma saída digital no ESP32. A bomba é inicialmente configurada para estar desligada. -
Função
circula()
A funçãocircula()é onde ocorre a lógica de controle da bomba. Ela é executada em uma task do FreeRTOS e fica verificando continuamente a distância medida pelo sensor ultrassônico. Dependendo dessa distância, a bomba é ligada ou desligada: - Se a distância for menor ou igual ao valor limite (
circulacao_limite), a bomba é ligada. -
Se a distância for maior ou igual ao valor mínimo (
minimo_ciculcao), a bomba é desligada. -
Função
init_circulacao()
A funçãoinit_circulacao()é responsável por chamar a funçãoconfig_circulacao()para configurar o pino da bomba e, em seguida, cria a task que executará a funçãocircula()em um loop contínuo. Esta task garante que a bomba seja controlada de forma assíncrona.
Arquivos do exaustor
Os arquivos exaustor.h e exaustor.c controlam o funcionamento do exaustor com base nas leituras de temperatura e umidade, regulando o ambiente para garantir condições ideais. O sistema liga o exaustor sempre que a temperatura ou a umidade ultrapassam os limites máximos predefinidos, e o desliga quando as condições ambientais voltam aos níveis normais.
Arquivo exaustor.h
O arquivo exaustor.h contém as declarações essenciais que serão utilizadas no arquivo exaustor.c e em outros arquivos do projeto. Ele inclui:
- Definição de Variáveis Externas
temperatura_max: Temperatura máxima que aciona o exaustor.umidade_max: Umidade máxima que aciona o exaustor.-
exaustor_status: Variável que armazena o estado atual do exaustor (ligado ou desligado). -
Função
init_exaustor()
A funçãoinit_exaustor()é declarada no cabeçalho e será responsável por inicializar os recursos necessários para o controle do exaustor, como a configuração do pino e a criação da tarefa de controle.
Arquivo exaustor.c
O arquivo exaustor.c contém a implementação das funções que controlam o funcionamento do exaustor. Ele inclui a configuração do pino de controle, a lógica de operação do exaustor com base nas condições ambientais e a criação da task que executa a lógica de controle. A estrutura deste arquivo é a seguinte:
- Definição de Variáveis
temperatura_maxeumidade_maxsão definidos com valores padrão (40°C para temperatura e 70% para umidade).-
exaustor_status: Inicialmente, o exaustor está desligado (false). -
Função
config_exaustor()
A funçãoconfig_exaustor()configura o pino de controle do exaustor como saída digital no ESP32. O pino é inicializado desligado (nível baixo). -
Função
exaustor()
A funçãoexaustor()executa a lógica de controle do exaustor em uma task do FreeRTOS. Ela fica verificando periodicamente os valores de temperatura e umidade lidos pelo sensor DHT11: - Se a temperatura ou a umidade ultrapassarem os valores máximos definidos, o exaustor é ligado.
-
Se ambos os valores estiverem abaixo dos limites e o status do DHT11 for bem-sucedido (indicando que a leitura foi realizada corretamente), o exaustor é desligado.
-
Função
init_exaustor()
A funçãoinit_exaustor()chama a funçãoconfig_exaustor()para configurar o pino do exaustor e cria uma task para monitorar e controlar o exaustor. A task é executada em um loop contínuo, verificando as condições de temperatura e umidade.
Arquivos hora
Os arquivos hora.h e hora.c controlam a sincronização de hora da ESP32 utilizando o protocolo NTP (Network Time Protocol). O sistema obtém a hora atual da internet e a ajusta para o fuso horário local, permitindo que a ESP32 tenha um horário preciso. As funções implementadas garantem que o horário seja sincronizado corretamente e possa ser utilizado em diversas aplicações.
Arquivo hora.h
O arquivo hora.h contém as declarações essenciais para o controle do horário. Ele inclui:
- Funções Declaradas
init_sntp(): Função que inicializa o SNTP (Simple Network Time Protocol) para obter a hora da internet.update_time(): Função que atualiza o horário do sistema utilizando o NTP.get_formatted_time(): Função que obtém o horário atual formatado como string.
Arquivo hora.c
O arquivo hora.c contém a implementação das funções que controlam a sincronização do horário e a formatação do horário local. Ele inclui a inicialização do SNTP, a atualização do horário com base no NTP e a configuração do fuso horário para o horário local. A estrutura deste arquivo é a seguinte:
-
Inicialização do SNTP
A funçãoinit_sntp()inicializa o SNTP e define o servidor NTP (pool.ntp.org) para sincronizar a hora da ESP32 com a internet. O SNTP é configurado para funcionar no modo de polling. -
Configuração do Fuso Horário
A funçãoconfigure_timezone()permite configurar o fuso horário local da ESP32. Ela utiliza a funçãosetenv()para definir a variável de ambiente "TZ" etzset()para aplicar o fuso horário. -
Função
update_time()
A funçãoupdate_time()é responsável por atualizar o horário da ESP32. Ela verifica repetidamente se o horário foi sincronizado corretamente com o servidor NTP e, quando isso ocorre, configura o fuso horário para o horário local (no exemplo, "BRT3" para o horário de Brasília). -
Função
get_formatted_time()
A funçãoget_formatted_time()obtém a hora atual da ESP32 e a converte para o formatodd/mm/yy HH:MM:SS. O horário é obtido utilizando as funçõestime()elocaltime_r(), e a formatação é feita com a funçãostrftime(). A string formatada é armazenada no buffer passado como argumento.
Arquivos led
Os arquivos led.h e led.c controlam a ativação e desativação de um relé com base em horários predefinidos. O sistema verifica continuamente o horário atual e aciona o relé (e consequentemente o LED) dentro de um intervalo de tempo específico. O relé é ativado no horário de início e desativado no horário de fim.
Arquivo led.h
O arquivo led.h contém as declarações necessárias para o controle do relé. Ele inclui:
- Definição de Variáveis Externas
start_hour,start_minute,start_second: Horário de início para a ativação do relé.stop_hour,stop_minute,stop_second: Horário de fim para a desativação do relé.-
led_status: Variável que armazena o status atual do LED (ativado ou desativado). -
Função
start_rele_task()
A funçãostart_rele_task()inicia a tarefa de controle do relé, configurando o pino de controle e criando a task do FreeRTOS para verificar continuamente o horário e controlar o relé.
Arquivo led.c
O arquivo led.c contém a implementação das funções que controlam a ativação e desativação do relé com base no horário. Ele inclui a configuração do pino de controle do relé, a lógica de controle do relé em uma task do FreeRTOS, e a atualização do status do relé. A estrutura deste arquivo é a seguinte:
-
Função
rele_control_init()
A funçãorele_control_init()configura o pino de controle do relé como saída digital no ESP32. O relé é inicialmente configurado para o estado "desligado" (nível baixo). -
Função
rele_task()
A funçãorele_task()verifica o horário atual a cada 5 segundos (utilizandovTaskDelay()). Ela compara o horário atual com os horários de início e fim: - Se o horário estiver dentro do intervalo predefinido, o relé é ativado (e o LED é ligado).
-
Se o horário estiver fora do intervalo, o relé é desativado (e o LED é desligado). O status do LED é registrado no log utilizando
ESP_LOGI(). -
Função
start_rele_task()
A funçãostart_rele_task()chama a funçãorele_control_init()para configurar o relé e cria a task do FreeRTOS para monitorar continuamente o horário e controlar o relé. A task é criada com uma prioridade de 5 e um tamanho de pilha de 4096 bytes.
Arquivos peristaltic
Os arquivos peristaltic.h e peristaltic.c realizam o controle do Ph e DTS através do acionamento de bombas peristalticas que adicionam soluções conforme a necessidade.
Arquivo peristaltic.h
O arquivo peristaltic.h contém as declarações essenciais que serão utilizadas no arquivo peristaltic.c e em outros arquivos do projeto. Ele inclui:
- Funções Declaradas
config_peristaltic(): Função que configura os pinos das bombas.peristaltic(void *pvParameter): Função que realilza a regulagem do PH e TDS adicionando soluções de correção.addSoluc(uint8_t bomba, uint16_t tempo): Função genérica que liga a bomba por um tempo determinado pela variável tempo.init_peristaltic(): é declarada no cabeçalho e será responsável por inicializar os recursos necessários para o controle do exaustor, como a configuração do pino e a criação da tarefa de controle.
Arquivo peristaltic.c
O arquivo peristaltic.c contém a implementação das funções que mantém o equilíbrio dos níveis de pH e TDS conforme os parâmetros configurados, ajustando automaticamente quando necessário. Ele inclui a configuração do pino de controle, a lógica de operação das bombas peristalticas e a criação da task que executa a lógica de controle. A estrutura deste arquivo é a seguinte:
- Definição de Variáveis
critic_acidenormal_acid: Definem os limites críticos e normais de pH ácido. Valores abaixo decritic_acidacionam uma bomba para corrigir a acidez.critic_baseenormal_base: Definem os limites críticos e normais de pH básico. Valores acima decritic_baseacionam uma bomba para corrigir a basicidade.HighTDSeLowTDS: Estabelecem os limites máximo e mínimo de sólidos dissolvidos totais (TDS). Abaixo deLowTDSou acima deHighTDS, ações específicas são tomadas.-
water_need: Flag para indicar a necessidade de adicionar água. Controla a lógica de ajustes do sistema. -
config_peristaltic: - Configura os pinos GPIO para controlar as bombas peristálticas.
-
Define os pinos como saída e aplica resistores de pull-down para garantir que os estados inativos sejam mantidos em baixo (LOW).
-
addSoluc: - Ativa uma bomba específica por um tempo determinado (em milissegundos) e depois a desativa.
-
Utiliza
gpio_set_levelpara controlar o nível do pino evTaskDelaypara criar o atraso necessário. -
peristaltic: - Função principal executada como uma tarefa FreeRTOS que monitora continuamente os níveis de pH e TDS.
- Fluxo da lógica:
- Monitoramento de pH: Se o pH estiver fora dos limites críticos (
critic_baseoucritic_acid), ativa as bombas de ácido ou base para correção. - Monitoramento de TDS: Se o TDS for muito baixo (
LowTDS), ativa bombas para adicionar solução. Se for muito alto (HighTDS), indica necessidade de adicionar água. - Ajustes normais de pH: Se o pH estiver fora dos limites normais (
normal_baseounormal_acid), ativa as bombas correspondentes.
- Monitoramento de pH: Se o pH estiver fora dos limites críticos (
-
Após cada ciclo de controle, insere um atraso de 100ms para evitar leituras excessivas.
-
init_peristaltic: - Inicializa o sistema de controle das bombas peristálticas.
- Configura os pinos GPIO chamando
config_peristaltic. - Cria uma tarefa FreeRTOS para executar a função
peristalticem paralelo.
Arquivos solenoide
Os arquivos solenoide.h e solenoide.c são responsáveis pelo controle automatizado do nível de um reservatório. Eles acionam uma válvula solenóide com base nos dados fornecidos por um sensor ultrassônico, que monitora continuamente o nível do líquido no reservatório, ajustando o funcionamento da válvula conforme a necessidade.
O que acha?
Arquivo solenoide.h
O arquivo solenoide.h contém as declarações essenciais que serão utilizadas no arquivo solenoide.c e em outros arquivos do projeto. Ele inclui:
- Função
init_solenoide()
A funçãoinit_solenoide()é declarada no cabeçalho e será responsável por inicializar os recursos necessários para o controle da válvula solenoide. Isso inclui a configuração dos pinos GPIO e a criação da tarefa que monitora e controla a válvula conforme o nível de água do reservatório.
Arquivo solenoide.c
O arquivo solenoide.c implementa o controle da válvula solenoide para gerenciar o nível de água no reservatório. Ele utiliza as leituras de um sensor ultrassônico para monitorar o nível de água e ajusta o estado da válvula com base em parâmetros predefinidos. Além disso, considera o estado da flag water_need para determinar se há necessidade de água adicional devido aos níveis de TDS. A estrutura deste arquivo é a seguinte:
- Definição de Variáveis
TAG: String usada para identificar mensagens de log relacionadas à funcionalidade da válvula solenoide.nivel_max: Distância máxima da água no reservatório. Quando alcançada, a válvula é fechada para evitar transbordamento.nivel_ideal: Distância ideal da água no reservatório. O sistema tenta manter o nível próximo a esse valor.nivel_min: Distância mínima da água no reservatório. Quando ultrapassada, a válvula é aberta para reabastecer o reservatório.-
water_distance: Variável global que armazena a distância atual medida pelo sensor ultrassônico. Utilizada para avaliar o nível de água no reservatório. -
config_solenoide - Configura o pino GPIO associado à válvula solenoide.
- Define o pino como saída e habilita o resistor de pull-down para garantir que o estado inicial da válvula seja desligado (LOW).
-
Utiliza a estrutura
gpio_config_tpara aplicar as configurações. -
solenoide - Função principal que executa o controle dinâmico da válvula de entrada de água em um loop infinito.
- Fluxo da Lógica:
- Obtém o nível atual da água no reservatório usando a função
get_distance. - Verifica o estado de
water_need:- Quando
water_needé falso (sem necessidade de ajuste devido ao TDS): - Se o nível de água estiver acima ou igual a
nivel_max, desliga a válvula para evitar transbordamento. - Se o nível estiver abaixo de
nivel_min, liga a válvula para reabastecer o reservatório. - Se o nível estiver próximo de
nivel_ideal, desliga a válvula para estabilizar o sistema. - Quando
water_needé verdadeiro (necessidade de água devido a TDS alto): - Liga a válvula se o nível de água estiver abaixo de
nivel_maxpara adicionar mais água. - Desliga a válvula se o nível for maior ou igual a
nivel_maxpara evitar transbordamento.
- Quando
- Após cada ciclo de controle, insere um atraso de 100ms para evitar leituras excessivas e sobrecarga do sistema.
-
Registra mensagens de log (
ESP_LOGI) para informar o estado da válvula e as ações tomadas. -
init_solenoide - Inicializa o sistema de controle da válvula solenoide.
- Configura os pinos GPIO chamando a função
config_solenoide. - Cria uma tarefa FreeRTOS que executa continuamente a função
solenoideem paralelo, permitindo o controle dinâmico e independente da válvula.
| Versão | Data | Modificação | Autor |
|---|---|---|---|
| 1.0 | 20/01/2025 | Documento inicial criado. | Mariana Gomes |
| 1.1 | 20/01/2025 | Arquivos hora | Mariana Gomes |
| 1.2 | 20/01/2025 | Arquivos led | Mariana Gomes |
| 1.3 | 20/01/2025 | Arquivos das bombas e nivel do reservatorio | João Vitor |