31 julho 2014

Ligando um Sensor de Nível de Líquidos ao Arduino

Esse post é parte de um projeto um pouco maior, mas que não consegui montar ainda simplesmente pela falta de peças. Então vou começar falando apenas do sensor de nível de líquidos, que é um sensor feito de material plástico (PP, segundo o fabricante), composto de uma haste na qual desliza um cilindro feito de material flutuante.

Sensor de nivel de liquido Arduino
 
Esse cilindro possui um ímã que aciona um sensor magnético no meio da haste, que por sua vez fecha o contato dos 2 fios que saem do sensor. Isso mesmo. É uma boia com fios.

Veja na imagem abaixo que o cilindro possui internamente apenas uma pequena parte preenchida com o ímã, o que torna possível invertermos o cilindro e termos um contato normal aberto ou normal fechado, adaptando o sensor às nossas necessidades :

Sensor de liquido - Detalhe


Sozinho, pode por exemplo ser usado como uma chave que é acionada quando um reservatório está cheio (colocando o sensor na parte de cima do reservatório), ou vazio (colocando o sensor na parte de baixo).

Com mais sensores, eu posso controlar vários níveis em um tanque, indicando ao Arduino se o meu tanque está cheio, pela metade ou (quase) vazio.

Sensor de liquido - Vários sensores

Uma ligação básica com apenas um sensor pode ser feita montando esse circuito...


Circuito Arduino e sensor de nivel de liquido
...e carregando esse programa, que acende o led verde quando o reservatório está cheio, e o led vermelho quando o nível do reservatório estiver abaixo do nível máximo :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Programa : Teste sensor liquido Arduino
// Autor : Arduino e Cia

// Pino ligado ao sensor de nivel de liquido
int pinosensor = 3;
// Led verde
int pino_led_cheio = 6;
// Led vermelho
int pino_led_vazio = 7;

void setup()
{
  Serial.begin(9600);
  pinMode(pinosensor, INPUT);
  pinMode(pino_led_cheio, OUTPUT);
  pinMode(pino_led_vazio, OUTPUT);
}

void loop()
{
  int estado = digitalRead(pinosensor);
  Serial.print("Estado sensor : ");
  Serial.println(estado);
  switch(estado)
  {
  case 0:
    digitalWrite(pino_led_vazio, LOW);
    digitalWrite(pino_led_cheio, HIGH);
    break;
  case 1:
    digitalWrite(pino_led_vazio, HIGH);
    digitalWrite(pino_led_cheio, LOW);
    break;
  }
  delay(100);
}

Por enquanto é só. Retorno à esse assunto assim que chegar o resto do material para o meu projeto :-)

