Sensor de Nível de Agua

Boas pll, Recorro mais uma vez aqui ao forum para uma coisa que não estou a conseguir fazer e que das duas uma, ou não é possível, ou é fácil de fazer mas eu não estou a chegar la.

Então é assim, tenho um sensor de nivel de agua igual a estehttp://www.banggood.com/Water-Level-Liquid-Droplet-Surface-Height-Depth-Detection-Sensor-p-909266.html

Que queria ligar ao meu sistema de automatização do aquário que tenho estado a desenvolver, para medir a evaporação diária do aquário.

A questão é que sendo um aquário de agua salgada tem umas bombas para "criar ondulação" dentro do aquário, (a ondulação deve andar na casa dos 5mm), o que me inviabiliza a constante leitura do sensor, por isso queria que o Arduino apenas fosse "ler o sensor" tipo de 15 em 15 segundos de modo a ter leituras "mais estáveis".

pensei em i por aqui:

void nivelsump()
        
                    {   if(millis() - tempoSensorNivelSump > 15000)
                          {nivelSump = analogRead(sensorNivelSump);}
                          if(millis() - tempoSensorNivelSump > 15100)
                            {tempoSensorNivelSump = millis();}
                        lcd.setCursor(0,1);
                        lcd.print("Nivel=");
                        lcd.setCursor(6,1);
                        lcd.print(nivelSump)

Mas o Aduino continua-me a ler continuamente, (pelo menos é o que parece) o sensor de nível. Não posso usar o delay porque para-me a leitura de outros componentes, por exemplo o RTC

Alguma dica? Obg NJPinheiro

Também pode ser possível e difícil… :stuck_out_tongue:

O que tu queres não é ler de 15 em 15 segundos. Tu queres uma média da leitura de forma a que contenha uma ou mais que uma ondas. Imagina que a tua onda atinge o pico de 15 em 15 segundos… estarás a medir um nível errado.

Isto é, imagina que as ondas têm uma frequência de uma onda por 10 ms (para dar jeito nas contas). Então tu queres fazer uma média desses 10 ms. Se uma leitura demorar 1 ms, fazes 10 leituras, uma média das 10 leituras e pronto… o valor deverá ser mais estável.

Outra possibilidade seria usares um filtro passa baixo para filtrares o valor das ondas e ficares com a componente fixa.
Assim de repente encontrei uma página do ARduino com um desses filtros aqui: http://playground.arduino.cc/Main/Smooth

Será boa ideia experimentares e ajustares o valor do filtro (filterVal) para veres quão estável consegues a resposta.

Para fazeres a média, podes temporizar com o millis, mas de forma diferente ao que fizeste e com um ciclo “manual”

unsigned char ptr_media = 0;
unsigned long media = 0; 
unsigned long time_media = 0; 
unsigned int media_result = 0;


if (millis() - time_media > 100) { //100 ms parece-me razoável... nova leitura de 2 em 2 segundos...  
   if (ptr_media >= 20) {
      ptr_media = 0; //vamos fazer 20 leituras.
      media_result = (unsigned int) media / 20; //calcula media. 
      Serial.print ("leitura = ");
      Serial.println(media_result);
   }
   if ( ptr_media < 20 ) {
      media += analogRead(nivel); 
      ptr_media++;
      time_media = millis(); //renova o intervalo. 
   }      
}

Poderás ter de ajustar os indices e as temporizações, mas eu desaconselho que uses leituras de 15 a 15 segundos. As leituras são enviadas para um LCD ou para um computador?

Ainda assim, eu iria pela solução do exemplo do Arduino. Mas ambas devem fazer o que pretendes.

No meu traballho tenho uma aplicação semelhante (com ondas do mar…) e a melhor solução é precisamente o filtro pois permite mais resultados. O filtro faz um update de ciclo a ciclo ao valor da média enquanto que a solução que coloquei não o faz e isso pode provocar degraus no valor do nível e causar problemas no sistema.

Você vai matar os animais do seu aquário usando esse sensor.

A corrosão vai expor as trilhas de cobre e você deve saber que isso é um veneno para os animais.

Use sensor ultra-sônico ou infravermelho.

Hmmm, o ultra-sónico tem o benefício de filtrar as "ondas"... mas provavelmente não vai ter precisão suficiente para o que ele pretende...

Já experimentaste isso?

Como funciona um sensor de IR para detectar profundidade?

Eu não uso nenhum destes modelos mas, é fácil de encontrar projetos.

http://www.makechronicles.com/2012/06/09/arduino-project-11-2d3d-pictures-measuring-a-water-tank-level-v2-hc-sr04-ultrasonic-rangefinderarduino-uno1-0/

http://reefcentral.com/forums/showthread.php?t=2328819

O infravermelho funciona da mesma maneira que o ultra-sônico.

O sensor é deste tipo:

http://www.aliexpress.com/item/American-Optical-liquid-level-sensor-LLE102000-original-authentic-quality-assurance-welcome-to-buy/2048658220.html

http://www.omega.com/pptst/LV170.html

Tem um fornecedor em Portugal que agora não encontro.

Qual a razão para medir a altura da água do aquário ao invés de medir do sump?

Pois... Mas o preço não é muito amigável...

Também daria para ver isto com pressão...

É questão de pesquisar um pouco.

http://www.digikey.com/product-detail/en/LLE103000/480-2024-ND/1159468

http://www.conrad.com/ce/en/product/505337/Honeywell-LLE103000-Liquid-Level-Sensor

http://www.ebay.com/itm/Optical-infrared-water-liquid-level-sensor-switch-/281267252391?pt=LH_DefaultDomain_0&hash=item417cd5aca7

Algumas pessoas usam este tipo de sensor de pressão: http://www.digikey.com/product-detail/en/MPXV5004GC6T1/MPXV5004GC6T1CT-ND/951856

Eu prefiro este: http://www.ebay.com/itm/New-Liquid-Water-Level-Sensor-Horizontal-Float-Switch-/230697911869?pt=LH_DefaultDomain_0&hash=item35b6aac63d

Ola pll, Começo por agradecer os vossos post´s e posso dizer que já aprendi qualquer coisa hoje com voçês :)

