Aprenda a construir uma balança com Arduino e módulo HX711

Aprenda a construir uma balança com Arduino e módulo HX711 14

As balanças eletrônicas para cozinha e banheiro que encontramos nas lojas são baseadas em um sensor chamado de célula de carga. Neste post, vamos conhecer estes sensores e ver como usar o módulo HX711 para obter a medição efetuada por eles. Esses conhecimentos serão usados para construir uma balança controlada por um Arduino.

Aprenda a construir uma balança com Arduino e módulo HX711

Como funciona uma célula de carga?

Uma célula de carga é um sensor capaz de fornecer um sinal elétrico para indicar uma força. Vamos nos concentrar neste post em um tipo de célula de carga, o strain gauge, na qual a força que desejamos medir irá deformar o sensor. Esta deformação causará uma variação na resistência do sensor.

A dificuldade em usar as células de carga é que esta variação é muito pequena. Para conseguirmos medi-la, usamos uma configuração chamada Ponte de Wheatstone:

Aprenda a construir uma balança com Arduino e módulo HX711

Nesta configuração uma tensão é aplicada entre os pontos marcados com Vin e é lida a tensão obtida nos pontos Vout. Quando R1*R4 = R2*R3 a tensão Vout é zero (dizemos que a ponte está balanceada). Uma variação nas resistências pode ser calculada a partir da tensão Vout.

Algumas células de carga possuem internamente quatro sensores já ligados em ponte, neste caso a célula possui quatro fios. A que vamos usar neste post é um modelo de três fios, que contém apenas um sensor. Neste caso, a melhor opção é montar uma ponte com quatro sensores, tomando cuidado com as polaridades de cada um (para que as diferenças não sejam canceladas):

Aprenda a construir uma balança com Arduino e módulo HX711

Mesmo usando uma Ponte de Wheatstone, as variações a serem medidas são ainda pequenas demais para serem lidas diretamente por uma entrada analógica do Arduino. É aqui que entra o módulo HX711, que é um conversor analógico digital (ADC) de 24 bits específico para uso com células de carga.

Como calibrar uma célula de carga?

A calibração de célula de carga consiste em determinar a relação entre a tensão lida na ponte (no caso retornada pelo HX711) e a força nela aplicada (no caso, o peso do objeto colocado na balança). Vamos chamar esta relação de escala.

O procedimento básico para realizar a calibração é colocar um peso conhecido e verificar qual a leitura obtida. Uma complicação adicional é que a nossa montagem aplica uma força na célula de carga mesmo quando não temos peso. Este peso inicial (a tara) precisa ser descontado. O procedimento completo de calibração fica assim:

  1. Medimos o valor retornado pelo HX711 com a balança vazia. Este valor correspondente à tara é o offset;
  2. Medimos o valor leitura retornado pelo HX711 com um peso conhecido na balança;
  3. Calculamos escala = (leitura – offset) / peso

Feita a calibração, o peso corresponde a uma leitura informada pelo HX711 será = (leitura – offset) / escala. Como os valores lidos oscilam ligeiramente a cada leitura, vamos usar a média de várias leituras (nos meus testes a variação correspondeu a algumas gramas).

Projeto balança com arduino

Materiais Necessários

Os materiais necessários para a confecção deste projeto são:

Montagem

O shield de display e teclado deve ser encaixado sobre o Arduino, ele será a nossa “interface com o operador”. A figura abaixo mostra como interligar os quatro sensores de peso ao módulo conversor e como ligar o módulo ao Arduino.

Aprenda a construir uma balança com Arduino e módulo HX711

As células de carga que vamos usar possuem um “anel” em torno de uma placa. A movimentação desta placa é que gera o sinal que vamos utilizar. Para que esta placa possa se movimentar, é preciso colocar um espaçador na hora da montagem. Se você tiver acesso a uma impressora 3D, você pode imprimir esta peça. No meu protótipo, fiz os espaçadores com papel cartão grosso e os fixei às células usando fita dupla face:

Aprenda a construir uma balança com Arduino e módulo HX711

Coloque uma superfície plana sobre os quatro sensores, de forma que o peso colocado nela seja distribuído igualmente entre eles.

Código

Vamos usar a biblioteca HX711 de Bogdan Necula e Andreas Moti, que você deve instalar através do Gerenciador de Biblioteca da IDE do Arduino:

Aprenda a construir uma balança com Arduino e módulo HX711

Além dela, vamos usar as bibliotecas LiquidCrystal e EEProm que vem pré-instaladas na IDE.

O código para a nossa balança é o seguinte:

#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <HX711.h>
 
// Define as conexões da balança e cria o objeto para acesso
const int CELULA_DADO = 2;
const int CELULA_CLOCK = 3;
HX711 celulaCarga;
 
// Define as conexões do display e cria o objeto para acesso
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
const int backLight = 10;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
 
// Limites para detecção das teclas, em ordem crescente
int limiteTecla[] = { 50, 150, 300, 500, 750, 1024 };
 
// Indices para as teclas
const int TEC_DIREITA = 0;
const int TEC_CIMA = 1;
const int TEC_BAIXO = 2;
const int TEC_ESQUERDA = 3;
const int TEC_SELECT = 4;
const int TEC_NENHUMA = 5;
  
