#include <WiFi.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#include <IRremote.h>
#define ssid "Wokwi-GUEST"
#define pass ""
#define server "mqtt-dashboard.com"
#define port 1883
WiFiClient espClient;
PubSubClient client(espClient);
LiquidCrystal_I2C lcd(0x27, 20, 4);
IRrecv receiver(23);
int kode = 0;
int counter = 0;
bool flag1 = false;
bool flag2 = false;
bool flag3 = false;
int i = 0;
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int f = 0;
int g = 0;
int h = 0;
int a1 = 0;
int b1 = 0;
int c1 = 0;
int d1 = 0;
int e1 = 0;
int f1 = 0;
int g1 = 0;
int h1 = 0;
void callback(char* topic, byte* payload, unsigned int length) {
JsonDocument doc;
deserializeJson(doc, payload);
a = doc["a"];
if (a > 0) a1 = a;
else a = a1;
switch (a) {
case 1:
analogWrite(25, 255);
analogWrite(33, 0);
analogWrite(32, 0);
break;
case 2:
analogWrite(25, 0);
analogWrite(33, 128);
analogWrite(32, 0);
break;
case 3:
analogWrite(25, 0);
analogWrite(33, 0);
analogWrite(32, 255);
break;
case 4:
analogWrite(25, 255);
analogWrite(33, 255);
analogWrite(32, 0);
break;
case 5:
analogWrite(25, 106);
analogWrite(33, 13);
analogWrite(32, 173);
break;
}
b = doc["b"];
switch (b) {
case 1:
lcd.setCursor(0, 0);
lcd.print("Conveyor Motor 1 ON ");
digitalWrite(15, LOW);
digitalWrite(19, HIGH);
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("Filling Process ");
digitalWrite(19, LOW);
digitalWrite(18, HIGH);
flag3 = true;
break;
case 3:
lcd.setCursor(0, 0);
lcd.print("First disc rotation ");
digitalWrite(18, LOW);
digitalWrite(5, HIGH);
if (flag3) stepper();
break;
case 4:
lcd.setCursor(0, 0);
lcd.print("Capping Process ");
digitalWrite(5, LOW);
digitalWrite(17, HIGH);
flag3 = true;
break;
case 5:
lcd.setCursor(0, 0);
lcd.print("Second disc rotation");
digitalWrite(17, LOW);
digitalWrite(16, HIGH);
if (flag3) stepper();
break;
case 6:
lcd.setCursor(0, 0);
lcd.print("Labelling Process ");
digitalWrite(16, LOW);
digitalWrite(4, HIGH);
flag3 = true;
break;
case 7:
lcd.setCursor(0, 0);
lcd.print("Third disc rotation ");
digitalWrite(4, LOW);
digitalWrite(2, HIGH);
if (flag3) stepper();
break;
case 8:
lcd.setCursor(0, 0);
lcd.print("Conveyor Motor 2 ON ");
digitalWrite(2, LOW);
digitalWrite(15, HIGH);
flag2 = false;
break;
}
c = doc["c"];
if (c > 0) {
c1 = c;
lcd.setCursor(3, 1);
lcd.print(c);
}
else c = c1;
d = doc["d"];
if (d > 0) {
d1 = d;
lcd.setCursor(13, 1);
lcd.print(d);
}
else d = d1;
e = doc["e"];
if (e > 0) {
e1 = e;
lcd.setCursor(3, 2);
lcd.print(e);
}
else e = e1;
f = doc["f"];
if (f > 0) {
f1 = f;
lcd.setCursor(13, 2);
lcd.print(f);
}
else f = f1;
g = doc["g"];
if (g > 0) {
g1 = g;
lcd.setCursor(3, 3);
lcd.print(g);
}
else g = g1;
h = doc["h"];
if (h > 0) {
h1 = h;
lcd.setCursor(15, 3);
lcd.print(h);
}
else h = h1;
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("MQTT Connected");
client.publish("filling/sub", "0");
client.subscribe("filling/pub");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (counter > 10) {
ESP.restart();
}
counter++;
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
pinMode(13, OUTPUT);//step
pinMode(25, OUTPUT);//r
pinMode(33, OUTPUT);//b
pinMode(32, OUTPUT);//g
pinMode(19, OUTPUT);//state1
pinMode(18, OUTPUT);//state2
pinMode(5, OUTPUT); //state3
pinMode(17, OUTPUT);//state4
pinMode(16, OUTPUT);//state5
pinMode(4, OUTPUT); //state6
pinMode(2, OUTPUT); //state7
pinMode(15, OUTPUT);//state8
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();
client.setServer(server, 1883);
client.setCallback(callback);
delay(1000);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if (receiver.decode()) {
kode = receiver.decodedIRData.command;
switch (kode) {
case 48:
Serial.println('1');
client.publish("filling/sub", "1");
break;
case 24:
Serial.println('2');
client.publish("filling/sub", "2");
break;
case 122:
Serial.println('3');
client.publish("filling/sub", "3");
break;
case 16:
Serial.println('4');
client.publish("filling/sub", "4");
break;
case 56:
Serial.println('5');
client.publish("filling/sub", "5");
break;
case 90:
Serial.println('6');
client.publish("filling/sub", "6");
break;
case 66:
Serial.println('7');
client.publish("filling/sub", "7");
break;
case 74:
Serial.println('8');
client.publish("filling/sub", "8");
break;
case 82:
if (flag1) {
Serial.println('9');
client.publish("filling/sub", "9");
flag1 = false;
} else {
Serial.println("10");
client.publish("filling/sub", "10");
flag1 = true;
}
break;
}
receiver.resume();
}
}
void stepper() {
for (int i = 0; i < 50; i++) {
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
delay(5);
}
flag3 = false;
}