#include <ModbusRTU.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <IRremote.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
IRrecv receiver(4);
ModbusRTU mb;
int kode = 0;
int c_A = 0;
int c_B = 0;
int c_C = 0;
int c_D = 0;
int c_E = 0;
int total = 0;
bool flag1 = false;
bool flag2 = false;
bool flag3 = false;
void setup() {
Serial.begin(9600);
mb.begin(&Serial);
mb.setBaudrate(9600);
mb.slave(1);
mb.addHreg(0);
mb.addHreg(1);
mb.addHreg(2);
pinMode(2, OUTPUT);//dir
pinMode(3, OUTPUT);//step
pinMode(9, OUTPUT);//r
pinMode(10, OUTPUT);//b
pinMode(11, OUTPUT);//g
pinMode(12, OUTPUT); //Conv1
pinMode(13, OUTPUT); //Conv2
pinMode(A0, OUTPUT);//Valve
pinMode(A1, OUTPUT);//Cap
pinMode(A2, OUTPUT);//Label
digitalWrite(2, HIGH);//ccw
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Filling Simulation ");
lcd.setCursor(0, 1);
lcd.print("A: ");
lcd.setCursor(10, 1);
lcd.print("B: ");
lcd.setCursor(0, 2);
lcd.print("C: ");
lcd.setCursor(10, 2);
lcd.print("D: ");
lcd.setCursor(0, 3);
lcd.print("E: ");
lcd.setCursor(10, 3);
lcd.print("Tot: ");
receiver.enableIRIn();
delay(2000);
}
void loop() {
mb.task();
yield();
if (receiver.decode()) {
kode = receiver.decodedIRData.command;
switch (kode) {
case 48:
mb.Hreg(0, 1);
break;
case 24:
mb.Hreg(0, 2);
break;
case 122:
mb.Hreg(0, 3);
break;
case 16:
mb.Hreg(0, 4);
break;
case 56:
mb.Hreg(0, 5);
break;
case 90:
mb.Hreg(0, 6);
break;
case 66:
mb.Hreg(0, 7);
break;
case 74:
mb.Hreg(0, 8);
break;
case 82:
if (flag1) {
mb.Hreg(0, 9);
flag1 = false;
} else {
mb.Hreg(0, 10);
flag1 = true;
}
break;
}
receiver.resume();
}
int b = mb.Hreg(2);
switch (b) {
case 0:
lcd.setCursor(0, 0);
lcd.print("Initial Condition ");
break;
case 1:
lcd.setCursor(0, 0);
lcd.print("Conveyor Motor 1 ON ");
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
if (!flag2) {
color();
show();
flag2 = true;
}
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("Filling Process ");
digitalWrite(12, LOW);
digitalWrite(A0, HIGH);
flag3 = true;
break;
case 3:
lcd.setCursor(0, 0);
lcd.print("First disc rotation ");
digitalWrite(A0, LOW);
if (flag3) stepper();
break;
case 4:
lcd.setCursor(0, 0);
lcd.print("Capping Process ");
digitalWrite(A1, HIGH);
flag3 = true;
break;
case 5:
lcd.setCursor(0, 0);
lcd.print("Second disc rotation");
digitalWrite(A1, LOW);
if (flag3) stepper();
break;
case 6:
lcd.setCursor(0, 0);
lcd.print("Labelling Process ");
digitalWrite(A2, HIGH);
flag3 = true;
break;
case 7:
lcd.setCursor(0, 0);
lcd.print("Third disc rotation ");
digitalWrite(A2, LOW);
if (flag3) stepper();
break;
case 8:
lcd.setCursor(0, 0);
lcd.print("Conveyor Motor 2 ON ");
digitalWrite(13, HIGH);
flag2 = false;
break;
}
}
void color() {
int a = mb.Hreg(1);
switch (a) {
case 1:
analogWrite(9, 255);
analogWrite(11, 0);
analogWrite(10, 0);
c_A++;
break;
case 2:
analogWrite(9, 0);
analogWrite(11, 50);
analogWrite(10, 0);
c_B++;
break;
case 3:
analogWrite(9, 0);
analogWrite(11, 0);
analogWrite(10, 255);
c_C++;
break;
case 4:
analogWrite(9, 255);
analogWrite(11, 255);
analogWrite(10, 0);
c_D++;
break;
case 5:
analogWrite(9, 106);
analogWrite(11, 13);
analogWrite(10, 173);
c_E++;
break;
}
}
void show() {
total = c_A + c_B + c_C + c_D + c_E;
lcd.setCursor(3, 1);
lcd.print(c_A);
lcd.setCursor(13, 1);
lcd.print(c_B);
lcd.setCursor(3, 2);
lcd.print(c_C);
lcd.setCursor(13, 2);
lcd.print(c_D);
lcd.setCursor(3, 3);
lcd.print(c_E);
lcd.setCursor(15, 3);
lcd.print(total);
}
void stepper() {
for (int i = 0; i < 50; i++) {
digitalWrite(3, HIGH);
digitalWrite(3, LOW);
delay(10);
}
flag3 = false;
}
Conveyor1
Valve
Cap
Label
Conveyor2