Hx711 6ª Alterações no código
Pelo esquema do modulo HX-711 podemos ver que o pino RATE e o pino X1 estão ligados ao terra, ou seja esta configurado para usar o oscilador interno com uma taxa de amostragem próxima a 10 amostras por segundo (10 SPS ).
Como temos 10 SPS a conversão ocorre a aproximadamente a cada 0,1 segundos ou 100ms (100 mili-segundos). Vamos começar com uma media para 5 amostras ou 500ms a cada pedido de captura!
Média de cinco amostras.
Para o calculo da media (pequeno filtro) a ideia é criar um código bem simples, um for (loop) que soma a cada passagem depois divide pelo numero de passagens do loop.
unsigned long MEDIA = 0;
for (int j=0; j<5; j++){ // loop 5 para media
........ // Código captura
MEDIA += CAPTURA;
}
CAPTURA = MEDIA/5;
return CAPTURA;
Determina o valor de TARA.
Os valores de amostra sem carga (peso em cima da balança) apresentam uma variação muito alta. Somente a partir de uns 3Kg de carga, que as leituras estão se estabilizando, vamos criar uma media bem maior com 10 (dez) passagens de captura. Totalizando 50 AMOSTRAS para o calculo da media da TARA (50 vezes 0,1 segundos da uns 5 segundos para operação de TARA).
unsigned long TARA = 0;
for (int i=0; i<10; i++) TARA +=CAPTURA();
return TARA/10;
Depois de uns testes rápidos, decidi que o melhor é criar uma sub rotina MEDIA(x), para ser usada dentro das rotinas TARA e CAPTURA, para facilitar o código.
Como temos 10 SPS a conversão ocorre a aproximadamente a cada 0,1 segundos ou 100ms (100 mili-segundos). Vamos começar com uma media para 5 amostras ou 500ms a cada pedido de captura!
Média de cinco amostras.
Para o calculo da media (pequeno filtro) a ideia é criar um código bem simples, um for (loop) que soma a cada passagem depois divide pelo numero de passagens do loop.
unsigned long MEDIA = 0;
for (int j=0; j<5; j++){ // loop 5 para media
........ // Código captura
MEDIA += CAPTURA;
}
CAPTURA = MEDIA/5;
return CAPTURA;
Determina o valor de TARA.
Depois de uns testes rápidos, decidi que o melhor é criar uma sub rotina MEDIA(x), para ser usada dentro das rotinas TARA e CAPTURA, para facilitar o código.
unsigned long setTARA(){
// reseta o conversor HX711
digitalWrite(hxSCK, 1);
delay (200);
digitalWrite(hxSCK, LOW);
// -------------------------
return Media(70); // Calcula média de 350 AMOSTRAS 35 segundos!
}
Calculo Geral da Média.
Como na função CAPTURA foi calculada uma media de cinco amostras e para pequenos valores de peso não ficou adequado, vamos fazer uma rotina que possamos definir o numero de AMOSTRAS para o calculo da média para usarmos de uma forma mais dinâmica posteriormente.
Calculo Geral da Média.
long Media(byte vezes)
{
long soma = 0;
for (byte i = 0; i < vezes; i++)
{
soma += CAPTURA();
}
return soma / vezes;
}
long Media(byte vezes)
{
long soma = 0;
for (byte i = 0; i < vezes; i++)
{
soma += CAPTURA();
}
return soma / vezes;
}
Calcular o valor do peso.
float Peso()
{
long peso = (Media(X) - TARA); // X numero de amostras
return (float) peso / kconst;
}
Para pequenos valores de peso o valor de X deve ser alto! O próximo passo e criar uma media móvel para que o tempo entre leituras parecer mais adequado.
O código para o segundo teste ficou (muito tempo entre as leituras ótima repetibilidade):
const int DOUT = A5; // Pino DT placa HX711
const int hxSCK = A4; // Pino SCK placa HX711
unsigned long TARA = 0;
float kconst = 21097.164; // Fator para Kilograma pequenos pesos
void setup() {
Serial.begin(9600);
pinMode(hxSCK, OUTPUT);
pinMode(DOUT, INPUT);
Serial.println("Aguarde estou zerando!");
TARA = setTARA();
Serial.println("Estou pronto!");
}
void loop() {
Serial.print(Peso());
Serial.println(" Kg");
delay (10); //Aguarda 10ms
}
unsigned long CAPTURA(){
unsigned long CAPTURA = 0;
unsigned long MEDIA = 0;
for (int j=0; j<5; j++){ // loop 5 para media
CAPTURA = 0;
digitalWrite(hxSCK, LOW);
while (digitalRead(DOUT)==1) ;
for (int i=0; i<24; i++){ // loop 24 pulsos
digitalWrite(hxSCK, HIGH);
CAPTURA = CAPTURA<<1;
digitalWrite(hxSCK, LOW);
if(digitalRead(DOUT) == 1) CAPTURA++;
}
// pulso extra 25 pulsos proxima leitura canal A ganho 128
digitalWrite(hxSCK, HIGH);
delayMicroseconds(10);
digitalWrite(hxSCK, LOW);
//-------------------------------------------------------
CAPTURA ^= 0x00800000;
MEDIA += CAPTURA;
}
CAPTURA = MEDIA/5;
return CAPTURA;
}
unsigned long setTARA(){
// reseta o conversor HX711
digitalWrite(hxSCK, 1);
delay (200);
digitalWrite(hxSCK, LOW);
delay (1);
// -------------------------
return Media(70);
}
float Peso()
{
long peso = (Media(50) - TARA);
return (float) peso / kconst;
}
long Media(byte vezes)
{
long soma = 0;
for (byte i = 0; i < vezes; i++)
{
soma += CAPTURA();
}
return soma / vezes;
}
Continua....
2ª PARTE DATA SHEET
3ª PARTE Primeiro Código
4ª PARTE HARDWARE - Alterações balança de banheiro
5ª PARTE 1º TESTE
6ª PARTE Média + TARA
2ª PARTE DATA SHEET
3ª PARTE Primeiro Código
4ª PARTE HARDWARE - Alterações balança de banheiro
5ª PARTE 1º TESTE
6ª PARTE Média + TARA
Nenhum comentário:
Postar um comentário