13 - 09 - 2016 Pluviômetro de Báscula
13 - 09 - 2016 Pluviômetro de Báscula
13 - 09 - 2016 Pluviômetro de Báscula
O volume é medido pela oscilação de dois reservatórios (báscula) que ao oscilarem geram um pulso que é registrado por um sistema de aquisição, como mostra a
figura 9.
Montamos um reservatório do tipo Mariotte para ter uma vazão constante e controlável e poder fazer os testes com o pluviômetro e o desenvolvimento do programa
para aquisição.
Dica
A garrafa de Mariotte também pode ser montada com um sifão. (Ver: Vaso de Mariotte 2 - Versão sifão)
O volume de chuva é expresso em “milímetros” (mm), o que corresponde à altura da lâmina d'água formada em um reservatório com 1 m2 de área.
Para saber, vamos calcular o volume de um paralelepípedo com área (A) de 1 m2 e altura (h) de 1 mm.
1 m2 = 100 dm2
1 mm = 0,1 cm = 0,01 dm
V=Axh
E como 1 dm3 = 1 L descobrimos que 1 mm de chuva em uma área de 1 m2 corresponde ao volume de 1L.
E como converter os volumes em mililitros (ml) medidos em um pluviômetro com área de coleta A cm2 para a unidade padronizada em milimetros (mm)?
Essa conversão se baseia no princípio de que “o volume de chuva captado é diretamente proporcional à área de captação”.
Ou seja se uma área “A” coleta um volume “V” de chuva, podemos dizer que metade da área (A/2) irá coletar metade do volume (V/2).
Portanto se foi coletado 1mm (1L) de chuva em uma área de 1m2, podemos dizer que seria coletado 0,5 L (V/2) em uma área de coleta de 0,5 m2 (A/2). Ou 0,25 L
(V/4) em uma área de coleta de 0,25 m2 (A/4). Figura 10
E portanto:
Equação 1. Para um dado volume de chuva, o volume total coletado por diferentes pluviômetros varia na mesma proporção da área de coleta mas “a altura
permanece constante”.
Atenção
Estamos considerando neste raciocínio os pluviômetros com a forma de cilindro ou paralelepípedo que diferem apenas na área de coleta.
Ou seja, durante um dado período de chuva diferentes pluviômetros com diferentes áreas de coleta, irão coletar diferentes volumes de chuva mas terão a mesma
altura do volume coletado.
Com base nessa propriedade podemos expressar o volume coletado (em mm) por um pluviômetro com qualquer geometria dividindo o volume coletado (em mm3)
pela área de coleta (em mm2).
Equação 2. Equação que permite calcular o volume de chuva em milímetros (mm) a partir da área de coleta (mm2) e do volume coletado (mm3)
independente da geometria do pluviômetro.
E se a área da base for igual à área de coleta basta medir a altura (em mm) da coluna de água coletada.
Mas se a área da base do reservatório não for igual à área de coleta, basta medir o volume coletado (em mm3) e dividir pela área de coleta ( em mm2).
Dica
Ou seja, para converter o volume de mL para mm3 basta multiplicar o volume em mL por 1000.
Figura 11. Montagem na protoboard e diagrama esquemático do circuito para monitoramento das oscilações da báscula do pluviômetro.
Mais tarde os amigos da lista SJC HackerClube sugeriram o uso de um acoplador óptico (Figuras 12 e 13) para isolar o circuito do pluviômetro do circuito do
Arduino evitando o risco de correntes induzidas por raios durante tempestades.
Figura 12. Diagrama esquemático do circuito do pluviômetro com o uso de um acoplador óptico 4N35.
Figura 13. Montagem em protoboard do circuito do pluviômetro com o uso de um acoplador óptico..
E para fazer as leituras no Arduino implementamos o seguinte Sketch:
/*
Pluviometro OO
*/
int reed_switch_pin = 8;
boolean last_reed_switch_state = LOW;
unsigned long tc = millis();
unsigned long ts = millis();
int clicks;
float volume;
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
pinMode(reed_switch_pin, INPUT);
}
void loop() {
unsigned long int_click = millis() - tc;
if ( int_click > 50 ) {
readPin();
}
void readPin () {
Neste código a função readPin é chamada a cada 50 ms e esse intervalo deve ser regulado para se ajustar ao intervalo de tempo em que o reed-switch está fechado
(estado HIGH).
Fiz algumas medidas com um osciloscópio para determinar a duração de cada pulso, ou seja, o tempo em que o sensor reed-switch permanece fechado, e foi possível
medir que o pulso tem duração de ~100 ms. (Figura 14)
Isso indica que com uma frequência de leitura de 20KHz (intervalo de leitura de 50 ms) de um pulso com duração de 100 ms, não há o risco de perder os pulsos
gerados pela oscilação da báscula.
Ou seja é uma forma detectar uma queda na tensão, análogo à opção "FALLING" no recurso de interrupção.
Considerando a hipótese de que o Arduino possa estar ligado a vários sensores, criamos um formato de dado que permita identificar o sensor a que o dado pertence.
[nome_do_sensor];N;[unidade]
pluviometro;N;D
Onde N é um número inteiro que corresponde ao número de descargas (escoamento) do reservatório e D é uma unidade arbitrária que significa Descarga (Discharge)
do reservatório (báscula).
Outros sensores que forem instalados no futuro poderão ser identificados pelos respectivos nomes:
termometro;N;C
Dessa forma, os dados poderão ser devidamente “interpretados” pelo programa de aquisição para o processamento adequado.
1. Amostragem passiva ou orientada a eventos (event driven): o Arduino envia em intervalos regulares (Ex: 5 segundos) o número de descargas do reservatório e
o programa no PC fica “esperando passivamente” o envio das mensagens e interpreta as leituras quando elas são enviadas. (Fonte: Programação Orientada a
Eventos).
2. Amostragem ativa (polling): o programa no PC envia comandos, em intervalos regulares, para o Arduino solicitando o envio de dados. (Fonte: Polling)
Identificamos os seguintes blocos funcionais que podem ser úteis para um sistema de monitoramento dos dados pluviométricos:
7. data analysis - faz análises mais elaboradas podendo combinar outros dados
Dentro do paradigma da Programação Orientada a Objetos essas funcionalidades poderiam ser implementadas em classes específicas facilitando a organização e
manutenção do código.
Figura 15. Blocos funcionais para implementar as atividades necessárias de um sistema pluviométrico
Os dados recebidos através de um canal (serial ou TCP/IP) são armazenados em uma variável (read) e em seguida interpretados (parse) identificando o instrumento e
o tipo de dado.
Periodicamente os dados interpretados são “processados” (process) onde podem ser feitas operações básicas de totalização, estimativa de média etc.
Após o processamento podem ser exibidos (show) ou armazenados em banco de dados (storage).
Mas após o processamento os dados podem ainda passar por uma análise estatística mais elaborada (analysis) na qual podem ser combinados com dados históricos
armazenados no banco de dados.
Escolhemos o gráfico de barras para exibição de dados pluviométricos seguindo sugestão do site: www.weatherforschools.me.uk/html/weatherdata.html.
#==========================================================
#Versão 04
#Variáveis globais
#==========================================================
#Criação dos frames
set frame_1 [frame .f1]
set frame_2 [frame .f2]
set frame_3 [frame .f3]
#==========================================================
#==========================================================
#Criação do label para o gráfico 1
set title_1 [label $frame_1.t1 -font $title_font -justify center -text "Chuva a cada 5 segundos"]
pack $title_1
#==========================================================
#==========================================================
#Criação do canvas para exibição do gráfico 1
set canvas_graph_1 [canvas $frame_1.c -background white -width 1000 -height 200]
pack $canvas_graph_1
set list_yaxis_graph_1 {0 0 0 0 0 0 0 0 0 0 0 0 0}
set count_loop 0
#==========================================================
#==========================================================
#Criação do gráfico 1
#==========================================================
#==========================================================
#Criação do label para o gráfico 2
set title_2 [label $frame_2.t1 -font $title_font -justify center -text "Chuva a cada 1 minuto"]
pack $title_2
#==========================================================
#==========================================================
#Criação do canvas para exibição do gráfico 2
set canvas_graph_2 [canvas $frame_2.c -background white -width 1000 -height 200]
pack $canvas_graph_2
set list_yaxis_graph_2 {0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0}
#==========================================================
#==========================================================
#Criação do gráfico 2
#==========================================================
#==========================================================
#Criação do label para o gráfico 3
set title_3 [label $frame_3.t1 -font $title_font -justify center -text "Chuva a cada 1 hora"]
pack $title_3
#==========================================================
#==========================================================
#Criação do canvas para exibição do gráfico 3
set canvas_graph_3 [canvas $frame_3.c -background white -width 1000 -height 200]
pack $canvas_graph_3
set list_yaxis_graph_3 {0 0 0 0 0 0 0 0 0 0 0 0}
#==========================================================
#==========================================================
#Criação do gráfico 3
#==========================================================
#==========================================================
#Exibição dos frames
pack $frame_1 $frame_2 $frame_3
#==========================================================
proc criarCanal { } {
global tempo_inicial
global count_loop
global V_mm
if { [eof $canal ] } {
puts stderr "Fechando $canal"
catch { close $canal }
return }
#Tratamento de exceção para evitar os erros gerados de mensagens quebradas acumuladas no buffer
if {[catch {set V_total_mm [expr $N * $V_mm]}]} { return }
incr count_loop
puts "count_loop -> $count_loop"
update
if { $N != 0 } {
calcChuvaInstantanea
}
}
if {$tempo_inicial_descarga == $tempo_inicial_programa} {
set tempo_inicial_descarga $t
puts "PRIMEIRA DESCARGA"
return
}
switch $unidade {
s { set intervalo [format "%.1f" [expr $t - $tempo_inicial_descarga]] }
m { set intervalo [format "%.1f" [expr ($t - $tempo_inicial_descarga)/60.0]] }
h { set intervalo [format "%.1f" [expr ($t - $tempo_inicial_descarga)/3600.0]] }
}
set tempo_inicial_descarga $t
return $intervalo
#Procedimento para o cálculo da chuva instantânea que corresponde ao volume de descarga do reservatório dividido
#pelo tempo decorrido desde o último descarregamento do reservatório
#A placa Arduino envia leituras a cada 5 segundos e estamos considerando "impossível" que haja mais de um descarregamento
#no intervalo de 5 segundos
#Por isso o cálculo do intervalo só é feito a cada envio de dados da placa Arduino
#e o volume de descarga é o volume do reservatório
proc calcChuvaInstantanea { } {
global V_mm
if { $intervalo_m != ""} {
set chuva_inst [format "%.1f" [expr $V_mm / $intervalo_m]]
updateChuvaAcumulada $V_mm 1 m
}
}
global chuva_acumulada
if {$volume} {
set chuva_acumulada($tempo$unidade) [format "%.1f" [expr $chuva_acumulada($tempo$unidade) + $volume]]
} else {
set chuva_acumulada($tempo$unidade) 0
}
}
#Procedimento para o cálculo da chuva acumulada que corresponde ao volume total dividido pelo intervalo de tempo
global chuva_acumulada
update
criarCanal
update
4.6. Links
Anterior Próxima
3. 22/04/2015 - Pluviômetro Livre Baseado em Visão A. Python
Principal
Computacional (Hermano)