bubulindo: O que tu queres não é ler de 15 em 15 segundos. Tu queres uma média da leitura de forma a que contenha uma ou mais que uma ondas. Imagina que a tua onda atinge o pico de 15 em 15 segundos... estarás a medir um nível errado.

Sim bubulindo, lês-te-me o meu pensamento :)

bubulindo: Outra possibilidade seria usares um filtro passa baixo para filtrares o valor das ondas e ficares com a componente fixa. Assim de repente encontrei uma página do ARduino com um desses filtros aqui: http://playground.arduino.cc/Main/Smooth

Será boa ideia experimentares e ajustares o valor do filtro (filterVal) para veres quão estável consegues a resposta.

Esta tua sugestão provavelmente seria a melhor opção...o unico problema aqui é que sou "maçarico" nestas andanças, e pelo que vi desse código não me iria ser facil introduzi-lo no código fonte que já tenho....mas fica a dica para outros projectos quando tiver "pernas para andar sozinho" :roll_eyes:

bubulindo: Para fazeres a média, podes temporizar com o millis, mas de forma diferente ao que fizeste e com um ciclo "manual" Poderás ter de ajustar os indices e as temporizações, mas eu desaconselho que uses leituras de 15 a 15 segundos. As leituras são enviadas para um LCD ou para um computador?

As leituras seriam enviadas para um LCD, e esta opção sim acho que seria capaz de a introduzir no código fonte que já tenho.

E digo seria, porque (e agora atendendo também as dicas do Fernando Garcia), vou ter de "partir" para outra solução, uma vez que o que ele diz é bem verdade e eu não me tinha lembrado disso, o cobre iria acabar por me matar os peixes todos :(

FernandoGarcia: Use sensor ultra-sônico ou infravermelho.

Fernando, pelos links que enviou, acho que vou mesmo optar pelo ultra-sônico....os preços não são comparáveis :open_mouth:

Como funciona o ultra-sonico? com ele é possível "eliminar" o erro da ondulação?

Sim eu vou por o sensor na sump, mas a sump também tem ondulação gerada pelo Escumador, mas essa parte é mais "técnica" da parte de aquariofilia, e por isso para simplificar, (porque o pll aqui pode não "dominar" a aquariofilia), é que disse que iria por no aquário, porque me pareceu mais simples de exemplificar o que pretendia.

O que pretendo com a medição do nível de agua na sump são duas coisas: 1- Detectar automaticamente a necessidade de repor agua no aquário; 2 -Medir a evaporação diária do aquário

Este sensor: http://www.ebay.com/itm/New-Liquid-Water-Level-Sensor-Horizontal-Float-Switch-/230697911869?pt=LH_DefaultDomain_0&hash=item35b6aac63d não me permite o ponto 2, e adicionalmente teria de ter dois, um para o nivel minimo, e outro para nivel maximo.

Normalmente o sensor é colocado na área da bomba de retorno onde o nível só varia por causa da evaporação.

O problema das ondulações é resolvido facilmente fazendo um conjunto de medições e tirando uma média aritimética.