Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


Balança digital com ESP32



Que tal montar uma balança digital utilizando um ESP32 e um sensor, mais conhecido como célula de carga? Pois hoje, vou te mostrar como fazer isso através de um processo que te possibilita também outros testes de laboratório, como identificar a força que um motor efetua sobre um ponto, entre outros exemplos.                            
.


Vou, então, demonstrar alguns conceitos relacionados ao uso de células de carga, capturar dados da célula para construir uma balança de exemplo e apontar outras possíveis aplicações das células de carga.


Recursos usados

·         ESP WiFi Lora 32 da Heltec
·         Célula de carga (0 à 50 newtons, aproveitada de uma balança)
·         1 potenciômetro de 100k (melhor se utilizar um trimpot multivoltas para ajuste fino)
·         1 Amp Op LM358
·         2 resistores de 1M5
·         2 resistores de 10k
·         1 resistor de 4k7
·         Fios
·         Protoboard
·         Cabo usb para o ESP
·         Uma balança, recipiente com volume graduado ou qualquer outro método para calibração.



Demonstração





Células de carga

·         São transdutores de força.
·         Podem utilizar de vários métodos para traduzir a força aplicada em uma grandeza proporcional que pode ser utilizada como medida. Entre os mais comuns estão os que utilizam extensômetros de folha, o efeito piezoeléctrico, hidráulica, cordas vibrantes...
·         Podem também ser classificadas pela forma de medida (tensão ou compressão)




Células de carga e extensômetros


·         Extensômetros de folha são filmes (comumente de plástico) com um fio impresso cuja resistência pode variar com sua mudança de dimensão.
·         Sua construção visa principalmente converter uma deformação mecânica em uma variação de uma grandeza elétrica (resistência). Preferencialmente em uma única direção, para que a avaliação de componentes possa ser efetuada. Para isso é comum a combinação de vários extensômetros.
·         Quando corretamente fixado em um corpo, sua deformação é igual a do corpo. Assim, sua resistência varia com a deformação do corpo, que por sua vez está relacionada a força deformadora.
·         São conhecidos também com strain gauge.


·         Quando alongados por uma força de tensão, os fios alongam-se e estreitam-se, aumentando a resistência.
·         Quando comprimidos por uma força de compressão, os fios se encurtam e alargam-se, diminuindo a resistência.



Ponte de Wheatstone


·         Para uma medida mais precisa e para permitir uma detecção mais eficiente da variação da resistência em uma célula de carga, os strain gauge são montados formando uma ponte de Wheatstone.
·         Nesta configuração, podemos determinar a variação da resistência através do desequilíbrio da ponte.
·         Se R1=Rx e R2=R3, os divisores de tensão serão iguais e as tensões Vc e Vb também serão iguais, estando a ponte em equilíbrio. Ou seja, Vbc = 0V;
·         Se Rx for diferente de R1, a ponte estará desequilibrada e a tensão Vbc será diferente de zero.
·         É possível demostrar como essa variação deverá ocorrer, mas aqui, faremos uma calibração direta, relacionando o valor lido no ADC  a uma massa aplicada à célula de carga.




Amplificação

·         Mesmo utilizando a ponte de Wheatstone para tornar a leitura mais eficiente, as micro deformações no metal da célula de carga produzem pequenas variações de tensão entre Vbc.
·         Para resolver esta situação, vamos utilizar dois estágios de amplificação. Um para determinar a diferença e outro para adequar o valor obtido ao ADC do ESP.





Amplificação (esquema)

·         O ganho da etapa de subtração é dado por R6/R5 e é o mesmo que R7/R8.
·         O ganho da etapa final não-inversora é dado por Pot/R10





Coleção de dados para calibração


·         Depois de montado, ajustamos o ganho final para que o valor da maior massa medida fosse próximo do valor máximo do ADC. No caso, para 2kg aplicados na célula, a tensão de saída estava por volta de 3V3.
·         Em seguida, variamos a massa aplicada, conhecida através de uma balança e para cada valor, associamos uma leitura do ADC, obtendo a tabela ao lado.





Obtendo a função de relação entre a massa medida e o valor do ADC obtido

Utilizamos o software PolySolve para obter um polinômio que represente a relação entre a massa e o valor do ADC.





Código-fonte - #Includes

Agora que já temos como obter as medidas e conhecemos a relação entre o ADC e a massa aplicada, podemos passar para a escrita do software de fato.

//Bibliotecas para utilização do display oLED
#include <Wire.h>  // Necessário apenas para o Arduino 1.6.5 e anterior
#include "SSD1306.h" // o mesmo que #include "SSD1306Wire.h"




Código-fonte - #Defines


