#include <Servo.h>
#include <HX711_ADC.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 16);
//Weight selection buttons
#define Preset_50g 14
#define Preset_100g 15
#define Preset_250g 16
#define Preset_500g 17
#define Preset_1000g 25
#define Preset_2000g 26
#define bagServopin 44
#define dispanserServopin 45
//#define FeederMotor 20
#define GMotor1 22
#define GMotor2 24
#define GMotor3 26
#define M1Controller 11 //A Motor driver
#define M2Controller 12 //A Motor driver
#define M3Controller 13 //B Motor driver
//#define FMController 44// B Motor Driver
#define Buzzer 40
#define LimitSW 38
//load cell pins
const int HX711_dout = 4; //mcu > HX711 dout pin
const int HX711_sck = 5; //mcu > HX711 sck pin
HX711_ADC LoadCell(HX711_dout, HX711_sck);
int tpin = 3; //tare pushbutton
int ledGreen = 6; //floating weight indicator
int ledRed = 7; //final weight inddicator
const int calVal_eepromAdress = 0;
long t;
const int Up_buttonPin = 9; // the pin that the pushbutton is attached to
const int Down_buttonPin = 8;
float buttonPushCounter = 0; // counter for the number of button presses
float up_buttonState = 0; // current state of the up button
float up_lastButtonState = 0; // previous state of the up button
float down_buttonState = 0; // current state of the up button
float down_lastButtonState = 0; // previous state of the up button
bool bPress = false;
//float weight;
float weight = LoadCell.getData();
//float calibration_factor = 419640;
float calibrationValue = 696.0; // calibration value (see example file "Calibration.ino")
//calibrationValue = 696.0; // uncomment this if you want to set the calibration value in the sketch
const int trigPin = 18; // Trigger Pin of Ultrasonic Sensor
const int echoPin = 19; // Echo Pin of Ultrasonic Sensor
Servo bagServo;
Servo dispanserServo;
bool sevenStep;
bool eightStep;
bool nineStep;
bool tenStep;
bool elevenStep;
bool twelveStep;
bool thirteenStep;
bool fourteenStep;
bool fifteenStep;
bool sixteenStep;
bool seventeenStep;
bool eighteenStep;
bool ninteenStep;
bool twentyStep;
bool twentyoneStep;
bool twentytwoStep;
bool a, b, c, d, e, f;
bool limitSwitch;
unsigned long readCount(void) {
unsigned long Count;
unsigned char i;
float DT;
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(9600);
delay(10);
Serial.println();
Serial.println("Starting...");
pinMode(SCK, OUTPUT);
lcd.begin(0x27, 2, 1);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Product of:");
lcd.setCursor(0, 1);
lcd.print("Fixmation Ltd");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DRY,POWDER FOOD");
lcd.setCursor(0, 1);
lcd.print("Packing Machine");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Select Weight: ");
// calibrate(); // this should fix
pinMode(Preset_50g, INPUT_PULLUP);
pinMode(Preset_100g, INPUT_PULLUP);
pinMode(Preset_250g, INPUT_PULLUP);
pinMode(Preset_500g, INPUT_PULLUP);
pinMode(Preset_1000g, INPUT_PULLUP);
pinMode(Preset_2000g, INPUT_PULLUP);
// pinMode(FeederMotor,OUTPUT);
pinMode(GMotor1, OUTPUT); //Feeder motor
pinMode(GMotor2, OUTPUT); //Conveyer Motor
pinMode(GMotor3, OUTPUT); // Ring bag cutter motor
pinMode(M1Controller, OUTPUT);
pinMode(M2Controller, OUTPUT);
pinMode(M3Controller, OUTPUT);
//pinMode(FMController,OUTPUT);
//pinMode(Loadcell, INPUT);
pinMode(Buzzer, OUTPUT);
pinMode(LimitSW, INPUT);
bagServo.attach(bagServopin);
dispanserServo.attach(dispanserServopin);
pinMode(tpin, INPUT_PULLUP);
pinMode(ledGreen, OUTPUT);
pinMode(ledRed, OUTPUT);
pinMode(Up_buttonPin, INPUT_PULLUP);
pinMode(Down_buttonPin, INPUT_PULLUP);
LoadCell.begin();
#if defined(ESP8266) || defined(ESP32)
//EEPROM.begin(512); // uncomment this if you use ESP8266/ESP32 and want to fetch the calibration value from eeprom
#endif
EEPROM.get(calVal_eepromAdress, calibrationValue); // uncomment this if you want to fetch the calibration value from eeprom
long stabilizingtime = 2000; // preciscion right after power-up can be improved by adding a few seconds of stabilizing time
boolean _tare = true; //set this to false if you don't want tare to be performed in the next step
LoadCell.start(stabilizingtime, _tare);
if (LoadCell.getTareTimeoutFlag()) {
Serial.println("Timeout, check MCU>HX711 wiring and pin designations");
while (1)
;
} else {
LoadCell.setCalFactor(calibrationValue); // set calibration value (float)
Serial.println("Startup is complete");
}
}
void loop() {
if (digitalRead(LimitSW) == HIGH) { //Function for Bag roll level
limitSwitch = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bagroll Is Empty");
lcd.setCursor(0, 1);
lcd.print("Reload Or Off?");
delay(4000);
digitalWrite(Buzzer, HIGH);
delay(200);
digitalWrite(Buzzer, LOW);
} else if (digitalRead(LimitSW) == LOW) {
limitSwitch = false;
}
long duration, inches, cm;
pinMode(trigPin, OUTPUT);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
inches = microsecondsToInches(duration);
while (inches > 13 || inches <= 15) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tray Is Empty ");
lcd.setCursor(0, 1);
lcd.print("Fill It Or Off?");
delay(4000);
digitalWrite(Buzzer, HIGH);
delay(200);
digitalWrite(Buzzer, LOW);
}
if (Preset_50g == HIGH) {
a = true;
sevenStep = true;
} else if (Preset_100g == HIGH) {
b = true;
sevenStep = true;
} else if (Preset_250g == HIGH) {
c = true;
sevenStep = true;
} else if (Preset_500g == HIGH) {
d = true;
sevenStep = true;
} else if (Preset_1000g == HIGH) {
e = true;
sevenStep = true;
} else if (Preset_2000g == HIGH) {
f = true;
sevenStep = true;
} else {
sevenStep = false;
}
if (inches == 7 && sevenStep == true && a == true && limitSwitch == false) {
fiftygram();
} else if (inches == 5 && sevenStep == true && b == true && limitSwitch == false) {
hundreadgram();
} else if (inches == 4 && sevenStep == true && c == true && limitSwitch == false) {
twofiftyhundreadgram();
} else if (inches == 3 && sevenStep == true && d == true && limitSwitch == false) {
fivehundreadgram();
} else if (inches == 2 && sevenStep == true && e == true && limitSwitch == false) {
thousandgram();
} else if (inches == 1 && sevenStep == true && f == true && limitSwitch == false) {
twothousandgram();
}
}
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}
void fiftygram() {
analogWrite(M1Controller, 100); //Bag feeder speed
digitalWrite(GMotor1, HIGH);
delay(3000); //runtime
digitalWrite(GMotor1, LOW);
delay(50);
bagServo.write(90);
delay(2000);
bagServo.write(0);
delay(100);
analogWrite(M3Controller, 200); //Ring bag cutter speed
digitalWrite(GMotor3, HIGH);
delay(1000);
digitalWrite(GMotor3, LOW);
delay(100);
dispanserServo.write(90);
delay(1500);
// dispanserServo.write(0);
//delay(100);
//weight = LoadCell.getData();
loadcell();
if (Serial.available()) {
char temp = Serial.read();
if (temp == '+' || temp == 'a')
calibrationValue += 10;
else if (temp == '-' || temp == 'z')
calibrationValue -= 10;
}
if (weight >= 50 || weight >= 52) { //check this calculation
dispanserServo.write(0);
delay(1000);
} else {
dispanserServo.write(90);
delay(1500);
}
analogWrite(M1Controller, 100); //Bag feeder speed
digitalWrite(GMotor1, HIGH);
delay(3000); //varies on packett size
digitalWrite(GMotor1, LOW);
delay(100);
dispanserServo.write(90);
delay(2000);
dispanserServo.write(0);
delay(100);
analogWrite(M2Controller, 50); //Bag feeder speed
digitalWrite(GMotor2, HIGH);
delay(3000); //varies on packett size
digitalWrite(GMotor2, LOW);
delay(100);
}
void hundreadgram() {
analogWrite(M1Controller, 100); //Bag feeder speed
digitalWrite(GMotor1, HIGH);
delay(3000); //runtime
digitalWrite(GMotor1, LOW);
delay(50);
bagServo.write(90);
delay(2000);
bagServo.write(0);
delay(100);
analogWrite(M3Controller, 200); //Ring bag cutter speed
digitalWrite(GMotor3, HIGH);
delay(1000);
digitalWrite(GMotor3, LOW);
delay(100);
dispanserServo.write(90);
delay(1500);
// dispanserServo.write(0);
//delay(100);
//weight = LoadCell.getData();
loadcell();
if (Serial.available()) {
char temp = Serial.read();
if (temp == '+' || temp == 'a')
calibrationValue += 10;
else if (temp == '-' || temp == 'z')
calibrationValue -= 10;
}
if (weight >= 100 || weight >= 102) { //check this calculation
dispanserServo.write(0);
delay(1000);
} else {
dispanserServo.write(90);
delay(1500);
}
analogWrite(M1Controller, 100); //Bag feeder speed
digitalWrite(GMotor1, HIGH);
delay(3000); //varies on packett size
digitalWrite(GMotor1, LOW);
delay(100);
dispanserServo.write(90);
delay(2000);
dispanserServo.write(0);
delay(100);
analogWrite(M2Controller, 50); //Bag feeder speed
digitalWrite(GMotor2, HIGH);
delay(3000); //varies on packett size
digitalWrite(GMotor2, LOW);
delay(100);
}
void twofiftyhundreadgram() {
analogWrite(M1Controller, 100); //Bag feeder speed
digitalWrite(GMotor1, HIGH);
delay(3000); //runtime
digitalWrite(GMotor1, LOW);
delay(50);
bagServo.write(90);
delay(2000);
bagServo.write(0);
delay(100);
analogWrite(M3Controller, 200); //Ring bag cutter speed
digitalWrite(GMotor3, HIGH);
delay(1000);
digitalWrite(GMotor3, LOW);
delay(100);
dispanserServo.write(90);
delay(1500);
// dispanserServo.write(0);
//delay(100);
//weight = LoadCell.getData();
loadcell();
if (Serial.available()) {
char temp = Serial.read();
if (temp == '+' || temp == 'a')
calibrationValue += 10;
else if (temp == '-' || temp == 'z')
calibrationValue -= 10;
}
if (weight >= 250 || weight >= 252) { //check this calculation
dispanserServo.write(0);
delay(1000);
} else {
dispanserServo.write(90);
delay(1500);
}
analogWrite(M1Controller, 100); //Bag feeder speed
digitalWrite(GMotor1, HIGH);
delay(3000); //varies on packett size
digitalWrite(GMotor1, LOW);
delay(100);
dispanserServo.write(90);
delay(2000);
dispanserServo.write(0);
delay(100);
analogWrite(M2Controller, 50); //Bag feeder speed
digitalWrite(GMotor2, HIGH);
delay(3000); //varies on packett size
digitalWrite(GMotor2, LOW);
delay(100);
}
void fivehundreadgram() {
analogWrite(M1Controller, 100); //Bag feeder speed
digitalWrite(GMotor1, HIGH);
delay(3000); //runtime
digitalWrite(GMotor1, LOW);
delay(50);
bagServo.write(90);
delay(2000);
bagServo.write(0);
delay(100);
analogWrite(M3Controller, 200); //Ring bag cutter speed
digitalWrite(GMotor3, HIGH);
delay(1000);
digitalWrite(GMotor3, LOW);
delay(100);
dispanserServo.write(90);
delay(1500);
// dispanserServo.write(0);
//delay(100);
//weight = LoadCell.getData();
loadcell();
if (Serial.available()) {
char temp = Serial.read();
if (temp == '+' || temp == 'a')
calibrationValue += 10;
else if (temp == '-' || temp == 'z')
calibrationValue -= 10;
}
if (weight >= 500 || weight >= 502) { //check this calculation
dispanserServo.write(0);
delay(1000);
} else {
dispanserServo.write(90);
delay(1500);
}
analogWrite(M1Controller, 100); //Bag feeder speed
digitalWrite(GMotor1, HIGH);
delay(3000); //varies on packett size
digitalWrite(GMotor1, LOW);
delay(100);
dispanserServo.write(90);
delay(2000);
dispanserServo.write(0);
delay(100);
analogWrite(M2Controller, 50); //Bag feeder speed
digitalWrite(GMotor2, HIGH);
delay(3000); //varies on packett size
digitalWrite(GMotor2, LOW);
delay(100);
}
void thousandgram() {
analogWrite(M1Controller, 100); //Bag feeder speed
digitalWrite(GMotor1, HIGH);
delay(3000); //runtime
digitalWrite(GMotor1, LOW);
delay(50);
bagServo.write(90);
delay(2000);
bagServo.write(0);
delay(100);
analogWrite(M3Controller, 200); //Ring bag cutter speed
digitalWrite(GMotor3, HIGH);
delay(1000);
digitalWrite(GMotor3, LOW);
delay(100);
dispanserServo.write(90);
delay(1500);
// dispanserServo.write(0);
//delay(100);
//weight = LoadCell.getData();
loadcell();
if (Serial.available()) {
char temp = Serial.read();
if (temp == '+' || temp == 'a')
calibrationValue += 10;
else if (temp == '-' || temp == 'z')
calibrationValue -= 10;
}
if (weight >= 1000 || weight >= 1002) { //check this calculation
dispanserServo.write(0);
delay(1000);
} else {
dispanserServo.write(90);
delay(1500);
}
analogWrite(M1Controller, 100); //Bag feeder speed
digitalWrite(GMotor1, HIGH);
delay(3000); //varies on packett size
digitalWrite(GMotor1, LOW);
delay(100);
dispanserServo.write(90);
delay(2000);
dispanserServo.write(0);
delay(100);
analogWrite(M2Controller, 50); //Bag feeder speed
digitalWrite(GMotor2, HIGH);
delay(3000); //varies on packett size
digitalWrite(GMotor2, LOW);
delay(100);
}
void twothousandgram() {
analogWrite(M1Controller, 100); //Bag feeder speed
digitalWrite(GMotor1, HIGH);
delay(3000); //runtime
digitalWrite(GMotor1, LOW);
delay(50);
bagServo.write(90);
delay(2000);
bagServo.write(0);
delay(100);
analogWrite(M3Controller, 200); //Ring bag cutter speed
digitalWrite(GMotor3, HIGH);
delay(1000);
digitalWrite(GMotor3, LOW);
delay(100);
dispanserServo.write(90);
delay(1500);
// dispanserServo.write(0);
//delay(100);
//weight = LoadCell.getData();
loadcell();
if (Serial.available()) {
char temp = Serial.read();
if (temp == '+' || temp == 'a')
calibrationValue += 10;
else if (temp == '-' || temp == 'z')
calibrationValue -= 10;
}
if (weight >= 2000 || weight >= 2002) { //check this calculation
dispanserServo.write(0);
delay(1000);
} else {
dispanserServo.write(90);
delay(1500);
}
analogWrite(M1Controller, 100); //Bag feeder speed
digitalWrite(GMotor1, HIGH);
delay(3000); //varies on packett size
digitalWrite(GMotor1, LOW);
delay(100);
dispanserServo.write(90);
delay(2000);
dispanserServo.write(0);
delay(100);
analogWrite(M2Controller, 50); //Bag feeder speed
digitalWrite(GMotor2, HIGH);
delay(3000); //varies on packett size
digitalWrite(GMotor2, LOW);
delay(100);
}
void loadcell() {
static boolean newDataReady = 0;
const int serialPrintInterval = 0; //increase value to slow down serial print activity
// check for new data/start next conversion:
if (LoadCell.update()) newDataReady = true;
// get smoothed value from the dataset:
if (newDataReady)
{
if (millis() > t + serialPrintInterval) {
//float weight = LoadCell.getData();
Serial.print("Load_cell output val: ");
Serial.println(weight);
newDataReady = 0;
t = millis();
lcd.setCursor(0, 0);
lcd.print("set wt:");
lcd.setCursor(9, 0);
lcd.print(buttonPushCounter);
lcd.setCursor(14, 0);
lcd.print("gm");
lcd.setCursor(0, 1);
lcd.print("weight :");
lcd.setCursor(9, 1);
lcd.print(weight);
lcd.setCursor(14, 1);
lcd.print("gm");
}
}
checkUp();
checkDown();
if (digitalRead(tpin) == LOW) {
LoadCell.tareNoDelay();
}
// check if last tare operation is complete:
if (LoadCell.getTareStatus() == true) {
lcd.clear();
lcd.print("Tare complete");
delay(1000);
lcd.clear();
}
float i = LoadCell.getData();
float k = buttonPushCounter - i;
if ( k < 50 && k > 1 )
{
digitalWrite (ledGreen, HIGH);
delay(50);
digitalWrite (ledGreen, LOW);
delay(50);
}
if ( k >= 50 )
{
digitalWrite (ledGreen, HIGH);
delay(200);
digitalWrite (ledGreen, LOW);
delay(200);
}
if (i >= buttonPushCounter)
{
digitalWrite (ledGreen, LOW);
digitalWrite (ledRed, HIGH);
}
else
{
digitalWrite(ledRed, LOW);
}
}
void checkUp()
{
up_buttonState = digitalRead(Up_buttonPin);
// compare the buttonState to its previous state
if (up_buttonState != up_lastButtonState)
{
// if the state has changed, increment the counter
if (up_buttonState == LOW)
{
bPress = true;
// if the current state is HIGH then the button went from off to on:
buttonPushCounter = buttonPushCounter + 10;
}
}
// save the current state as the last state, for next time through the loop
up_lastButtonState = up_buttonState;
}
void checkDown()
{
down_buttonState = digitalRead(Down_buttonPin);
// compare the buttonState to its previous state
if (down_buttonState != down_lastButtonState)
{
// if the state has changed, increment the counter
if (down_buttonState == LOW)
{
bPress = true;
buttonPushCounter = buttonPushCounter - 10;
}
}
// save the current state as the last state, for next time through the loop
down_lastButtonState = down_buttonState;
}