#include <WiFi.h>
#include "PubSubClient.h"
#define led1 22
#define led2 21
#define led3 5
#define sw1 26
#define sw2 27
#define sw3 14
#define adcCh1 35
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "broker.hivemq.com";
int port = 1883;
String stMac;
char mac[50];
char clientId[50];
const byte led[] = {4,2,15};
const byte sw[] = {13,12,14};
const byte dipsw[] = {27,33,23,22,21,19,18,5};
bool previousDipSwState[8];
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
int i,c;
Serial.begin(115200);
for(i=0;i<3;i++){
pinMode(led[i], OUTPUT); digitalWrite(led[i], LOW);
pinMode(sw[i], INPUT_PULLUP);
}
for (int c = 0; c < 8; c++){
pinMode(dipsw[c], INPUT_PULLUP);
previousDipSwState[c] = false;
}
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(":", "_");
Serial.println(stMac);
client.setServer(mqttServer, port);
client.setCallback(callback);
}
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)) {
Serial.print(clientId);
Serial.println(" connected");
client.subscribe("@MSG/espController/hyperQ/#");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* message, unsigned int length) {
int i;
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String stMessage;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
stMessage += (char)message[i];
}
Serial.println();
if(String(topic) == "@MSG/espController/hyperQ/led/on") {
i = stMessage.toInt();
digitalWrite(led[i-1],1);
Serial.println("LED ch" + String(i) + " On");
String responseMessage = "led" + String(i) + " is on";
client.publish("@MSG/espController/hyperQ/led/data", responseMessage.c_str());
}else if(String(topic) == "@MSG/espController/hyperQ/led/off"){
i = stMessage.toInt();
digitalWrite(led[i-1],0);
Serial.println("LED ch" + String(i) + " Off");
String responseMessage = "led" + String(i) + " is off";
client.publish("@MSG/espController/hyperQ/led/data", responseMessage.c_str());
}else if(String(topic) == "@MSG/espController/hyperQ/adc"){
if(stMessage == "st"){
updateDataADC();
}
}else if(String(topic) == "@MSG/espController/hyperQ/"){
if(stMessage == "rst"){
for(int n=0;n<8;n++){
SendDPdata(n);
}for(int n=0;n<3;n++){
SendLeddata(n);
}
updateDataADC();
}
}
}
void updateDataADC(){
char msgSend[100];
String dat;
float adc = analogRead(adcCh1);
float adcT = (adc * 150)/4095;
dat = String(adcT,4);
dat.toCharArray(msgSend, (dat.length() + 1));
publishData("@MSG/espController/hyperQ/adc/data", msgSend);
}
void publishData(char *mqtt_ch,char *serialData){
client.publish(mqtt_ch , serialData);
Serial.print("Send Data : ");
Serial.println(serialData);
}
void SendDPdata(int i){
int dat = digitalRead(dipsw[i]);
char msgBuffer[100];
String message;
message = "dp"+String(i+1)+"-"+(!dat);
message.toCharArray(msgBuffer, 100);
publishData("@MSG/espController/hyperQ/dipsw/data", msgBuffer);
}
void SendLeddata(int i){
String dat;
if(digitalRead(led[i])==1){
dat = " is on";
}else{
dat = " is off";
}
char msgBuffer[100];
String message;
message = "led" + String(i+1) + dat;
message.toCharArray(msgBuffer, 100);
publishData("@MSG/espController/hyperQ/led/data", msgBuffer);
}
void loop() {
delay(10);
if (!client.connected()) {
mqttReconnect();
}
client.loop();
float adc = analogRead(adcCh1);
float adcT = (adc * 150)/4095;
if(digitalRead(sw[0]) == 0){
digitalWrite(led[0],!digitalRead(led[0]));
SendLeddata(0);
updateDataADC();
Serial.println("ADC = " + String(adcT));
while(digitalRead(sw[0]) == 0) delay(100);
}
if(digitalRead(sw[1]) == 0){
digitalWrite(led[1],!digitalRead(led[1]));
SendLeddata(1);
updateDataADC();
Serial.println("ADC = " + String(adcT));
while(digitalRead(sw[1]) == 0) delay(100);
}
if(digitalRead(sw[2]) == 0){
digitalWrite(led[2],!digitalRead(led[2]));
SendLeddata(2);
updateDataADC();
Serial.println("ADC = " + String(adcT));
while(digitalRead(sw[2]) == 0) delay(100);
}
String message = "";
for (int i = 0; i < 8; i++) {
bool curDP = digitalRead(dipsw[i]);
if (curDP != previousDipSwState[i]) {
message = "dp" + String(i+1) + "-" + String(!curDP);
previousDipSwState[i] = curDP;
}
}
if (message != "") {
char msgBuffer[100];
message.toCharArray(msgBuffer, 100);
publishData("@MSG/espController/hyperQ/dipsw/data", msgBuffer);
}
}