Grain/Filament Box Scale (Load Cell, ESP32/ESP8266, OLED 0.96")
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
- Kategoria
- Other Printer Parts & Upgrades
- 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