Contents — find the section you need

Tanques de nutrientes CEA — contabilizando reposição e diluição

Restaurando volume e concentração juntos

Um tanque contém 90 L a 80 mg/L de um componente rastreado. Adicionar 10 L de água livre de componente restaura o volume para 100 L, mas reduz a concentração para 72 mg/L. Um nível baixo e um déficit de componente, portanto, exigem contabilização separada.

Este guia estende os fundamentos da zona radicular para operações discretas. Todos os valores são sintéticos; 100 mg/L é uma meta aritmética, não uma recomendação de cultura. Rastreamos um componente de concentração conhecida, sem calcular uma receita de fertilizante, concentração a partir da CE, ou doses de ácido/base.

Defina o limite

Assuma um único tanque perfeitamente misturado com o suprimento e o retorno do circuito de cultura interrompidos. Durante cada operação não há absorção, evaporação, precipitação ou reação, e os volumes de líquido são aditivos. Um tanque em operação precisa de fluxos de volume e componente de suprimento e retorno em seu balanço. Se o limite envolve todo o sistema de circulação, a circulação interna não é reposição externa.

Para volume V [L], concentração C [mg/L] e massa de componente dissolvido M [mg], M=VC. Adicionar volume V_a na concentração C_a resulta em

V_1=V_0+V_a,\qquad M_1=V_0C_0+V_aC_a,\qquad C_1=\frac{M_1}{V_1}

Use C_a=0 apenas se a água adicionada não contiver o componente rastreado. O guia de gestão de nutrientes da OSU descreve a análise da água de origem e a atenção à concentração de sais, pH, alcalinidade e proporções de nutrientes.

Compare três adições

Comece com 90 L a 80 mg/L: 7.200 mg. Assuma uma concentração de estoque de 10.000 mg/L para este componente.

Operação Volume final Massa final de componente Concentração final
Adicionar 10 L de água livre de componente 100 L 7.200 mg 72,00 mg/L
Adicionar cerca de 0,181818 L apenas de estoque Cerca de 90,181818 L Cerca de 9.018,18 mg 100,00 mg/L
Adicionar 0,28 L de estoque e 9,72 L de água 100 L 10.000 mg 100,00 mg/L

O estoque também adiciona volume. Para a concentração alvo C_t, concentração de estoque C_s e volume de estoque x,

\frac{V_0C_0+xC_s}{V_0+x}=C_t \quad\Rightarrow\quad x=\frac{V_0(C_t-C_0)}{C_s-C_t}

Aumentar a concentração requer C_s>C_t>C_0. Um estoque na concentração alvo não consegue levar uma concentração inicial mais baixa exatamente àquele alvo com uma adição finita. Uma solução negativa indica que a adição proposta não consegue atingir o objetivo.

Se o volume final V_f também for prescrito e a água de reposição não contiver o componente,

x=\frac{V_fC_t-V_0C_0}{C_s},\qquad V_{water}=V_f-V_0-x

Ambas as adições devem ser não negativas e o volume final deve caber no recipiente. Aqui elas são 0,28 L de estoque e 9,72 L de água. Especificar apenas a concentração dá uma resposta diferente de especificar tanto a concentração quanto o volume.

Drenagem e diluição têm efeitos diferentes

Agora comece com 100 L a 120 mg/L: 12.000 mg. Drenar 10 L de solução bem misturada remove 1.200 mg. O restante é 90 L e 10.800 mg, ainda a 120 mg/L. Adicionar 10 L de água livre de componente resulta então em 100 L a 108 mg/L.

Adicionar 20 L de água sem drenar resulta, em vez disso, em 120 L a 100 mg/L. O tanque ainda contém 12.000 mg, e precisa de mais capacidade de reserva.

Condição Equação Limite
Drenar D L primeiro, depois repor com água C_1=C_0(1-D/V_0) Mistura perfeita; reabastecimento livre de componente
Adicionar W L de água sem drenar C_1=V_0C_0/(V_0+W) O volume aumenta
Entrada e saída simultâneas em volume constante C(t)=C_{in}+(C_0-C_{in})e^{-Qt/V} Mistura perfeita, vazão constante, sem absorção ou reação

