/* Arduino code for a precision scale with a 1Kg load cell, HX711 ADC and mode selector
Schematic: https://electronoobs.com/eng_arduino_tut115_sch1.php
Code: https://electronoobs.com/eng_arduino_tut115_code1.php
Video: https://youtu.be/LRd3W_p8PJ4 */
//https://how2electronics.com/weighing-machine-arduino-load-cell-hx711/
#include <Q2HX711.h> //Downlaod from here: https://electronoobs.com/eng_arduino_hx711.php
#include <EEPROM.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Oled designation --------------------------------------------
#define OLED_ADDR 0x3C // OLED i2c address
#define SCREEN_WIDTH 128 // OLED display width, in pixels (usually 128)
#define SCREEN_HEIGHT 64 // OLED display height, in pixels (64 for larger oLEDs)
#define OLED_RESET -1 // Reset pin gpio (or -1 if sharing Arduino reset pin)
#define SSD1306_NO_SPLASH
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define DT 14
#define SCK 23
#define sw_pin 5
long sample = 0;
float val = 0;
long count = 0;
unsigned long readCount(void)
{
unsigned long Count;
unsigned char i;
pinMode(DT, OUTPUT);
digitalWrite(DT, HIGH);
digitalWrite(SCK, LOW);
Count = 0;
pinMode(DT, INPUT);
while (digitalRead(DT));
for (i = 0; i < 24; i++)
{
digitalWrite(SCK, HIGH);
Count = Count << 1;
digitalWrite(SCK, LOW);
if (digitalRead(DT))
Count++;
}
digitalWrite(SCK, HIGH);
Count = Count ^ 0x800000;
digitalWrite(SCK, LOW);
return (Count);
}
void setup()
{
Serial.begin(115200);
delay(500);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(30, 20);
display.println(F("Teststation"));
display.setCursor(25, 30);
display.println(F("Software V1.0"));
display.setCursor(0, 40);
display.println(F("Code by Carlos Costa"));
display.display();
delay(1000);
pinMode(SCK, OUTPUT);
pinMode(sw_pin, INPUT_PULLUP);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F(" Weight "));
display.setCursor(0, 10);
display.println(F(" Measurement "));
display.display();
delay(1000);
//calibrate();
}
void loop()
{
count = readCount();
int w = (((count - sample) / val) - 2 * ((count - sample) / val));
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("Measured Weight"));
display.setCursor(0, 10);
display.print(w);
display.setCursor(50, 10);
display.print("g ");
display.display();
if (!digitalRead(sw_pin) )
{
val = 0;
sample = 0;
w = 0;
count = 0;
calibrate();
}
}
void calibrate()
{
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("Calibrating..."));
display.setCursor(0, 10);
display.println(F("Please Wait..."));
display.display();
Serial.println("1");
for (int i = 0; i < 100; i++)
{
count = readCount();
sample += count;
Serial.print(count);
}
Serial.println("2");
sample /= 100;
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("Put 100g & wait"));
display.display();
count = 0;
while (count < 1000)
{
count = readCount();
count = sample - count;
}
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("Please Wait...."));
display.display();
delay(2000);
for (int i = 0; i < 100; i++)
{
count = readCount();
val += sample - count;
}
val = val / 100.0;
val = val / 100.0; // put here your calibrating weight
//lcd.clear();
}