#include "pico/stdlib.h"
#include "hardware/gpio.h"
// Definição dos pinos do HX711
#define DT 2
#define SCK 3
// Definição dos pinos do LED Bar Graph (10 LEDs)
const uint LEDS[10] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4};
// Variável de calibração (Agora dinâmica)
#define PESO_MAX_G 5000.0 // 5000g (5kg)
#define PESO_POR_LED (PESO_MAX_G / 10.0) // Cada LED acende a cada 500g
float fator_calibracao = 0.42; // Novo fator baseado na leitura
// Função otimizada para leitura do HX711
int32_t read_hx711() {
int32_t data = 0;
// Aguarda o HX711 estar pronto (reduz latência)
while (gpio_get(DT)) {
tight_loop_contents();
}
// Leitura de 24 bits
for (int i = 0; i < 24; i++) {
gpio_put(SCK, 1);
data = (data << 1) | gpio_get(DT);
gpio_put(SCK, 0);
}
// Pulso extra para definir ganho do canal
gpio_put(SCK, 1);
gpio_put(SCK, 0);
// Ajuste de sinal (complemento de dois)
if (data & 0x800000) {
data |= 0xFF000000; // Expande o sinal negativo
}
return data;
}
// Configuração dos GPIOs do Raspberry Pi Pico W
void setup() {
stdio_init_all();
gpio_init(DT);
gpio_set_dir(DT, GPIO_IN);
gpio_init(SCK);
gpio_set_dir(SCK, GPIO_OUT);
// Configuração dos LEDs como saída
for (int i = 0; i < 10; i++) {
gpio_init(LEDS[i]);
gpio_set_dir(LEDS[i], GPIO_OUT);
}
}
// Atualiza os LEDs SOMENTE quando o peso muda (evita processamento desnecessário)
void update_leds(float peso) {
static int last_active_leds = -1; // Armazena o último estado dos LEDs
int active_leds = (int)(peso / PESO_POR_LED);
if (active_leds != last_active_leds) { // Atualiza apenas se o estado mudar
for (int i = 0; i < 10; i++) {
gpio_put(LEDS[i], i < active_leds);
}
last_active_leds = active_leds;
}
}
int main() {
setup();
printf("Iniciando leitura...\n");
sleep_ms(2000); // Pequena pausa para inicialização
while (true) {
int32_t leitura_bruta = read_hx711();
float peso = leitura_bruta / fator_calibracao; // Converte para gramas
static float last_peso = -1;
if (peso != last_peso) { // Atualiza apenas se o peso mudar
printf("Peso: %.2f g\n", peso);
update_leds(peso);
last_peso = peso;
}
tight_loop_contents(); // Mantém o loop eficiente
}
return 0;
}
Barra gráfica de LEDs
Célula de Carga (5 kg)