Para a substituição simultânea de 10 L, Qt/V=0,1 e C_{in}=0 resultam em cerca de 108,58 mg/L. Isso difere dos 108 mg/L obtidos drenando primeiro. A ordem das operações pertence ao registro.

Reproduza a contabilização em Python

Salve como tank_accounting.py e execute python3 tank_accounting.py. Usa apenas a biblioteca padrão.

from math import isfinite


def mix(v, c, added_v, added_c):
    values = (v, c, added_v, added_c)
    if not all(isfinite(x) for x in values):
        raise ValueError("finite values required")
    if v <= 0 or min(c, added_v, added_c) < 0:
        raise ValueError("invalid volume or concentration")
    return (v * c + added_v * added_c) / (v + added_v)


v, c, target, stock = 90.0, 80.0, 100.0, 10000.0
x = v * (target - c) / (stock - target)
print(f"water top-up: {mix(v, c, 10, 0):.2f} mg/L")
print(f"stock addition: {x:.6f} L, {mix(v, c, x, stock):.2f} mg/L")
y = (100 * target - v * c) / stock
print(f"fixed final volume: stock {y:.2f} L, water {10-y:.2f} L")
print(f"drain then refill: {mix(90, 120, 10, 0):.2f} mg/L")
print(f"dilute only: {mix(100, 120, 20, 0):.2f} mg/L")

As saídas são 72,00 mg/L; 0,181818 L e 100,00 mg/L; 0,28 L e 9,72 L; 108,00 mg/L; e 100,00 mg/L. Antes de experimentar com outra concentração de estoque, verifique as condições de alcançabilidade acima e certifique-se de que o denominador não seja zero.

Da contabilização ao controle

O guia de teste de água de irrigação da OSU explica que CE e TDS não identificam concentrações individuais de sais. Substituir CE por C não consegue calcular a reposição de um componente específico. Um fertilizante misto altera vários componentes de uma vez, então atingir um alvo não restaura toda a composição.

Um sensor também não precisa alcançar a previsão de mistura perfeita imediatamente. O guia de gestão de nutrientes da OSU exige agitação e a estabilização das leituras. Com base nessa distinção, este artigo propõe o seguinte ponto de partida para o projeto de controle:

  1. Registre o horário inicial, o volume, o local de amostragem, a base para a concentração de componente, a CE, a temperatura do líquido e o pH.
  2. Registre a composição do estoque, os volumes reais de adição e drenagem, e o estado de circulação. A duração do comando da bomba isoladamente não estabelece a vazão real.
  3. Aguarde um intervalo de mistura estabelecido no equipamento e medições estáveis antes de reavaliar. Evite empilhar comandos adicionais em resposta a uma leitura local imediatamente após a injeção.
  4. Preserve os erros de previsão. Interrompa adições adicionais para investigar níveis anormais, discrepâncias de vazão ou medições desatualizadas. Estabeleça tolerâncias e limites de dose na instalação real.

Isso não é uma especificação completa de sistema de dosagem. Os exemplos trabalhados validam a consistência aritmética de volume, massa de componente e concentração sob as premissas declaradas. A próxima etapa é conectar as operações comandadas às observações usando a vazão medida da bomba e a resposta de mistura.

Bombas de dosagem CEA — calibração de volume e esperas de mistura

Duas verificações antes de chamar uma adição de "20 mL"

O guia de contabilização do tanque calculou adições a partir de balanços de água e componente. Um valor calculado de 20 mL ainda não especifica um tempo de execução da bomba. Concluir a injeção também não significa que uma leitura do tanque seja representativa.

Este guia separa a calibração de comando para volume da verificação de quando as medições pós-injeção podem ser reavaliadas. Cada conjunto de dados abaixo é um exemplo sintético original, não desempenho medido de um dispositivo ou cultura. O código não opera equipamentos nem calcula receitas de fertilizante.

Mantenha as condições de calibração constantes

O guia de injetores de fertilizante da University of Georgia explica a calibração e manutenção periódicas, faixas de vazão operacional e condições de pressão. A proporção de um injetor proporcional à água é diferente do mL/s de uma bomba comandada por tempo, considerada aqui.

Para um experimento de coleta, siga o manual do equipamento e registre as condições de forma consistente:

