#include <LiquidCrystal.h>
#include <WiFi.h>
#include <PubSubClient.h>
#define MCU_BAUD_RATE 115200
#define NET_SSID "Wokwi-GUEST"
#define NET_PASS ""
#define MQTT_SERVER "broker.hivemq.com"
#define MQTT_PORT 1883
#define P_RELAY 33
void get_incoming_msg(const char topic[], byte *payload, unsigned int length);
enum LCD_PINOUT {
P_RS = 21,
P_E = 18,
P_D4 = 25,
P_D5 = 26,
P_D6 = 27,
P_D7 = 14
};
LiquidCrystal disp(P_RS, P_E, P_D4, P_D5, P_D6, P_D7);
WiFiClient wifi_client;
PubSubClient mqtt_client(wifi_client);
void connect_to_wifi() {
WiFi.mode(WIFI_STA);
WiFi.begin(NET_SSID, NET_PASS, 6);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to network!");
}
void connect_to_mqtt_server() {
while(!mqtt_client.connected()) {
if(mqtt_client.connect("clientId-4140-recv")) {
Serial.println("Connected to MQTT Server!");
mqtt_client.subscribe("security-system/code");
} else {
delay(5000);
Serial.println("Retrying...");
}
}
}
void get_incoming_msg(const char topic[], byte *payload, unsigned int length) {
//Taka ne trjabva da se pishe embedded kod, ama njama problem, obeshtavam!
char pass[length + 1] = {0};
memcpy(pass, payload, length);
String str(pass);
bool is_janitor = (str == "123#");
bool is_guard = (str == "456#");
disp.clear();
disp.setCursor(0, 0);
disp.print("Code: " + str);
disp.setCursor(0, 1);
if(is_janitor || is_guard) {
if(is_janitor) {
disp.print("Access: Janitor");
} else {
disp.print("Access: Guard");
}
digitalWrite(P_RELAY, HIGH);
delay(5000);
digitalWrite(P_RELAY, LOW);
} else {
disp.print("Access denied.");
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(MCU_BAUD_RATE);
pinMode(P_RELAY, OUTPUT);
digitalWrite(P_RELAY, LOW);
connect_to_wifi();
mqtt_client.setServer(MQTT_SERVER, MQTT_PORT);
mqtt_client.setCallback(get_incoming_msg);
disp.begin(20, 4);
disp.clear();
disp.setCursor(0, 0);
}
void loop() {
delay(10); // this speeds up the simulation
// put your main code here, to run repeatedly:
if(!mqtt_client.connected()) {
connect_to_mqtt_server();
}
mqtt_client.loop();
}