#include <WiFi.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <RTClib.h>
LiquidCrystal_I2C lcd1(0x27, 16, 2);
LiquidCrystal_I2C lcd2(0x28, 20, 4);
LiquidCrystal_I2C lcd3(0x29, 20, 4);
LiquidCrystal_I2C lcd4(0x30, 20, 4);
RTC_DS1307 rtc;
const char* mqtt_server = "0.tcp.ap.ngrok.io";
const int mqtt_port = 14222;
const char* mqtt_user = "";
const char* mqtt_password = "";
String ship = "ahts";
String t_fms1 = ship + "/fm-1";
String t_fms2 = ship + "/fm-2";
String t_fms3 = ship + "/fm-3";
String t_status = ship + "/status";
WiFiClient espClient;
PubSubClient mqtt_client(espClient);
unsigned long previousMillis = 0;
unsigned long previousMillisMain = 0;
const long interval = 1000;
void setup_wifi() {
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message received on topic: ");
Serial.println(topic);
}
void mqtt_connect(){
if(mqtt_client.connect(ship.c_str(), mqtt_user, mqtt_password)) {
lcd1.setCursor(0, 0);
lcd1.print("Connected ");
}else{
mqtt_connect();
}
}
boolean reconnect() {
lcd1.setCursor(0, 0);
lcd1.print("Reconnecting");
if(mqtt_client.connect(ship.c_str(), mqtt_user, mqtt_password)) {
lcd1.setCursor(0, 0);
lcd1.print("Connected ");
}
return mqtt_client.connected();
}
// void reconnect() {
// while (!client.connected()) {
// Serial.print("Attempting MQTT connection...");
// if (client.connect(ship.c_str(), mqtt_user, mqtt_password)) {
// Serial.print("Connected");
// } else {
// lcd1.setCursor(7, 0);
// lcd1.print("Offline ");
// DateTime now = rtc.now();
// char timestamp[20];
// sprintf(timestamp, "%04d-%02d-%02d %02d:%02d:%02d", now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second());
// lcd1.setCursor(0, 1);
// lcd1.print(timestamp);
// Serial.print("failed, rc=");
// Serial.print(client.state());
// Serial.println(" try again in 5 seconds");
// delay(5000);
// }
// }
// }
void fmStatic(LiquidCrystal_I2C &lcd) {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Name :");
lcd.setCursor(0, 1);
lcd.print("Temp :");
lcd.setCursor(19, 1);
lcd.print("C");
lcd.setCursor(0, 2);
lcd.print("Flow :");
lcd.setCursor(17, 2);
lcd.print("L/m");
lcd.setCursor(0, 3);
lcd.print("Total :");
lcd.setCursor(19, 3);
lcd.print("L");
}
void fmDynamic(LiquidCrystal_I2C &lcd, String name, float temp, float flow, float total) {
lcd.setCursor(8, 0);
lcd.print(name);
lcd.setCursor(8, 1);
lcd.print(temp);
lcd.setCursor(8, 2);
lcd.print(flow);
lcd.setCursor(8, 3);
lcd.print(total);
}
void setup() {
Serial.begin(9600);
setup_wifi();
mqtt_client.setServer(mqtt_server, mqtt_port);
mqtt_client.setCallback(callback);
randomSeed(micros());
Wire.begin();
if(!rtc.begin()){
Serial.println("No Connected");
while (1);
}
lcd1.init();
lcd1.backlight();
lcd1.setCursor(0, 0);
lcd1.print("Status..");
lcd1.setCursor(0, 1);
lcd1.print("Dates..");
// lcd4.init();
// lcd4.backlight();
// lcd4.setCursor(0, 0);
// lcd4.print("GPS Coordinates");
// lcd4.setCursor(0, 1);
// lcd4.print("Lon :");
// lcd4.setCursor(0, 2);
// lcd4.print("Lat :");
// lcd4.setCursor(0, 3);
// lcd4.print("Hgt :");
fmStatic(lcd2);
fmStatic(lcd3);
fmStatic(lcd4);
lcd1.setCursor(0, 0);
lcd1.print("Connecting... ");
mqtt_connect();
}
float latitude = 0.0;
float longitude = 0.0;
float height = 0.0;
float latIncrement = 0.0001;
float longIncrement = 0.0001;
float heightIncrement = 0.001;
// float* updatePosition() {
// static float position[3];
// float latChange = (rand() % 3 - 1) * latIncrement;
// float longChange = (rand() % 3 - 1) * longIncrement;
// float heightChange = (rand() % 3 - 1) * heightIncrement;
// latitude += latChange;
// longitude += longChange;
// height += heightChange;
// latitude = constrain(latitude, -90.0, 90.0);
// longitude = constrain(longitude, -180.0, 180.0);
// height = constrain(height, 0.0, 500.0);
// position[0] = latitude;
// position[1] = longitude;
// position[2] = height;
// return position;
// }
float consumptionPerSecond1 = 0.0;
double totalConsumption1 = 0.0;
float consumptionPerSecond2 = 0.0;
double totalConsumption2 = 0.0;
float consumptionPerSecond3 = 0.0;
double totalConsumption3 = 0.0;
long lastReconnectAttempt = 0;
void loop() {
// if (!client.connected()) {
// reconnect();
// }
// client.loop();
// lcd1.setCursor(6, 0);
// lcd1.print("Connected");
DateTime now = rtc.now();
char timestamp[20];
sprintf(timestamp, "%04d-%02d-%02d %02d:%02d:%02d", now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second());
unsigned long currentMillis = millis();
lcd1.setCursor(0, 1);
lcd1.print(timestamp);
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Flowmeter
consumptionPerSecond1 = random(12, 21);
totalConsumption1 += consumptionPerSecond1;
float temperature1 = random(60, 65);
bool isReturn1 = false;
bool isTemp1 = true;
consumptionPerSecond2 = random(0, 11);
totalConsumption2 += consumptionPerSecond2;
float temperature2 = random(50, 55);
bool isReturn2 = false;
bool isTemp2 = true;
consumptionPerSecond3 = random(0, 11);
totalConsumption3 += consumptionPerSecond3;
float temperature3 = random(50, 55);
bool isReturn3 = false;
bool isTemp3 = true;
fmDynamic(lcd2, "FMS M/E", temperature1, consumptionPerSecond1, totalConsumption1);
fmDynamic(lcd3, "FMS A/E", temperature2, consumptionPerSecond2, totalConsumption2);
fmDynamic(lcd4, "FMS Bow Thruster", temperature3, consumptionPerSecond3, totalConsumption3);
// MQTT FMS
char fms1[200], fms2[200];
sprintf(fms1, "%f_%d_%d_%.2f_%s", totalConsumption1, isReturn1, isTemp1, temperature1, timestamp);
sprintf(fms2, "%f_%d_%d_%.2f_%s", totalConsumption2, isReturn2, isTemp2, temperature2, timestamp);
sprintf(fms3, "%f_%d_%d_%.2f_%s", totalConsumption3, isReturn3, isTemp3, temperature3, timestamp);
// GPS
// float* position = updatePosition();
// lcd4.setCursor(6, 1);
// lcd4.print(position[0], 6);
// lcd4.setCursor(6, 2);
// lcd4.print(position[1], 6);
// lcd4.setCursor(6, 3);
// lcd4.print(position[2], 6);
// MQTT GPS
// char gpsMsg[200];
// sprintf(gpsMsg, "%s_%s", gps.c_str(), timestamp);
// Serial.println(gpsMsg);
if (!mqtt_client.connected()) {
lcd1.setCursor(0, 1);
lcd1.print("Disconnected ");
long now = millis();
if (now - lastReconnectAttempt > 5000) {
lastReconnectAttempt = now;
if (reconnect()) {
lastReconnectAttempt = 0;
}
}
} else {
// mqtt_client.publish(device_id, msg);
mqtt_client.loop();
}
delay(1000);
}
}