Se você precisa medir peso com o Arduino esse é o módulo geralmente requerido. Permite conectar até dois conjuntos de células de carga (duas balanças).
Trata-se essencialmente de um amplificador de instrumentação de duas entradas multiplexadas incorporado a um conversor A/D de 24 bits. O que permite uma resolução muito superior à que seria obtida ligando um amplificador de instrumentação diretamente a uma entrada analógica do Arduino, cujo conversor A/D é de 10 bits.
- Alimentação de 2.7 a 5.5V;
- Saída digital a dois fios;
- Duas entradas multiplexadas. Você pode usar apenas a entrada A, se quiser;
- Taxa de amostragem selecionável de 10 ou 80 amostras por segundo;
- Ganho selecionável de 32, 64 e 128.
Este é o o diagrama / esquema do módulo:
É quase a mesma coisa que o diagrama típico apresentado no datasheet, com o acréscimo de C4, C5, C6, R8 e R9.
Note que existem duas referências de terra: GND e AGND
Como fazer a leitura
O valor do registrador de 24bits com o resultado da medição é lido serialmente dando 24 pulsos no pino SCK e coletando os bits no pino DT. Isso é realmente simples de fazer mesmo sem uma biblioteca, mas como elas existem vamos usá-las até porque torna o código mais fácil de entender.
A biblioteca de uso mais simples que conheço é a do chinês aguegu. Você precisa fornecer à biblioteca quatro informações:
- qual o pino de clock;
- qual o pino de dados;
- o valor de offset;
- o valor do ratio.
Você pode usar dois pinos quaisquer. A biblioteca usa nos exemplos os pinos A0 e A1 mas estes são usados no modo digital. Pinos analógicos não são requeridos.
O valor de offset é o valor que o HX711 fornece quando a balança está em repouso (seria o “zero” da balança). Para obtê-lo deixe a balança sem peso e rode o seguinte sketch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include "hx711.h" Hx711 scale(A1, A0); //A1 = dout e A0=sclk void setup() { Serial.begin(9600); } void loop() { Serial.print(scale.averageValue(1)); delay(200); } |
O valor impresso na serial pelo sketch é o offset. É normal que seja um valor grande como 8447426. Note que esse valor é aproximadamente metade de 16777215 (o maior valor possível com 24 bits). Isso é esperado porque o hx711 também lê valores negativos. Agora coloque um peso conhecido na balança, como 1kg (1000g), e execute novamente o sketch acima para obter o que a balança vê agora. Esse valor deve ser maior que o valor obtido de offset. Se não for, experimente inverter os fios S+ com S- e repita. Vamos chamar esse novo valor de “w”. Agora faça a seguinte conta para obter o ratio:
ratio = (w - offset) / 1000
E preencha os valores obtidos no sketch abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include "hx711.h" Hx711 scale(A1, A0); //<- edite aqui void setup() { Serial.begin(9600); scale.setOffset(offset); //<- edite aqui scale.setScale(ratio); //<- edite aqui } void loop() { Serial.print(scale.averageValue(1)); Serial.print(" : "); Serial.print(scale.getGram()); Serial.println('g'); delay(200); } |
O programa de exemplo acima deverá agora dar o valor aproximado de qualquer peso medido, em gramas.
Nota: a biblioteca tem um bug que faz a execução ser muito lenta. Para corrigir, abra hx711.cpp e os exemplos e mude todas as referências a averageValue() para averageValue(1). Isso na prática anula a função averageValue(), mas elimina o retardo. É melhor você tirar sua própria média dos valores lidos no loop (sugiro uma média móvel) para evitar paradas desnecessárias na execução do programa.
Leave a Comment