Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <HX711.h>
- #include <EEPROM.h>
- const byte DOUT_PIN = 2;
- const byte SCK_PIN = 3;
- const byte TARE_BUTTON_PIN = 7;
- float calibrationFactor_lbs = 7050.0;
- const float ZERO_BAND_LBS = 0.03;
- #define EEPROM_MAGIC_ADDR 0
- #define EEPROM_OFFSET_ADDR 1
- #define EEPROM_MAGIC 0x42
- long storedOffset = 0;
- HX711 scale;
- bool tareRequested = false;
- unsigned long lastTareTime = 0;
- const unsigned long TARE_COOLDOWN_MS = 2000;
- void loadOrInitOffset();
- void tareAndSaveOffset();
- void checkTareButton();
- float readWeightLbs();
- void printWeightLbs();
- void setup() {
- Serial.begin(115200);
- delay(500);
- pinMode(TARE_BUTTON_PIN, INPUT_PULLUP);
- scale.begin(DOUT_PIN, SCK_PIN);
- Serial.println(F("Initializing HX711..."));
- unsigned long start = millis();
- while (!scale.is_ready()) {
- if (millis() - start > 3000) {
- Serial.println(F("HX711 not ready after 3s, continuing anyway..."));
- break;
- }
- }
- scale.set_scale(calibrationFactor_lbs);
- loadOrInitOffset();
- scale.set_offset(storedOffset);
- Serial.println(F("Setup complete."));
- Serial.println(F("Press tare button to zero the scale."));
- }
- void loop() {
- checkTareButton();
- if (tareRequested) {
- unsigned long now = millis();
- if (now - lastTareTime > TARE_COOLDOWN_MS) {
- Serial.println(F("Tare button pressed, zeroing scale..."));
- tareAndSaveOffset();
- lastTareTime = now;
- }
- tareRequested = false;
- }
- printWeightLbs();
- delay(500);
- }
- void checkTareButton() {
- if (digitalRead(TARE_BUTTON_PIN) == LOW) {
- delay(50);
- if (digitalRead(TARE_BUTTON_PIN) == LOW) {
- tareRequested = true;
- }
- }
- }
- void loadOrInitOffset() {
- byte magic = EEPROM.read(EEPROM_MAGIC_ADDR);
- if (magic == EEPROM_MAGIC) {
- EEPROM.get(EEPROM_OFFSET_ADDR, storedOffset);
- Serial.print(F("Loaded offset from EEPROM: "));
- Serial.println(storedOffset);
- } else {
- Serial.println(F("No EEPROM data, performing initial tare..."));
- Serial.println(F("Make sure the scale is empty!"));
- scale.tare(10);
- storedOffset = scale.get_offset();
- EEPROM.put(EEPROM_OFFSET_ADDR, storedOffset);
- EEPROM.update(EEPROM_MAGIC_ADDR, EEPROM_MAGIC);
- Serial.print(F("Initial offset saved: "));
- Serial.println(storedOffset);
- }
- }
- void tareAndSaveOffset() {
- scale.tare(10);
- storedOffset = scale.get_offset();
- EEPROM.put(EEPROM_OFFSET_ADDR, storedOffset);
- EEPROM.update(EEPROM_MAGIC_ADDR, EEPROM_MAGIC);
- Serial.print(F("New offset saved: "));
- Serial.println(storedOffset);
- }
- float readWeightLbs() {
- const uint8_t samples = 20;
- float sum = 0.0;
- for (uint8_t i = 0; i < samples; i++) {
- checkTareButton();
- sum += scale.get_units(1);
- delay(5);
- }
- float avg = sum / samples;
- if (avg > -ZERO_BAND_LBS && avg < ZERO_BAND_LBS) {
- avg = 0.0;
- }
- return avg;
- }
- void printWeightLbs() {
- float pounds = readWeightLbs();
- Serial.print(F("Weight: "));
- Serial.print(pounds, 3);
- Serial.println(F(" lb"));
- }
Advertisement
Add Comment
Please, Sign In to add comment