// Endereços na EEProm
const int ENDER_FLAG = 0;
const int ENDER_ESCALA = 1;
 
// Indicação de balança calibrada
const byte FLAG_CALIBRADA = 0x55;
 
// Iniciação
void setup() {
  // Iniciação do Display
  pinMode(backLight, OUTPUT);
  lcd.begin(16, 2);
  mostraVersao();
  digitalWrite(backLight, HIGH);  // acende
  
  // Iniciação do HX711
  celulaCarga.begin(CELULA_DADO, CELULA_CLOCK);
  ajustaTara();
  if (EEPROM.read(ENDER_FLAG) != FLAG_CALIBRADA) {
    calibra();
  } else {
    // Usa escala salva na EEPROM
    float escala;
    EEPROM.get (ENDER_ESCALA, escala);
    celulaCarga.set_scale(escala);
  }
  mostraVersao();
}
 
// Laço principal
void loop() {
  // Lê e mostra o peso
  float peso = celulaCarga.get_units();
  char medida[17];
  dtostrf (peso, 7, 3, medida);
  strcat (medida, "Kg");
  lcd.setCursor(0,1);
  lcd.print(medida);
 
  // Dá um tempo entre as leituras
  delay (500);
  
  // Trata as teclas
  int tecla = leTecla();
  if (tecla != TEC_NENHUMA) {
    lcd.setCursor(0,1);
    lcd.print("Solte a tecla");
    while (leTecla() != TEC_NENHUMA) {
      delay(100);
    }
    if (tecla == TEC_DIREITA) {
      ajustaTara();
    } else if (tecla == TEC_ESQUERDA) {
      ajustaTara();
      calibra();
    }
    mostraVersao(); // recompõe a tela
  }
}
 
// Apresenta a identificação e versão do programa
void mostraVersao() {
  lcd.clear();
  lcd.print("BALANCA v1.00");
}
 
// Ajusta o offset para o valor da balança vazia
void ajustaTara() {
  lcd.setCursor(0,1);
  lcd.print("Registrando TARA");
  delay(500);
  celulaCarga.tare(50);
}
 
// Efetua a calibração da balança
void calibra() {
  // Mostra as instruções
  lcd.clear();
  lcd.print ("CALIBRACAO");
  delay (2000);
  lcd.clear();
  lcd.print("Coloque 1Kg");
  lcd.setCursor(0,1);
  lcd.print ("Aperte SELECT");
  while (leTecla() != TEC_SELECT) {
    delay(100);
  }
  lcd.setCursor(0,1);
  lcd.print("Solte  SELECT");
  while (leTecla() != TEC_NENHUMA) {
    delay(100);
  }
  lcd.print("Aguarde......");
  delay(1000);
 
  // Faz a leitura e calcula a escala
  long leitura = celulaCarga.read_average(50);
  float escala = (leitura - celulaCarga.get_offset())/1.00f;
 
  // Salva na EEProm
  EEPROM.put(ENDER_ESCALA, escala);
  EEPROM.write(ENDER_FLAG, FLAG_CALIBRADA);
 
  // Usa a escala calculada
  celulaCarga.set_scale(escala);
}
 
// Le uma tecla
// Cada tecla do shield resulta em uma tensão diferente em A0
int leTecla() {
  int leitura = analogRead(A0);
  int tecla;
  for (tecla = 0; ; tecla++) {
    if (leitura < limiteTecla[tecla]) {
      return tecla;
    }
  }
  return TEC_NENHUMA; // Não deve acontecer!
}

Operação e Funcionamento

Quando você ligar (ou reiniciar) o Arduino, o programa considera que a balança está vazia, coloca um aviso no display e chama o método tare() da biblioteca. Esta rotina lê 50 vezes o valor retornado pelo HX711 e considera que a média é o offset a ser descontado de todas as leituras.

Em seguidam o programa verifica na EEProm se já foi feita a calibração. Se não, será feito o procedimento de calibração:

  • Coloca uma mensagem no display pedindo para colocar um peso de 1Kg;
  • Aguarda o pressionar e soltar a tecla Select;
  • Chama o método read_average() da biblioteca para obter a média de 50 leituras do HX711;
  • Calcula a escala e salva na EEProm.

Como parte final da iniciação, o valor da escala é passado para a biblioteca através do método set_scale().

Concluída a iniciação, o programa passa a chamar periodicamente o método get_units() e a apresentar o valor retornado. Este método obtém uma leitura do HX711 (usamos uma média de 4 leituras), subtrai o offset e divide pela escala, resultando no valor em quilos.

O programa testa também se foi apertada e solta uma das seguintes teclas:

  • Right: faz novamente o processo de tara;
  • Left: refaz a calibração.

Estas teclas devem ser apertadas com a balança vazia.

Veja mais detalhes sobre o uso do LCD shield com teclado.

Obs.: Esta balança tem fins apenas didáticos. Dependendo do uso, balanças tem que passar por processos verificatórios do Inmetro.

Conclusão