Registro Finalidade
Bomba, ajuste de velocidade, tubulação, válvulas e histórico de manutenção Identificar a configuração calibrada
Líquido, temperatura e densidade, se usados Manter um teste com água distinto de um teste com solução de estoque
Nível de sucção, elevação/pressão de descarga e tubulação Preservar diferenças entre a coleta e a operação
Escorva, bolhas e tempo ocioso anterior Identificar diferenças de partida
Início/parada do comando, fim da coleta e volume coletado Definir se o gotejamento pós-parada está incluído

Desconectar a tubulação de descarga para a coleta pode alterar a contrapressão. Uma configuração de coleta simples não estabelece por si só a entrega no sistema instalado. Mantenha as verificações preliminares com água separadas da confirmação com o líquido pretendido.

Ao pesar, converta a massa líquida coletada \Delta m [g] usando a densidade do líquido \rho [g/mL]: V=\Delta m/\rho [mL]. Não assuma que todo líquido tem densidade de 1 g/mL. Registre a resolução da balança, o status de calibração e a precisão de tempo.

Uma média de longo prazo pode representar mal uma adição curta

Assuma três testes em cada duração, todos começando no mesmo estado.

Comando [s] Três volumes sintéticos [mL] Média [mL]
10 15, 16, 17 16
20 35, 36, 37 36
30 55, 56, 57 56
60 115, 116, 117 116

As médias seguem V(t)=at+b=2t-4 [mL], com a em mL/s e b em mL. Uma meta de 20 mL resulta em (20-b)/a=12 s. Usar apenas a inclinação resulta em 10 s e apenas 16 mL neste exemplo.

Usar o fluxo médio de 60 s, 116/60 mL/s, resulta em cerca de 10,34 s para 20 mL. A equação sintética prevê cerca de 16,69 mL nessa duração. Qual "taxa de fluxo" é usada importa.

O intercepto de −4 mL é um coeficiente de regressão sobre a faixa amostrada, não prova de um atraso puro físico de dois segundos. Não extrapole fora de 10–60 s, especialmente em direção a zero. Para dados medidos, inspecione os resíduos e considere um modelo separado de curta duração se a relação se curvar.

Cada linha sintética tem um desvio padrão amostral de 1 mL. Um erro de regressão zero sobre as médias não remove a variação individual de cada disparo. Três repetições também não estabelecem a variabilidade dia a dia ou o viés da balança. Verifique as previsões medidas usando durações e testes adicionais excluídos do ajuste.

Separe a conclusão da injeção da confirmação da mistura

O guia de gestão de nutrientes da OSU exige agitação e leituras estáveis antes da avaliação. Estabelecer uma espera requer uma série temporal pós-injeção distinta da calibração de volume.

Registre medições sincronizadas afastadas do ponto de injeção, bem como próximas a ele. Documente o volume, a vazão de circulação, os locais de injeção e do sensor, a temperatura e a filtragem do sensor. Mistura, transporte e resposta do sensor contribuem todos para a dinâmica observada; um único tempo de resposta ajustado não é automaticamente um tempo de mistura puro.

Para ilustração, normalize uma mudança do valor inicial y_0 para um valor final conhecido y_\infty:

z(t)=\frac{y(t)-y_0}{y_\infty-y_0}=1-e^{-t/\tau}

O tempo zero é a conclusão da injeção. Esta é uma resposta de medição local sintética, não um modelo de tanque com conservação de massa. Assuma constantes de tempo de 40 s e 80 s nos locais A e B. Suas respostas de tempo contínuo entram em uma faixa de 5% ao redor da mudança final após aproximadamente 120 s e 240 s.

Diagram 1 · Use the button to switch views
Dados sintéticos de comando-volume e duas respostas normalizadas. A linha tracejada marca o limiar ilustrativo de resposta de 95%.

Acima: três volumes coletados por duração e a linha ajustada às suas médias. Abaixo: respostas sintéticas A e B. O tempo está em segundos, o volume em mL e a resposta normalizada é adimensional. Nenhum dado medido é mostrado.

