//ESP32 with weight sensor and OLED
//insert OLED library
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//insert HX711 library
#include "HX711.h"
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//variables for centering
byte panjang, lebar;
int16_t x, y;
uint16_t w, h;
//initialize HX711 object
// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 16;
const int LOADCELL_SCK_PIN = 4;
HX711 scale;
float calibration_factor = -1365; // for me this vlaue works just perfect 419640
void setup() {
Serial.begin(115200);
Serial.println("ESP32 Weight Display");
//init display OLED
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE); // Draw white text
display.getTextBounds("ESP32", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 0); // kursor diletakkan pada rata tengah kolom 0
display.print("ESP32");
display.getTextBounds("WEIGHT", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 20); // kursor diletakkan pada rata tengah kolom 0
display.print("WEIGHT");
display.getTextBounds("DISPLAY", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 40); // kursor diletakkan pada rata tengah kolom 0
display.print("DISPLAY");
display.display();
delay(1000);
//INIT HX711
Serial.println("init HX711");
display.clearDisplay();
display.getTextBounds("INIT HX711", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
lebar = (SCREEN_HEIGHT - h) / 2;
display.setCursor(panjang, lebar); // kursor diletakkan pada rata tengah kolom 0
display.print("INIT HX711");
display.display();
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale();
scale.tare(); //Reset the scale to 0
long zero_factor = scale.read_average(); //Get a baseline reading
delay(1000);
//ready to go
display.clearDisplay();
display.getTextBounds("Ready!!!", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
lebar = (SCREEN_HEIGHT - h) / 2;
display.setCursor(panjang, lebar); // kursor diletakkan pada rata tengah kolom 0
display.print("Ready!!!");
display.display();
Serial.println("Ready To Go");
delay(1000);
//display
display.clearDisplay();
display.getTextBounds("WEIGHT", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 0); // kursor diletakkan pada rata tengah kolom 0
display.print("WEIGHT");
display.getTextBounds("KG", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 50); // kursor diletakkan pada rata tengah kolom 0
display.print("KG");
display.display();
}
void loop() {
unsigned int ADC = scale.get_units();
float weight = float(ADC) / 2100.00 * 5.00;
Serial.print("ADC = ");
Serial.print(ADC);
Serial.print(", weight = ");
Serial.println(weight);
//DISPLAY WEIGHT IN OLED
String teks = String(weight, 2);
display.fillRect(0, 25, 128, 25, 0);
display.getTextBounds(teks.c_str(), 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 25); // kursor diletakkan pada rata tengah kolom 0
display.print(teks);
display.display();
delay(2000); // delay every 2 seconds
}