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 comoextern
no 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_status
armazena 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_max
eumidade_max
sã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_acid
enormal_acid
: Definem os limites críticos e normais de pH ácido. Valores abaixo decritic_acid
acionam uma bomba para corrigir a acidez.critic_base
enormal_base
: Definem os limites críticos e normais de pH básico. Valores acima decritic_base
acionam uma bomba para corrigir a basicidade.HighTDS
eLowTDS
: Estabelecem os limites máximo e mínimo de sólidos dissolvidos totais (TDS). Abaixo deLowTDS
ou 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_level
para controlar o nível do pino evTaskDelay
para 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_base
oucritic_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_base
ounormal_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
peristaltic
em 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_t
para 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_max
para adicionar mais água. - Desliga a válvula se o nível for maior ou igual a
nivel_max
para 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
solenoide
em 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 |