1 / 4
Grain/Filament Box Scale (Load Cell, ESP32/ESP8266, OLED 0.96") — zdjęcie 1
1 / 4

Grain/Filament Box Scale (Load Cell, ESP32/ESP8266, OLED 0.96")

Zamów wydruk tego modelu

Obliczymy ostateczną cenę na podstawie wybranego pliku. Sprawdzisz ją i zaakceptujesz przed płatnością.

Zapisane na tym urządzeniu.

Two-part scale base for measuring filament or grain weight. Fits a 5kg load cell + HX711, ESP32/ESP8266, and 0.96" OLED

Ocena
0 / 5
Polubienia
1
Pobrania
19
Wydruki
0
Wyświetlenia
280
Oceny
0

Aktualizacja u źródła:

Informacje o modelu

Źródło
Printables
Licencja
Creative Commons — Public Domain

This 3D printable enclosure is designed as a simple and functional base for a smart weigh scale—ideal for monitoring the remaining filament on a spool or measuring grain. The setup includes two STL files:

  • BASE – Holds the 5kg load cell securely and mounts a 0.96" OLED display for live weight readouts.
  • TOP – Covers the electronics compartment and supports the load platform.

Size: 220x105mm.

Compatible Components:

  • Standard 5kg load cell + HX711
  • ESP32 or ESP8266 microcontroller. I used an ESP32C3.
  • 0.96" I2C OLED display (SSD1306)
    • Cutout made for the version with black PCB tagged as NEW on ali. Based on this mount, but without the pins since it's hard to print them on the right size in this orientation. A little hotglue or tape will do.

Perfect for makers who want to track filament usage with precision. Combine with ESPHome or custom firmware for real-time data integration into Home Assistant or other smart platforms.

Example ESPHome code below. This will create a sensor with the actual weight in grams and a sensor with the percentage of filament left. 

 

[...]

web_server: port: 80 version: 3 sorting_groups: - id: sorting_group_weight_settings name: "Weight Settings" sorting_weight: 10 captive_portal:

light:

  • platform: binary name: "Blue Light" output: light_output id: led_light restore_mode: ALWAYS_OFF

output:

  • platform: gpio pin: GPIO8 id: light_output inverted: true

number:

  • platform: template name: "Full Spool Weight" id: full_weight optimistic: true min_value: 1 max_value: 2000 step: 1 initial_value: 1800 restore_value: true web_server: sorting_group_id: sorting_group_weight_settings
  • platform: template name: "Empty Spool Weight" id: empty_weight optimistic: true min_value: 1 max_value: 1000 step: 1 initial_value: 725 restore_value: true web_server: sorting_group_id: sorting_group_weight_settings

sensor:

  • platform: hx711 id: weight #name: "HX711 Value" name: "Actual total weight" dout_pin: GPIO2 clk_pin: GPIO1 gain: 128 update_interval: 10s #0kg=91295 #598g=331702 #1040g=511456 filters:
    • calibrate_linear:
      • 91295 -> 0
      • 511456 -> 1040
    • lambda: |- return x < 0 ? 0 : x;
    • round: 0 unit_of_measurement: g
  • platform: template name: "Filament left Percentage" id: weight_percentage unit_of_measurement: "%" accuracy_decimals: 1 update_interval: 10s filters:
    • round: 2 lambda: |- float current_weight = id(weight).state; float full = id(full_weight).state; float empty = id(empty_weight).state; if (current_weight <= empty) { return 0.0; } else if (current_weight >= full) { return 100.0; } else { return ((current_weight - empty) / (full - empty)) * 100.0; }
  • platform: wifi_signal name: "WiFi Signal Sensor" update_interval: 30s

#for ref.:

730gr = empty weight (total)

1800gr = full weight (total)

LCD bus I2C

i2c: sda: GPIO5 scl: GPIO6 scan: true id: bus_a frequency: 800kHz

display:

  • platform: ssd1306_i2c id: "my_display" model: "SSD1306_128x64" rotation: 180 update_interval: 1s
    offset_y: 0 offset_x: 0 #invert: True # Optional address: 0x3C pages:
    • id: page1 lambda: |- it.print(0, 0, id(my_font), "Weight:"); if (id(weight).has_state()) { char buf[20]; snprintf(buf, sizeof(buf), "%.0f g", id(weight).state); it.print(0, 14, id(my_font_big), buf); } else { it.print(0, 14, id(my_font), "No data"); }
    • id: page2 lambda: |- if (id(weight_percentage).has_state()) { char buf[20]; snprintf(buf, sizeof(buf), "%.0f%%", id(weight_percentage).state); it.print(0, 0, id(my_font_biggest), buf); } else { it.print(0, 0, id(my_font), "No data"); }

interval:

  • interval: 3s then:
    • display.page.show_next: my_display
    • component.update: my_display

font:

  • file: "fonts/Roboto-Regular.ttf" ## Choose your font from the esphome fonts folder id: my_font size: 16

  • file: "fonts/Roboto-Regular.ttf" ## Choose your font from the esphome fonts folder id: my_font_big size: 40

  • file: "fonts/Roboto-Regular.ttf" ## Choose your font from the esphome fonts folder id: my_font_biggest size: 64

Tagi