28 comentários:

  1. Boa tarde, gostaria de saber onde adquirir esse sensor para implementar o experimento em sala de aula.

    Grato,

    ResponderExcluir
    Respostas
    1. Boa noite,

      Utilize o formulário de contato no lado direito da página, assim conversamos por email.

      Abraço !

      Excluir
  2. Boa tarde,

    Não entendi porquê a colocação do resistor e ground no sensor.

    Pode explicar?

    Obrigado!

    Rui Ponte

    ResponderExcluir
    Respostas
    1. Boa noite Rui,

      Esse resistor nós chamamos de pull-down. Tentando explicar de uma maneira bem simples, ele serve para manter o sinal que vem do sensor em nível baixo. Se não ligarmos o pino do Arduino em nenhuma tensão de referência, ele pode interpretar ruídos como 0 ou 1, o que vai acabar acionando os leds de maneira errada.

      Você pode ter mais informações sobre resistores pull-down e pull-up nesse artigo :

      http://www.arduinoecia.com.br/2013/02/resistor-de-elevacao.html

      Abraço !

      Excluir
  3. E como ficaria a programação com 3 sensores? e posso usar sensor ICOS?

    ResponderExcluir
    Respostas
    1. Boa tarde Bruno,

      Você pode alterar esse mesmo programa, definindo outros pinos para os sensores e depois testando o valor de cada uma das chaves.

      Quanto ao ICOS, eu ainda não usei, mas creio que o procedimento seja o mesmo.

      Abraço.

      Excluir
  4. Prezado . Parabéns pelo seu trabalho, seu Blog se tornou uma fonte de conhecimento sobre Arduino.
    Gostaria de perguntar, com tanats versões novas do IDE Arduino, como converter skethcs criadas com extenão .pde para .ino. Tenho alguns sketchs (.pde) e não consigo usar com a nova versão 1.6.3.Esta correto isso?
    Já experimentei deixar instalado as versões mais antigas na mesma máquina, mas quando vou compilar sempre aparece um tipo de erro (launch4j-----An Error Occurred While Starting The Application).
    As versões que instalei são estas, todas ao mesmo tempo na mesma máquina.
    1.0.3; 1.5.8; 1.6.0; 1.6.1; 1.0.4;1.0.5; 1.0.6; 1.5.3-intel 1.0.4;1.5.3-intel 1.0.3;1.5.8;
    Desde já grato pela ajuda....o que fiz de errrado?

    Roberto Carlos

    ResponderExcluir
    Respostas
    1. Boa tarde Roberto,

      Eu utilizo várias versões da IDE também, mas não costumo ter muitos problemas, a não ser com as bibliotecas, que preciso copiar de uma IDE para a outra.

      Mas com relação aos programas, utilizo normalmente.

      Abraço e obrigado !

      Excluir
  5. Olá, gostaria de saber se os sensores podem ser submergidos e se isso pode vir a causar algum problema! Grato!

    ResponderExcluir
    Respostas
    1. Bom dia,

      Pode sim, eles são lacrados.

      Abraço !

      Excluir
  6. Boa tarde!
    Como ficaria esta ligação no Arduino Mega?

    ResponderExcluir
    Respostas
    1. Bom dia,

      Você pode utilizar o mesmo esquema de ligação.

      Abraço !

      Excluir
  7. Qual o valor dos resistores? O meu ficou louco gerando 0 e 1 na porta aleatoriamente

    ResponderExcluir
    Respostas
    1. Oi Denilson,

      Pela descrição, o seu problema realmente é o resistor (ou melhor, a falta dele). Você pode usar valores como 470 ohms, 1 K ou 10K, ou outros valores nessa faixa.

      Abraço!

      Excluir
  8. Qual a tolerancia em temperatura que este sensor suporta?

    ResponderExcluir
  9. Ola,

    Fiz a ligação exatamente como mostrado, copiei o codigo, mas, o led verde fica ligado constantemente e o led vermelho não é acionado quando o recipiente é preenchido com água.

    ResponderExcluir
    Respostas
    1. Boa noite Diego,

      Você consegue testar esse sensor com um multimetro, para verificar se ele está fechando contato ?

      Abraço!

      Excluir
    2. Boa noite, fiz o teste com o multímetro e o sensor estar funcionando perfeitamente. Mas, o problema continua, suspeito que seja o resistor que estou utilizando.
      Qual é o resistor correto para este sensor? Quantos ohms?
      O sensor que estou usando é este mesmo do tutorial, só que horizontal.

      Muito obrigado pela ajuda!
      Diego Duarte

      Excluir
    3. Boa noite Diego,

      Será que o seu sensor não está funcionando ao contrário não ? Tente inverter essa parte do código. Onde está LOW, você muda para HIGH, e onde está HIGH, você muda para LOW:

      case 0:
      digitalWrite(pino_led_vazio, LOW);
      digitalWrite(pino_led_cheio, HIGH);
      break;
      case 1:
      digitalWrite(pino_led_vazio, HIGH);
      digitalWrite(pino_led_cheio, LOW);

      Abraço!

      Excluir
  10. eu nao manjo muito de programação, mais estou fazendo um projeto integrador que tenho de entregar nesta terca dia 24, que é justamente este, mais com 2 boias.. tentei de varias forma fazer a programação mais nao obtive exito, entao tentei adaptar esta programação dizendo que os leds seria um motor e o outro uma valvula, adcionei mais um sensor e o programa ficou assi:


    int pinosensor = 2;
    int sensor = 8;
    int motor = 7;

    int valvula = 12;

    void setup()
    {
    Serial.begin(9600);
    pinMode (sensor, OUTPUT);
    pinMode(pinosensor, INPUT);
    pinMode(motor, OUTPUT);
    pinMode(valvula, INPUT);
    }

    void loop()
    {
    int estado = digitalRead(pinosensor);
    Serial.print("Estado sensor : ");
    Serial.println(estado);
    switch(estado)
    {
    case 0:
    digitalWrite(valvula, HIGH);
    digitalWrite(motor, LOW);
    digitalWrite(sensor, LOW);
    break;
    case 1:
    digitalWrite(valvula, LOW);
    digitalWrite(motor, HIGH);
    digitalWrite(sensor,HIGH);
    break;
    }
    delay(100);
    }

    sera que vai dar certo?

    ResponderExcluir


  11. int pinosensor = 2;
    int sensor = 8;
    int motor = 7;

    int valvula = 12;

    void setup()
    {
    Serial.begin(9600);
    pinMode (sensor, OUTPUT);
    pinMode(pinosensor, INPUT);
    pinMode(motor, OUTPUT);
    pinMode(valvula, INPUT);
    }

    void loop()
    {
    int estado = digitalRead(pinosensor);
    Serial.print("Estado sensor : ");
    Serial.println(estado);
    switch(estado)
    {
    case 0:
    digitalWrite(valvula, HIGH);
    digitalWrite(motor, LOW);
    digitalWrite(sensor, LOW);
    break;
    case 1:
    digitalWrite(valvula, LOW);
    digitalWrite(motor, HIGH);
    digitalWrite(sensor,HIGH);
    break;
    }
    delay(100);
    }

    ResponderExcluir
  12. Como fazer o desenho? No fritzin não tem esse sensor.

    ResponderExcluir
  13. porque vc usou serial.begin(9600) ?

    ResponderExcluir
    Respostas
    1. Bom dia,

      Usamos esse comando para inicializar a comunicação serial e enviar dados para o Serial Monitor com o comando Serial.print().

      Abraço!

      Excluir
  14. Por gentileza, gostaria de saber a especificação do sensor utilizado.

    ResponderExcluir
    Respostas
    1. Bom dia Gabrielle,

      Infelizmente esse sensor tem pouquíssima documentação... vc precisa de algum dado específico ?

      Abraço!

      Excluir
  15. Bom dia, estou fazendo esse sistema, porem o reservatorio fica a 70metros longe da onde ficara o arduino, se eu ligar no 5v e gnd do arduino eu nao vou ter problema?O que voce me aconselha?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Eu usaria alguma solução com rede wifi, como o ESP8266.

      Abraço!

      Excluir