// IFMA - Embarcatech - fev/2025
// Unidade 7 - Projeto de Sistema Embarcado
// Nome: Alberto Carlos de Oliveira Andrade
#include "pico/stdlib.h"
#include "hardware/gpio.h"
// Definição dos pinos de comunicação com o HX711
#define DT 2 // Pino de dados (DT)
#define SCK 3 // Pino de clock (SCK)
// Definição dos pinos dos LEDs do LED Bar Graph (10 LEDs)
const uint LEDS[10] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4};
// Definições relacionadas à calibração e limites de peso
#define PESO_MAX_G 5000.0 // Peso máximo suportado (5000g)
#define PESO_POR_LED (PESO_MAX_G / 10.0) // Peso correspondente a cada LED aceso
#define LIMITE_CRITICO_SUP 4000.0 // Limite superior crítico (acima de 4000g)
#define LIMITE_CRITICO_INF 1000.0 // Limite inferior crítico (abaixo de 1000g)
float fator_calibracao = 0.42; // Fator de calibração do sensor HX711
// Função para ler os dados do HX711
int32_t read_hx711() {
int32_t data = 0;
// Aguarda até que o sinal DT esteja baixo, indicando que a leitura está pronta
while (gpio_get(DT)) {
tight_loop_contents(); // Previne loop vazio consumindo ciclos de CPU
}
// Lê os 24 bits de dados do sensor
for (int i = 0; i < 24; i++) {
gpio_put(SCK, 1); // Gera o pulso de clock
data = (data << 1) | gpio_get(DT); // Acumula o valor de cada bit
gpio_put(SCK, 0); // Finaliza o pulso de clock
}
// Gera um pulso extra no SCK para completar a leitura
gpio_put(SCK, 1);
gpio_put(SCK, 0);
// Verifica o bit de sinal (se é negativo) e ajusta os 32 bits
if (data & 0x800000) {
data |= 0xFF000000; // Ajusta para números negativos
}
return data; // Retorna o valor de leitura bruto
}
// Configuração dos pinos GPIO
void setup() {
stdio_init_all(); // Inicializa a comunicação serial
// Configura o pino de dados (DT) como entrada
gpio_init(DT);
gpio_set_dir(DT, GPIO_IN);
// Configura o pino de clock (SCK) como saída
gpio_init(SCK);
gpio_set_dir(SCK, GPIO_OUT);
// Configura os pinos dos LEDs como saídas
for (int i = 0; i < 10; i++) {
gpio_init(LEDS[i]);
gpio_set_dir(LEDS[i], GPIO_OUT);
}
}
// Função para piscar os LEDs 10 vezes antes de atualizar o estado final
void piscar_leds() {
for (int j = 0; j < 10; j++) { // Pisca 10 vezes
for (int i = 0; i < 10; i++) {
gpio_put(LEDS[i], 1); // Acende todos os LEDs
}
sleep_ms(200); // Atraso de 200ms
for (int i = 0; i < 10; i++) {
gpio_put(LEDS[i], 0); // Apaga todos os LEDs
}
sleep_ms(200); // Atraso de 200ms
}
}
// Função para atualizar os LEDs com base no peso detectado
void update_leds(float peso) {
static int last_active_leds = -1; // Variável para armazenar o último número de LEDs acesos
int active_leds = (int)(peso / PESO_POR_LED); // Calcula quantos LEDs devem ser acesos
// Se o número de LEDs ativos mudou, atualiza os LEDs
if (active_leds != last_active_leds) {
for (int i = 0; i < 10; i++) {
gpio_put(LEDS[i], i < active_leds); // Acende ou apaga cada LED
}
last_active_leds = active_leds; // Atualiza o último número de LEDs acesos
}
}
int main() {
setup(); // Configura os pinos e inicializa o sistema
printf("Iniciando leitura...\n"); // Mensagem inicial
sleep_ms(2000); // Atraso de 2 segundos antes de começar a leitura
while (true) {
// Lê o valor bruto do HX711 e calcula o peso
int32_t leitura_bruta = read_hx711();
float peso = leitura_bruta / fator_calibracao; // Calcula o peso real
static float last_peso = -1; // Variável para armazenar o último peso detectado
// Se o peso atual for diferente do último peso, realiza a atualização
if (peso != last_peso) {
printf("Peso: %.2f g\n", peso); // Exibe o peso atual
// Se o peso atingir um limite crítico, pisca os LEDs antes de atualizar
if (peso >= LIMITE_CRITICO_SUP || peso <= LIMITE_CRITICO_INF) {
piscar_leds(); // Pisca os LEDs para alerta
}
update_leds(peso); // Atualiza os LEDs conforme o peso
last_peso = peso; // Atualiza o último peso registrado
}
tight_loop_contents(); // Previne loop vazio consumindo ciclos de CPU
}
return 0;
}Barra gráfica de LEDs
Célula de Carga (5 kg)