#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <PubSubClient.h>
#define LEDPIN 12
#define BUTTONPIN 15
#define DELAYTIME 50
#define BAUDRATE 9600
boolean ledState;
unsigned long timePrevious, timeCurrent;
#define OLED_RESET 4
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const char* ssid = "Wokwi-GUEST";
const char* pass = "";
const char* broker = "mqtt.eclipseprojects.io";
const char* subs_led_action = "mqtttest/led_action";
const char* pub_led_status = "mqtttest/led_status";
const char* pub_led_action = "mqtttest/led_action";
const int brokerPort = 1883;
long MQTTLastPublishTime;
long MQTTPublishInterval = 10000;
String macAddr;
String ipAddr;
WiFiClient wifiClient;
PubSubClient mqtt(wifiClient);
void WifiSetup(){
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.println(".");
display.display();
display.clearDisplay();
delay(500);
}
ipAddr = WiFi.localIP().toString().c_str();
macAddr = WiFi.macAddress();
Serial.print("Connected at: ");
Serial.println(ipAddr);
Serial.println(WiFi.localIP());
Serial.print("MAC: ");
Serial.println(macAddr);
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.println("WIFI Connected.");
display.display();
display.clearDisplay();
}
void MqttSetup(){
mqtt.setServer(broker, brokerPort);
mqtt.setCallback(Callback);
}
void Reconnect(){
Serial.println("Connecting to MQTT Broker...");
while (!mqtt.connected()) {
Serial.println("Reconnecting to MQTT Broker..");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (mqtt.connect(clientId.c_str())) {
Serial.print("ID: ");
Serial.println(clientId);
Serial.println("Connected.");
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.println("MQTT Broker Connected.");
display.display();
display.clearDisplay();
mqtt.subscribe(subs_led_action);
}
else {
Serial.print("failed, rc=");
Serial.print(mqtt.state());
Serial.println(" try again in 5 seconds");
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.println("MQTT Broker Connecting fail, try again in 5 seconds.");
display.display();
display.clearDisplay();
delay(5000);
}
}
}
// for mqtt-subscriber
void Callback(char* topic, byte* message, unsigned int length){
Serial.print("Incoming topic: ");
Serial.println(topic);
String _messageStr;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
_messageStr += (char)message[i];
}
Serial.println();
if(String(topic) == subs_led_action){
_messageStr.toLowerCase();
if( _messageStr == "change"){
Serial.println("By MQTT:");
updateLed();
if(ledState) {
Serial.println("The light is on!");
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.println("The light is turn ON by MQTT.");
display.display();
display.clearDisplay();
}else {
Serial.println("The light is off");
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.println("The light is turn OFF by MQTT.");
display.display();
display.clearDisplay();
}
}
}
}
void setup() {
Serial.begin(BAUDRATE);
pinMode(LEDPIN, OUTPUT);
pinMode(BUTTONPIN, INPUT_PULLUP);
ledState = LOW;
digitalWrite(LEDPIN, ledState);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
delay(1000);
WifiSetup();
delay(1000);
MqttSetup();
}
void updateLed() {
timeCurrent = millis();
if((timeCurrent - timePrevious) > DELAYTIME) {
timePrevious = timeCurrent;
ledState = !ledState;
digitalWrite(LEDPIN, ledState);
}
}
void loop() {
char* receivedChar = "0";
if(Serial.available()>0) {
//receivedChar = Serial.read();
//Serial.println(receivedChar);
static char str[34]; // For strings of max length=33
delay(64);
memset(str,0,sizeof(str));
byte count=0;
while (Serial.available())
{
char c=Serial.read();
if (c>=32 && count<sizeof(str)-1)
{
str[count]=c;
count++;
}
}
receivedChar = str;
}
boolean buttonPrevious, buttonCurrent;
buttonPrevious = digitalRead(BUTTONPIN);
delay(DELAYTIME);
buttonCurrent = digitalRead(BUTTONPIN);
if (buttonCurrent == LOW && buttonCurrent != buttonPrevious) {
updateLed();
Serial.println("Change by Pushbutton: ");
if(ledState) {
Serial.println("The light is on");
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.println("The light is turn ON by Pushbutton.");
display.display();
display.clearDisplay();
}else {
Serial.println("The light is off");
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.println("The light is turn OFF by Pushbutton.");
display.display();
display.clearDisplay();
}
}
if( !mqtt.connected()){
Reconnect();
}
if ((millis() - MQTTLastPublishTime) >= MQTTPublishInterval ) {
if(ledState) {
mqtt.publish(pub_led_status, String("ON").c_str());
}else {
mqtt.publish(pub_led_status, String("OFF").c_str());
}
Serial.println("Publish LED Ststus to MQTT Broker");
MQTTLastPublishTime = millis();
}
mqtt.loop();
if(strcmp(receivedChar,"input") == 0) {
Serial.println("By Command:");
updateLed();
if(ledState) {
Serial.println("The light is on!");
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.println("The light is turn ON by Command.");
display.display();
display.clearDisplay();
}else {
Serial.println("The light is off");
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.println("The light is turn OFF by Command.");
display.display();
display.clearDisplay();
}
}
}