Agora imponha uma regra didática: com amostras a cada 10 s, ambos os locais devem permanecer dentro de 5% por 30 s antes da confirmação. B se qualifica primeiro aos 240 s. As quatro amostras em 240, 250, 260 e 270 s fornecem confirmação aos 270 s. Verificar apenas A se qualificaria aos 150 s e deixaria B de lado.

Nem 5% nem 30 s são um critério universal de aceitação. Escolha os critérios usando ruído/precisão da medição, desvio de concentração aceitável e intervalo de amostragem. Estime os valores finais de forma independente, por exemplo a partir de registros suficientemente longos, e também inspecione as diferenças entre os valores finais dos locais. Normalizar cada local separadamente pode ocultar diferenças espaciais persistentes de concentração. Não use essa normalização quando a mudança de inicial para final for pequena em relação ao ruído.

Reproduza os cálculos

Salve como pump_mixing.py e execute python3 pump_mixing.py. Apenas a biblioteca padrão é necessária.

from math import exp
from statistics import mean

# Synthetic data only; time [s], collected volume [mL].
runs = {10: [15, 16, 17], 20: [35, 36, 37],
        30: [55, 56, 57], 60: [115, 116, 117]}
ts = list(runs)
vs = [mean(runs[t]) for t in ts]
tm, vm = mean(ts), mean(vs)
a = sum((t-tm)*(v-vm) for t, v in zip(ts, vs)) / sum((t-tm)**2 for t in ts)
b = vm - a*tm
command = (20-b)/a
if not min(ts) <= command <= max(ts):
    raise ValueError("command outside calibration range")
print(f"fit: V = {a:.2f} t {b:+.2f}; 20 mL command = {command:.2f} s")
print(f"held-out 40 s: predicted {a*40+b:.2f} mL; reference 76.00 mL")

# Two synthetic normalized responses, sampled every 10 s.
# Four consecutive samples span 30 s. No missing samples here.
times = list(range(0, 401, 10))
errors = [max(exp(-t/40), exp(-t/80)) for t in times]
ready = next((times[i] for i in range(3, len(times))
              if all(e <= 0.05 for e in errors[i-3:i+1])), None)
print(f"two-location confirmation = {ready} s")

As saídas são inclinação 2,00, intercepto −4,00, um comando de 12,00 s para 20 mL, 76,00 mL aos 40 s, e confirmação aos 270 s. A referência dos 40 s reservados também vem da mesma equação sintética, então não é evidência de generalização para equipamento real. Mudar a constante de tempo de 80 s para 120 s resulta em confirmação aos 390 s. Se não existir uma janela qualificadora no registro, o código retorna None.

Conecte as verificações à permissão para outra adição

Uma implementação de controle precisa de mais do que um temporizador. Este artigo propõe estágios separados para pré-verificações, uma adição, espera de mistura/medição e reavaliação. Comandos fora da faixa, leituras ausentes ou desatualizadas, circulação parada, níveis anormais ou falha em estabilizar dentro do período de observação devem impedir adições adicionais até que se investigue. Não preencha amostras ausentes com o valor anterior e conte isso como estabilidade contínua.

Uma leitura de CE abaixo do alvo após a espera não estabelece imediatamente um déficit de componente específico; preserve a distinção entre CE e composição explicada nos fundamentos da zona radicular. A próxima etapa é avaliar as previsões de entrega e os critérios de espera em relação a registros medidos antes de projetar o controle de dosagem com limites por adição, cumulativos e de repetição.

Controle de dosagem CEA — limites, esperas de medição e estados de falha

Uma leitura baixa não justifica adições repetidas

A calibração da bomba e as esperas de mistura separaram o volume entregue do momento em que as observações se estabilizam. A próxima questão é se outra adição está atualmente permitida. Uma leitura baixa durante a mistura, uma amostra antiga ou circulação parada não estabelecem essa permissão.

Este guia propõe um projeto didático com estados operacionais separados e verificações sobre volume, número de tentativas e observações. Todos os valores e entradas são sintéticos, não limites operacionais ou recomendações de fertilizante. O exemplo em Python reproduz apenas um portão de autorização; não opera uma bomba.

Calcule um candidato, depois decida se ele pode ser executado

Um candidato derivado da contabilização do tanque ainda precisa de verificações contra a faixa de calibração, o estado do equipamento e observações que possam avaliar a operação anterior.

