meghana — ESP32 simulation

project01

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by lalithameghana473.

Components

Sketch code

#include <WiFi.h>
#include <PubSubClient.h>

const char* ssid = "Velxio-GUEST";

const char* broker = "broker.hivemq.com";
const int mqttPort = 1883;

const char* dataTopic = "sindhu/esp32/project/data";
const char* ackTopic  = "sindhu/esp32/project/ack";

WiFiClient wifiClient;
PubSubClient mqtt(wifiClient);

int packetNumber = 1;
const int maxRetries = 3;

bool acknowledged = false;
String expectedACK = "";

uint16_t calculateCRC(String data) {

  uint16_t crc = 0xFFFF;

  for (int i = 0; i < data.length(); i++) {

    crc ^= (uint8_t)data[i];

    for (int j = 0; j < 8; j++) {

      if (crc & 1)
        crc = (crc >> 1) ^ 0xA001;
      else
        crc >>= 1;
    }
  }

  return crc;
}

void callback(char* topic, byte* payload,
              unsigned int length) {

  String response = "";

  for (int i = 0; i < length; i++) {
    response += (char)payload[i];
  }

  Serial.println("Response Received: " + response);

  if (response == expectedACK) {
    acknowledged = true;
  }
}

void reconnect() {

  while (!mqtt.connected()) {

    Serial.println("Connecting to MQTT...");

    if (mqtt.connect("SindhuTransmitterESP32")) {

      Serial.println("MQTT Connected!");

      mqtt.subscribe(ackTopic);

    } else {

      Serial.println("Connection Failed!");
      delay(2000);
    }
  }
}

void setup() {

  Serial.begin(115200);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid);

  Serial.print("Connecting to WiFi");

  while (WiFi.status() != WL_CONNECTED) {
    delay(300);
    Serial.print(".");
  }

  Serial.println("\nWiFi Connected!");
  Serial.println(WiFi.localIP());

  mqtt.setServer(broker, mqttPort);
  mqtt.setCallback(callback);

  reconnect();
}

void loop() {

  if (!mqtt.connected()) {
    reconnect();
  }

  mqtt.loop();

  String message = "Hello ESP32";

  uint16_t crc = calculateCRC(message);

  String packet = String(packetNumber) + "|" +
                  message + "|" + String(crc);

  expectedACK = "ACK|" + String(packetNumber);

  acknowledged = false;

  for (int attempt = 1; attempt <= maxRetries; attempt++) {

    Serial.println("\nSending Packet: " +
                   String(packetNumber));

    mqtt.publish(dataTopic, packet.c_str());

    Serial.println("Message: " + message);
    Serial.println("CRC: " + String(crc));
    Serial.println("Waiting for ACK...");

    unsigned long startTime = millis();

    while (millis() - startTime < 3000 &&
           !acknowledged) {

      mqtt.loop();
      delay(10);
    }

    if (acknowledged) {

      Serial.println("ACK Received!");
      Serial.println("Packet Delivered Successfully!");

      break;

    } else {

      Serial.println("ACK Not Received!");
      Serial.println("Retry Attempt: " + String(attempt));
    }
  }

  if (!acknowledged) {
    Serial.println("Transmission Failed!");
  }

  packetNumber++;

  delay(3000);
}

More projects by lalithameghana473