Neste artigo vimos como funcionam as células de carga e como usar o módulo HX711 para fazer uma medição de peso. Colocamos esses conhecimento em prática fazendo uma balança.

Abaixo um teste rápido da balança. Mesmo com uma montagem simples, a precisão obtida foi da ordem de algumas gramas.

 

Agora que você já conhece as células de carga e o módulo HX711, que tal fazer algum projeto com eles?


Se você tiver dúvidas, sugestões ou experiências para compartilhar, fique a vontade para deixar um comentário abaixo. E para não perder nenhum conteúdo como este, não deixe de nos seguir no Instagram.

Faça seu comentário

Acesse sua conta e participe

14 Comentários

  1. Tenho apenas o Display sem teclado, como troco o código para calibrar sem pressionar o botão?

    1. Em linhas gerais, o que você precisa fazer para operar a balança sem teclado:
      1) Retire o tratamento das teclas no loop principal. A tara será medida quando o programa iniciar e a calibração será feita somente na primeira vez que o programa rodar.
      2) Na rotina calibra(), ao invés esperar a tecla SELECT ser apertada e solta, você pode ficar fazendo leituras e aguardar uma variação grande na leitura (indicando que o peso de 1Kg foi colocado) e depois a leitura estabilizar (uma variação pequena entre as leituras).

  2. Bom dia , teria possibilidade de por 4 hx711 em 4 células unitárias , e ter o peso independente , pra saber a distribuição de peso de um objeto?

    1. Com células unitárias não, pois é preciso ter a ponte. Você poderia usar quatro células que já tem a ponte internamente (células com quatro fios).

  3. Olá. Obrigado pelas dicas.

    Sou novato no arduino. Pretendo converter uma balança de gado de mecânica para digital com Cel. De carga s.type e bluetooths para receber o número do animal e enviar os dados lidios para tablet
    A calibração será com 100kg.

    Minhas dúvidas:

    Consigo fazer isso só com uma placa arduino?

    Esse display com keyoad monopoliza as portas do arduino?

    Seria o caso de eu usar o LCD com i2c?

    1. Embora seja possível fazer isso com uma placa Arduino, talvez seja mais interessante usar uma placa com o ESP32, já que você quer usar Bluetooth. No artigo que eu menciono tem os pinos que o shield de display com keypad usa (D4 a D10 para o display mais A0 para as teclas). Boa sorte no projeto!

  4. Boa noite, quero construir um projeto destes, mas gostaria de saber se ao invés do programa usar a uma média de 4 leituras, ele coletar 50 medidas, excluir o valor das 10 maiores e 10 menores leituras e utilizar a média dos dos 30 resultados restantes ?
    Desde já agradeço!!!!!

    1. Marcus, para coletar mais medidas basta passar o número de medidas como parâmetro para get_units(). Para desprezar as 10 menores e as 10 maiores você vai ter que usar um nível abaixo (método read()), guardar os valores, ordenar, calcular a média dos 30 que interessam e descontar o offset e aplicar a escala. Recomendo que você dê uma olhada nos métodos read_average(), get_value e get_units() nos fontes da biblioteca.

  5. ola, gostaria de uma breve explicação de como faço pra alterar o peso de calibração.
    ex: peso de calibração de 1 kg, gostaria de alterar para 5kg

    1. Gustavo,

      Basta trocar as linhas

      lcd.print(“Coloque 1Kg”);
      float escala = (leitura – celulaCarga.get_offset())/1.00f;

      por

      lcd.print(“Coloque 5Kg”);
      float escala = (leitura – celulaCarga.get_offset())/5.00f;

  6. Eu estou tentando calibrar uma dessas de quatro células mas este método descrito por uma equaçao de primeiro grau não funciona bem, pois dependendo da localização da carga, o arduino recebe valores diferentes nas extremidades. Quando a carga, ela sobe linearmente a leitura. Assim como a posição. Mas não achei como relacionar isto ainda.

    1. Olá Breno,

      Se está recebendo valores diferentes dependendo do posicionamento da carga, há algumas verificações que podem ser feitas.

      O valor final deveria ser a soma da leitura da soma dos valores das 4 células de carga, então independeria da posição.

      As células precisam estar alinhadas e equidistantes, além de precisarem estar no mesmo plano.

      As conexões devem ser verificadas, para que uma célula não cancele a medição da outra.

      Existem diversos outros fatores, sobre os quais você pode ler aqui: https://www.interfaceforce.com/support/technical-library/

      Abraços!
      Vinícius – Equipe MakerHero

  7. Boa tarde, interessante seu artigo, mas eu estava aqui pensando, seria possível deixar essa balança com uma determinada carga de mais ou menos uns 40kg por tempo indeterminado sobre ela sem que perdesse suas qualidades de medir o peso com precisão? ou o material iria deformar com o tempo e comprometer sua leitura?

    1. Olá Elizeu,

      Seriam necessários testes para afirmar com certeza, mas se a carga estiver distribuída entre 4 sensores, acredito que não haverá deformação permanente.

      Caso seja apenas um sensor, por estar próximo da carga máxima dele, pode ser que comprometa a leitura.

      Abraços!
      Vinícius – Equipe MakerHero