info@esociety.com.gt
Contacto
Báscula con Arduino Nano

Nombre: Báscula para café - Arduino nano

Nivel de Dificultad: ⭐

Descripción: 

En este proyecto diseño y construyo una báscula digital para café utilizando un Arduino Nano, una celda de carga de 10 kg con módulo HX711 y una pantalla OLED 128×64.

La báscula permite medir el peso en tiempo real en gramos, cuenta con tara automática al encender, botón de tara manual, filtrado de señal para mayor estabilidad y un sistema de calibración por software.

Este proyecto está pensado como una herramienta práctica para baristas, makers o estudiantes que quieran aprender sobre sensores de fuerza, adquisición de datos, filtrado de señales y sistemas embebidos, aplicados a un caso real.



Lista de materiales

Diagrama

Diagrama

Código:

#include "HX711.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// ---------- OLED ----------
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define OLED_ADDR 0x3C

// ---------- HX711 ----------
#define HX_DOUT A1
#define HX_SCK  A0
HX711 scale;

// ---------- Botón Tara ----------
#define BTN_TARE 4

// ---------- Calibración ----------
float calibration_factor = 198.2; // <-- TU valor calibrado

// ---------- Filtro ----------
const int N = 10;
float buffer[N];
int idx = 0;
bool filled = false;

unsigned long lastTareMs = 0;

float movingAverage(float v) {
  buffer[idx] = v;
  idx = (idx + 1) % N;
  if (idx == 0) filled = true;

  float sum = 0;
  int count = filled ? N : idx;
  for (int i = 0; i < count; i++) sum += buffer[i];
  return sum / count;
}

void drawWeight(float g) {
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);

  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print("Cafe Scale (g)");

  display.setTextSize(2);
  display.setCursor(0, 18);
  display.print(g, 1);
  display.print(" g");

  display.display();
}

void drawMsg(const char* msg) {
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println(msg);
  display.display();
}

void setup() {
  Serial.begin(115200);

  pinMode(BTN_TARE, INPUT_PULLUP);

  // OLED
  if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
    while (1) {}
  }

  // HX711
  scale.begin(HX_DOUT, HX_SCK);
  scale.set_scale(calibration_factor);

  // ✅ Auto TARA al encender
  drawMsg("Estabilizando...\nNo tocar");
  delay(1500);
  scale.tare(30);
  drawMsg("Listo!");
  delay(400);
}

void loop() {
  // 🔘 Botón de Tara manual
  if (digitalRead(BTN_TARE) == LOW && millis() - lastTareMs > 600) {
    drawMsg("TARANDO...");
    scale.tare(30);
    lastTareMs = millis();
    delay(300);
  }

  float grams_raw = scale.get_units(10);
  float grams = movingAverage(grams_raw);

  if (abs(grams) < 0.3) grams = 0;

  drawWeight(grams);

  Serial.print("g: ");
  Serial.println(grams, 2);

  delay(80);
}



Video Armado