#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <HX711.h>
#include <SD.h>
#include <EEPROM.h>
const int DOUT_PIN = 9; // Connect HX711 DOUT pin to Arduino digital pin 9
const int CLK_PIN = 8; // Connect HX711 CLK pin to Arduino digital pin 8
const int SD_CS_PIN = 10; // Connect SD card CS pin to Arduino digital pin 7
HX711 scale;
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 columns and 2 rows
unsigned long previousSerialMillis = 0;
unsigned long previousSDMillis = 0;
const long intervalSerial = 2000; // 2 seconds interval for serial output
const long intervalSD = 5000; // 5 seconds interval for SD card logging
// Scale factor for calibration
const float SCALE_FACTOR = 0.42;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
scale.begin(DOUT_PIN, CLK_PIN);
// Apply the scale factor
scale.set_scale(SCALE_FACTOR);
if (!scale.is_ready()) {
Serial.println("Error initializing the HX711. Check your connections.");
while (1);
}
if (!SD.begin(SD_CS_PIN)) {
Serial.println("Error initializing SD card. Check if the card is inserted properly.");
while (1);
}
lcd.print("Weight Logger");
delay(2000);
lcd.clear();
}
void loop() {
unsigned long currentMillis = millis();
// Display current weight on LCD
float weight = scale.get_units(10);
lcd.setCursor(0, 0);
lcd.print("Weight: " + String(weight, 2) + " g");
// Log data to SD card every 5 seconds
if (currentMillis - previousSDMillis >= intervalSD) {
previousSDMillis = currentMillis;
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.println("Weight: " + String(weight, 2) + " g");
dataFile.close();
Serial.println("Data logged to SD card.");
lcd.setCursor(0, 1);
lcd.print("Logged to SD");
delay(1000); // Display the message on LCD for 1 second
lcd.clear();
} else {
Serial.println("Error opening datalog.txt");
lcd.setCursor(0, 1);
lcd.print("SD Card Error");
delay(1000); // Display the message on LCD for 1 second
lcd.clear();
}
}
// Print weight to serial monitor every 2 seconds
if (currentMillis - previousSerialMillis >= intervalSerial) {
previousSerialMillis = currentMillis;
Serial.println("Current Weight: " + String(weight, 2) + " g");
}
}