//Os pinos do OLED estão conectados ao ESP32 pelos seguintes GPIO's:
//OLED_SDA -- GPIO4
//OLED_SCL -- GPIO15
//OLED_RST -- GPIO16

#define SDA    4
#define SCL   15
#define RST   16 //RST deve ser ajustado por software



Código-fonte – Variáveis e constantes globais


SSD1306  display(0x3c, SDA, SCL, RST); //Instanciando e ajustando os pinos do objeto "display"

const int amostras = 10000; //número de amostras coletadas para a média
const int pin = 13; //pino de leitura




Código-fonte – Setup()


void setup()
{
  pinMode(pin, INPUT); //pino de leitura analógica
  Serial.begin(115200); //iniciando a serial

  // Inicia o display
  display.init();

  display.flipScreenVertically(); //Vira a tela verticalmente
}




Código-fonte – Loop()


void loop()
{
  float medidas = 0.0;//variável para manipular as medidas
  float massa = 0.0; //variável para armazenar o valor da massa

  //inicia a coleta de amostras do ADC
  for (int i = 0; i < amostras; i++)
  {
    medidas = medidas + float(analogRead(pin));
  }

  medidas = (medidas / float(amostras));//Tira a média das amostras

  massa = calculaMassa(medidas); //Calcula a massa em gramas

  //Ao iniciar, exibirá uma mensagem por 5 segundos
  //para só depois mostrar as medidas realizadas

  if (millis() > (5000)) //se está ligado a mais que 5 segundos
  {
    //Envia um CSV contendo o instante, a medida média do ADC e o valor em gramas
    //para a Serial.
    Serial.print (millis() / 1000.0, 0); //instante em segundos
    Serial.print( " , ");
    Serial.print(medidas, 3);//valor médio obtido no ADC
    Serial.print( " , ");
    Serial.println((massa), 1); //massa em gramas

    //Escreve no buffer do display
    display.clear(); //Limpa o buffer do display
    //ajusta o alinhamento para a esquerda
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    //ajusta a fonte para Arial 16
    display.setFont(ArialMT_Plain_16);
    //Escreve no buffer do display a massa
    display.drawString(0, 0, "Massa: " + String(int(massa)) + "g");
    //escreve no buffer o valor do ADC
    display.drawString(0, 30, "ADC: " + String(int(medidas)));
  }
  else //se está ligado a menos de 5 segundos
  {
    display.clear(); //limpa o buffer do display
    display.setTextAlignment(TEXT_ALIGN_LEFT); //Ajusta o alinhamento para a esquerda
    display.setFont(ArialMT_Plain_24); //ajusta a fonte para Arial 24
    display.drawString(0, 0, "Balança"); //escreve no buffer
    display.setFont(ArialMT_Plain_16);//Ajusta a fonte para Arial 16
    display.drawString(0, 26, "ESP-WiFi-Lora"); //escreve no buffer
  }
  display.display();//transfere o buffer para o display

  delay(50);
}




Código-fonte – Função calculaMassa()


//função para cálculo da massa obtida pela regressão
//usando oPolySolve
float calculaMassa (float medida)
{
  return  -6.798357840659e+01
          +   3.885671618930e-01  * medida
          +   3.684944764970e-04 * medida * medida
          +  -3.748108838320e-07 * medida * medida * medida
          +   1.796252359323e-10 * medida * medida * medida * medida
          +  -3.995722708150e-14  * medida * medida * medida * medida * medida
          +   3.284692453344e-18  * medida * medida * medida * medida * medida * medida;
}




Iniciando e medindo





Faça o download dos arquivos




                

Postar um comentário

7 Comentários

  1. Professor Fernando o senhor é o melhor , eu estava procurando algo exatamente o que senhor propos so que quero uma balança que meça até 100kg mais ajudou muito

    ResponderExcluir
  2. O link para o arquivo .ino não esta funcionando.

    ResponderExcluir
  3. Se receber o peso e mostrar no celular via html fica mais interessante. Trabalha com nada que foi apresentado ainda.

    ResponderExcluir
  4. Professor, poderia me dar alguma sugestão para o ESP32 realizar a leitura de até 8 células de carga? Obrigado.

    ResponderExcluir
  5. Professor, preciso desse Polysolve que você usou. É um programa? Ou web?

    ResponderExcluir
  6. Gostaria de ver esse projeto com ESP32-Wroom + HX711 + Display LCD 20x4 com I2C Backlight Azul

    ResponderExcluir
  7. não consegui fazer o meu rodar e o problema está na biblioteca local "SSD1307.h" , ou ela está dentro de wire.h ou não sei mas deveria acompanhar o codigo

    ResponderExcluir