#include <WiFi.h>
#include "PubSubClient.h"
#define LDR 36
#define LED_W 19
#define LED_G 32
#define BT_I35 35
#define TOPIC_LED_W "/ledW"
#define TOPIC_LED_G "/ledG"
#define TOPIC_BT_I35 "/btI35"
#define TOPIC_REQUEST_LDR "/ldrReq"
#define TOPIC_LDR "/ldr"
#define TOPIC_PING "/ping"
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// const char* mqttServer = "broker.emqx.io";
const char* mqtt_server = "vps656540.ovh.net"; // Your MQTT broker
const int mqtt_port = 1883;
const char* mqtt_user = "user";
const char* mqtt_password = "pass";
String stMac;
char mac[50];
char clientId[50];
WiFiClient espClient;
PubSubClient client(espClient);
boolean bPressedButton(int nWhichOne) {
if (digitalRead(nWhichOne))
return false;
return true;
}
void vSupervisingButton() {
static int n = 0;
static boolean bI35wasPressed = false;
boolean bI35currentState = bPressedButton(BT_I35);
if (bI35wasPressed != bI35currentState) {
delay(2);
Serial.print("Publishing topic: "); Serial.println(String("/" + String(stMac) + TOPIC_BT_I35).c_str());
if (bI35currentState) {
client.publish(String("/" + String(stMac) + TOPIC_BT_I35).c_str(), "I35 pressed");
Serial.println("Button I35 pressed");
} else {
client.publish(String("/" + String(stMac) + TOPIC_BT_I35).c_str(), "I35 released");
Serial.println("Button I35 released");
}
bI35wasPressed = bI35currentState;
}
//json_IoT["bI35"] = (bI35currentState) ? "1" : "0";
//json_IoT["LDR"] = analogRead(LDR);
/*
n += 1;
if( n > 100 ){
client.publish(String("/" + String(stMac) + TOPIC_PING).c_str(), "keep alive");
// Serial.println("ping mqtt");
n = 0;
}
*/
}
void setup() {
Serial.begin(115200);
randomSeed(analogRead(0));
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
wifiConnect();
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println(WiFi.macAddress());
//stMac = WiFi.macAddress();
//stMac.replace(":", "");
stMac = "7C9EBDF872FC_2893"; // <-- 2893
Serial.println(stMac);
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
client.setKeepAlive(10);
pinMode(LED_W, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(BT_I35,INPUT);
}
void wifiConnect() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
void mqttReconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
long r = random(1000);
sprintf(clientId, "clientId-%ld", r);
if (client.connect(clientId, mqtt_user, mqtt_password)) {
Serial.print(clientId);
Serial.println(" connected");
client.subscribe(String("/" + String(stMac) + TOPIC_LED_W).c_str());
client.subscribe(String("/" + String(stMac) + TOPIC_LED_G).c_str());
client.subscribe(String("/" + String(stMac) + TOPIC_REQUEST_LDR).c_str());
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
String szTopic = String(topic), szPayload = "";
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
szPayload += (char)payload[i];
}
Serial.println();
if (szTopic == String("/" + String(stMac) + TOPIC_LED_W).c_str()) {
if ((char)payload[0] == '1') {
digitalWrite(LED_W, HIGH);
} else {
digitalWrite(LED_W, LOW);
}
}
if (szTopic == String("/" + String(stMac) + TOPIC_LED_G).c_str()) {
if ((char)payload[0] == '1') {
digitalWrite(LED_G, HIGH);
} else {
digitalWrite(LED_G, LOW);
}
}
if (szTopic == String("/" + String(stMac) + TOPIC_REQUEST_LDR).c_str()) {
String szLdr = String(analogRead(LDR));
Serial.print("LDR: "); Serial.println(szLdr);
client.publish( String("/" + String(stMac) + TOPIC_LDR).c_str(), szLdr.c_str());
}
}
void loop() {
delay(10);
if (!client.connected()) {
mqttReconnect();
}
vSupervisingButton();
client.loop();
}