// How2Electronics Website, not working on simulation
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

LiquidCrystal_I2C lcd (0x27, 16,2);

#define DT 6
#define SCK 7
#define sw 9

 Servo myServo0; // create an instance of Servo Library
 Servo myServo1;

 double weight1 = 1000; // first weight na pwede magamit sa raw mat in grams (BANANAA PEEL)
 double weight2 = 1500; // second weight na pwede magamit sa raw mat in grams (PAPER)
 double weight3 = 1600; // third weight na pwede magamit sa raw mat in grams (GRASS)

 int servoPin0 = 5;
 int servoPin1 = 3;

 int pos0 = 0;
 int pos1 = 180;
 int pos3 = 0;

 int SOLENOID_PIN = 12;
 int RELAY_PIN = 13;

long sample=0;
float val=-1;
long count=1;
int currentstep = 1;
 
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()
{

  myServo0.attach(servoPin0);
  myServo1.attach(servoPin1);
  myServo0.write(pos3);
  myServo1.write(pos3);

  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("QCU ELECTRONICS");
  lcd.setCursor(0, 1);
  lcd.print("ENGINEERING DEPT");
  delay(2500);
  lcd.clear();
  delay(150);
  lcd.setCursor(3, 0);
  lcd.print("CONFIG");
  delay(200);
  lcd.setCursor(9, 0);
  lcd.print(".");
  delay(200);
  lcd.setCursor(10, 0);
  lcd.print(".");
  delay(200);
  lcd.setCursor(11, 0);
  lcd.print(".");
  delay(200);
  lcd.setCursor(12, 0);
  lcd.print(".");
  delay(200);
  delay(1000);; // initialize the LCD

pinMode(SCK, OUTPUT);
pinMode(sw, INPUT_PULLUP);
lcd.begin(16, 2);
lcd.print(" Weight ");
lcd.setCursor(0,1);
lcd.print(" Measurement ");
delay(1000);
lcd.clear();
calibrate();
}
 
void loop()
{
count= readCount();
int currentWeight=(((count-sample)/val)-2*((count-sample)/val));
lcd.setCursor(0,0);
lcd.print("Measured Weight");
lcd.setCursor(0,1);
lcd.print(currentWeight);
lcd.print("g ");
 
if(digitalRead(sw)==0)
{
val=0;
sample=0;
currentWeight=0;
count=0;
calibrate();
}

if (currentstep == 1 && currentWeight >= weight1 && currentWeight < weight2) {
    lcd.setCursor(0, 1);
    lcd.print("Target weight 1 reached!");
    digitalWrite(SOLENOID_PIN, LOW);
    digitalWrite(RELAY_PIN, LOW);
    myServo0.write(pos1);
    myServo1.write(pos1);
   
    lcd.clear();
    currentstep++;
  } else if (currentstep == 2 && currentWeight >= weight2 && currentWeight < weight3) {
    lcd.setCursor(0, 1);
    lcd.print("Target weight 2 reached!");
    digitalWrite(SOLENOID_PIN, LOW);
    digitalWrite(RELAY_PIN, LOW);
    myServo0.write(pos1);
    myServo1.write(pos1);
    
    lcd.clear();
    currentstep++;
  } else if (currentstep== 3 && currentWeight >= weight3) {
    lcd.setCursor(0, 1);
    lcd.print("Target weight 3 reached!");
    myServo0.write(pos1);
    myServo1.write(pos1);
    digitalWrite(SOLENOID_PIN, HIGH);
    delay(2000);
    digitalWrite(SOLENOID_PIN,LOW);
    delay(100);
    digitalWrite(RELAY_PIN, HIGH);
    delay(10000);
    digitalWrite(RELAY_PIN,LOW);
    delay(5000); //Double check natin yung delay kapag andyan na adjust natin~
   
    lcd.clear();
    currentstep++;
  } else {
    
    digitalWrite(SOLENOID_PIN, LOW);
    digitalWrite(RELAY_PIN, LOW);
    myServo0.write(pos0);
    myServo1.write(pos0);
  }

  currentWeight = 0; // this will be the reset for all of process
  delay(1000);

     
  }
 
void calibrate()
{
lcd.clear();
lcd.print("Calibrating...");
lcd.setCursor(0,1);
lcd.print("Please Wait...");
for(int i=0;i<100;i++)
{
count=readCount();
sample+=count;
}
sample/=100;
lcd.clear();
lcd.print("Put 100g & wait");
count=0;
while(count<1000)
{
count=readCount();
count=sample-count;
}
lcd.clear();
lcd.print("Please Wait....");
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();
}
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module