Balança com célula de carga, módulo conversor HX711 e arduino

Direto ao ponto e sem rodeios vou mostrar como construí minha balança que além de ler o peso (claro), também lê a altura através de um teclado USB e mostra como resultado o índice de massa corporal do indivíduo.

Material utilizado

1 protoboard 730 furos
1 microcontrolador ATMEGA 328P
1 capacitor cerâmico 100nF x 50V
2 capacitor cerâmico 22pF x 50V
1 resistor 10K x 1/4W
1 cristal ressonante 16 MHz
1 botão de contato NA
1 fonte de alimentação de 5V e 100mA ou mais
1 display LCD 16x02
1 trimpot 10K
1 jack USB A fêmea
1 teclado númerico USB
2 MDF 300x300x15 mm
1 módulo conversor HX711
4 célula de carga 50 Kg (cada)
vários jumper macho - macho
vários jumper macho - fêmea
fio colorido

Eu preferi montar um Arduino na Protoboard, mas recomendo a utilizarem a sua própria placa Arduino. Para isso deve substituir as portas digitais do ATMEGA 328P pelas portas digitais de seu Arduino. Vejam as imagens abaixo.


Para que o teclado USB funcione no Arduino, deve ser utilizada a biblioteca PS2Keyboard. Baixe-a neste link, extraia e a copie pasta PS2Keyboard para a pasta librarie da IDE Arduino. A versão utilizada da IDE Arduino foi a 1.6.7. Para evitar quaisquer tipos de enroscos, recomendo a utilizar a mesma versão.

Para saber como instalar a IDE Arduino, acesse esta URL.

Código fonte

Em primeiro momento pensei em manter o código fonte privado para quando alguém quisesse, entrar em contato via e-mail e assim posteriormente recebe-lo. Acabei mudando de ideia.

/*
Fedablio
www.fedablio.com.br
*/

#include <LiquidCrystal.h>
#include <PS2Keyboard.h>

//Teclado D-
const int DataPin = 2;
//Teclado D+
const int IRQpin = 3;
PS2Keyboard keyboard;
char c;
String acumulado = "";
//LCD
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
//SCK do conversor
#define SCK 8
//DAT do conversor
#define DAT 9
unsigned long banana = 8706637;
unsigned long pera;
unsigned long uva;
float melao;
int valor = 0;
unsigned long Leitura();

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  keyboard.begin(DataPin, IRQpin);
  pinMode(DAT, INPUT_PULLUP);
  pinMode(SCK, OUTPUT);
}

void loop() {
  Serial.println(Leitura());
  pera = Leitura();
  uva = banana - pera;
  melao = uva / 26680.00;
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Peso: ");
  if (melao <= 5) {
    melao = 0.00;
  }
  lcd.print(melao);
  lcd.setCursor(0, 1);
  lcd.print("Altu: ");
  lcd.print(acumulado);
  if (keyboard.available()) {
    c = keyboard.read();
    if (c == PS2_ENTER) {
      String semi_altura = acumulado;
      float altura = semi_altura.toFloat();
      float imc = melao / pow(altura, 2);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("IMC: ");
      lcd.print(imc);
      lcd.setCursor(0, 1);
      if (imc <= 18.5) {
        lcd.print("Abaixo do peso");
      }
      if (imc >= 18.5 && imc < 24.9) {
        lcd.print("Peso adequado");
      }
      if (imc >= 25 && imc < 29.9) {
        lcd.print("Sobrepeso");
      }
      if (imc >= 30 && imc < 34.9) {
        lcd.print("Obes. grau I");
      }
      if (imc >= 35 && imc < 39.9) {
        lcd.print("Obes. grau II");
      }
      if (imc >= 40) {
        lcd.print("Obes. grau III");
      }
      delay(10000);
      acumulado = "";
    } else if (c == PS2_ESC) {
      acumulado = "";
    } else {
      acumulado.concat(c);
      lcd.setCursor(0, 0);
      lcd.print("Peso: ");
      if (melao <= 5) {
        melao = 0.00;
      }
      lcd.print(melao);
      lcd.setCursor(0, 1);
      lcd.print("Altu: ");
      lcd.print(acumulado);
    }
  }
}

unsigned long Leitura() {
  unsigned long Var = 0;
  unsigned char i;
  digitalWrite(SCK, LOW);
  while (digitalRead(DAT));
  for (i = 0; i < 24; i++) {
    digitalWrite(SCK, HIGH);
    Var = Var << 1;
    digitalWrite(SCK, LOW);
    if (digitalRead(DAT)) Var++;
  }
  digitalWrite(SCK, HIGH);
  Var = Var ^ 0x800000;
  digitalWrite(SCK, LOW);
  return (Var);
}

Em posse do código, o carregue em seu Arduino propriamente dito ou no microcontrolador ATMEGA 328P (através de seu Arduino). Algo que ajuda bastante é gerar uma “cola” das portas utilizadas, conforme abaixo.

DIGITAL 02........D- (jack USB)
DIGITAL 03........D+ (jack USB)
DIGITAL 04........LCD 14
DIGITAL 05........LCD 13
DIGITAL 06........LCD 12
DIGITAL 07........LCD 11
DIGITAL 08........SCK (HX711)
DIGITAL 09........DAT (HX711)
DIGITAL 10........VAZIO
DIGITAL 11........LCD 06
DIGITAL 12........LCD 04
DIGITAL 13........VAZIO

Continuando com a montagem. Para não precisar gerar um “bolo” de fios em uma única imagem do Fritzing, resolvi dividir por partes. A imagem a seguir mostra a montagem do display de LCD.


Esqueci de mencionar. Deve ser soldados fios ou jumpers no jack USB.


Feito isso, montem conforme a próxima imagem.


Bom. Aqui a montagem é um pouco mais complicada e exige um pouco mais de atenção. Aqui temos o módulo conversor HX711 sendo montado já com as células de carga.


Também gerei uma imagem “mais grosseira” da montagem. Vejam abaixo.


Para facilitar e fazer que subam apenas 4 fios para a “central”, instalei uma placa para soldar (emendar) os fios.


Esse foi o teclado USB utilizado.


Calibrando a balança

Com tudo conectado ao Arduino e com ele ligado, vamos calibrar a balança. Abra o monitor da Serial da IDE Arduino e note que O valor a ser mostrado na Serial, deve ser algo próximo a 8707550. Sem peso algum e apenas com a tampa (base). Os 3 últimos número podem variar bastante.

Agora é que começa de fato esta calibragem. Coloquei como peso duas garrafas de água mineral contendo 1,5L cada. Logo, temos 3 Kg de carga na balança. O valor mostrado na Serial IDE Arduino será algo próximo a 8626550.


Para continuar precisamos saber o valor da diferença de ambos. Vejam abaixo a brilhante fórmula (rsrs).

diferença = valor da Serial sem peso - valor da Serial com peso
diferença = 8707550 - 8626550
diferença = 81000

Logo, sei que algo na casa de 81 mil equivale a um peso aproximado de 3 Kg. Agora vamos dividir os 81000 por 3, pois quero saber que valor representa 1 kg. Segue: 81000 / 3 = 27000.

Pronto. Agora sei que um valor de 27000 equivale a 1 Kg aproximado.

Se chegaram até aqui e fez tudo conforme o “script” é para estar funcionando.

Jesus vai estar vendo quando você usar meu código e projeto e falar que desenvolveu sozinho(a) “rsrsrs”.