O guia de injetores da UGA explica a calibração e manutenção periódicas. O guia de gestão de nutrientes da OSU exige agitação e leituras estáveis antes da avaliação. Os estados e limites abaixo são o projeto proposto por este artigo, não uma especificação de controlador fornecida por nenhuma das fontes.

Separe seis estados operacionais

Estado Atividade Condição de transição
CHECK Valida observações, candidato, orçamento restante e equipamento Registra uma reserva antes de DOSE; vai para DONE se o objetivo já foi atingido
DOSE Emite um comando para um ID de operação único Confirma a parada antes de WAIT; timeout ou incompatibilidade de vazão leva a FAULT
WAIT Proíbe novas adições e coleta observações pós-parada Observações qualificadoras levam a REVIEW; falha em estabilizar até o prazo leva a FAULT
REVIEW Reavalia observações e histórico DONE se satisfeito, CHECK se outro candidato é justificado, FAULT para inconsistências
DONE Mantém a saída parada e fecha o registro Uma operação subsequente requer uma nova decisão operacional
FAULT Solicita a parada e proíbe adições adicionais Recuperação explícita após verificar a causa, a quantidade entregue e o equipamento

Emitir um comando de parada é diferente de confirmar que o fluxo parou. Nomes de estado de software não conseguem evitar uma válvula ou bomba com falha. Uma implementação também precisa de retroalimentação de saída, mecanismos de parada do lado do equipamento e comportamento de reinício definido.

Não faça o FAULT retornar automaticamente ao CHECK após uma breve espera. Repetir uma operação sem resolver sua causa pode acumular adições não intencionais.

Cobre o orçamento antes de emitir o comando

Use limites ilustrativos de 16–20 mL por adição, 50 mL por sessão operacional e no máximo três autorizações. O mínimo de 16 mL corresponde à calibração sintética do artigo anterior aos 10 s. Esses números não são configurações de equipamento.

Para o volume já cobrado B [mL] e o candidato d [mL], exija

16\le d\le20,\qquad B+d\le50,\qquad n<3

Na autorização, registre B\leftarrow B+d e n\leftarrow n+1 antes de prosseguir para o comando. Este registro representa a capacidade de autorização consumida, não a entrega medida. Se a comunicação falhar imediatamente após um comando, não assuma entrega zero e reembolse sua capacidade. Registre a entrega medida e a incerta separadamente.

Operação sintética Candidato Total cobrado após a decisão Resultado
Primeira 16 mL 16 mL Permitir
Segunda, após parada, mistura e revisão 16 mL 32 mL Permitir
Terceira, após revisão 18 mL 50 mL Permitir
Quarta 16 mL 50 mL Rejeitar: limite de tentativas

Uma solicitação de 20 mL após cobrar 32 mL é rejeitada porque alcançaria 52 mL, mesmo com uma tentativa restante. Reconsidere as observações e a base do candidato em vez de cortar automaticamente a dose para a capacidade restante.

Aqui uma sessão é uma sequência de correção com início e fim registrados. Uma iteração de loop, atualização de página ou reconexão não é uma nova sessão. Um sistema operacional precisa de condições explícitas de renovação de orçamento, como uma janela de tempo definida ou substituição do tanque, e registros que sobrevivam a um reinício. Este exemplo não tem persistência.

Verifique a atualidade separadamente da estabilidade

O horário de recebimento sozinho não estabelece atualidade. Considere o horário de medição da fonte, a sincronização de relógio e a ordem em relação à operação. Aqui age_s é uma idade de medição já convertida, aceita apenas entre zero e cinco segundos. Uma idade negativa proveniente de um timestamp futuro também é rejeitada.

after_stop significa que a observação segue a confirmação da parada anterior. Para a adição inicial, use uma observação obtida após o início da pré-verificação atual. stable é uma decisão a montante baseada em uma sequência de observações, como discutido no guia anterior. Um único valor inalterado não estabelece estabilidade: avalie dados ausentes, sensores travados e discordância entre locais.

Cinco segundos é uma suposição didática. Um limite incompatível com o intervalo de amostragem e o atraso de comunicação pode rejeitar observações úteis. Simplesmente aumentá-lo não resolve problemas de dados desatualizados.

Experimente o portão de autorização em Python

Salve como dosing_gate.py e execute python3 dosing_gate.py. Apenas a biblioteca padrão é necessária.

from math import isfinite


def gate(state, dose_ml, charged_ml, attempts, age_s,
         after_stop, stable, circulation, level_ok):
    """Offline authorization check; no hardware commands or persistence."""
    if state != "CHECK":
        return "STATE"
    if not all(isfinite(x) for x in (dose_ml, charged_ml, age_s)):
        return "INVALID"
    if charged_ml < 0 or type(attempts) is not int or attempts < 0:
        return "INVALID"
    if not all(type(x) is bool for x in
               (after_stop, stable, circulation, level_ok)):
        return "INVALID"
    if not circulation or not level_ok:
        return "INTERLOCK"
    if not 0 <= age_s <= 5 or not after_stop:
        return "STALE"
    if not stable:
        return "UNSTABLE"
    if not 16 <= dose_ml <= 20:
        return "DOSE_RANGE"
    if attempts >= 3:
        return "ATTEMPTS"
    if charged_ml + dose_ml > 50:
        return "BUDGET"
    return "ALLOW"


if __name__ == "__main__":
    charged, attempts, state = 0.0, 0, "CHECK"
    for requested in (16, 16, 18, 16):
        result = gate(state, requested, charged, attempts, 1,
                      True, True, True, True)
        if result == "ALLOW":
            # Charge BEFORE a simulated command; never refund uncertainty.
            charged += requested
            attempts += 1
            state = "WAIT"
        print(f"{requested} mL: {result}; charged={charged:.0f} mL")
        # Synthetic successful stop/mixing/reassessment, not a timer.
        state = "CHECK"

As três primeiras decisões são ALLOW; a quarta é ATTEMPTS. Os totais cobrados são 16, 32, 50 e 50 mL. Redefinir o estado de demonstração para CHECK ao final de cada iteração representa parada, mistura e reavaliação bem-sucedidas sintéticas. Uma implementação não deve executar essa transição apenas porque um temporizador fixo expirou.

Esta função é um portão didático offline com argumentos numéricos. Não interpreta entradas de comunicação, não calcula uma dose, não estabelece estabilidade, não monitora o fluxo real nem executa a máquina de estados. Rejeita NaN, infinito, volumes cobrados negativos e contagens de tentativas inválidas, mas não é uma API externa completa de entrada.

Exercite os limites de rejeição

Entrada ou situação Resultado esperado
Outro candidato chega em WAIT STATE; sem cobrança adicional de orçamento ou comando
A idade é seis segundos ou negativa STALE
A observação precede a parada, ou não é estável STALE ou UNSTABLE
Circulação parada ou nível anormal INTERLOCK
O candidato é 15 ou 21 mL DOSE_RANGE
Solicitação de 20 mL após cobrar 32 mL BUDGET
O candidato ou o volume cobrado é NaN INVALID

Uma implementação também deve testar que o reenvio de um ID de operação não pode executar duas vezes. Confirme as alterações de orçamento e os IDs de operação juntos, para que solicitações concorrentes não consigam gastar a mesma capacidade restante. Após uma interrupção, reconcilie os comandos persistidos com o estado real do equipamento antes de retomar.

O que isso estabelece

O exemplo verifica decisões de autorização contra entradas e limites fornecidos. Não infere déficits individuais de componente a partir da CE nem quantidades de ácido a partir de diferenças de pH. Também não valida crescimento, produtividade, segurança de equipamento ou rastreamento de concentração.

Os papéis da contabilização, calibração de entrega, avaliação de mistura e autorização agora estão conectados. A validação com registros medidos de equipamento permanece em aberto. A seguir vem o caminho da água através de sistemas de produção como NFT, DWC e gotejamento, onde a relação entre o tanque e as raízes muda.

What to read next

Revise a diferença entre CE, pH e massa de componente.Sensoriamento e estimativa por imagem em CEA — posicionamento de sensores e área foliar projetadaContinue the seriesCaminhos de água CEA e hidráulica multicamadas — NFT, DWC, gotejamento e balanço de cargaExplore another aspect of this fieldAquaponia CEA — limites de qualidade da água para peixes, micróbios e plantas