meghana (copy) — 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 <WiFiUdp.h>

// Wi-Fi settings (Must match the receiver)
const char* ssid = "Espressif";
const char* password = "";

// Transmitter & Destination configuration
const int PORT = 4210;                 // Local port to listen for ACKs
const char* receiverIP = "10.13.37.42"; // Replace with your Receiver's actual IP address
const int receiverPort = 4210;         // Target port matching receiver's listening port

WiFiUDP udp;
unsigned int sequenceNumber = 0;

// Non-blocking transmission interval (e.g., send every 2 seconds)
unsigned long lastSendTime = 0;
const unsigned long sendInterval = 2000; 

// Calculate CRC-16 (Identical to receiver's algorithm)
uint16_t calculateCRC(String data) {
  uint16_t crc = 0xFFFF;

  for (unsigned 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 setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("Connecting to Wi-Fi...");

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

  Serial.println("\nWi-Fi connected!");
  Serial.print("Transmitter IP: ");
  Serial.println(WiFi.localIP());

  // Open UDP port to listen for incoming ACKs
  udp.begin(PORT);
}

void loop() {
  unsigned long currentMillis = millis();

  // Send a packet non-blockingly based on the interval
  if (currentMillis - lastSendTime >= sendInterval) {
    lastSendTime = currentMillis;

    // Define raw message text
    String messageBody = "HelloESP32";
    
    // Construct data segment: [SequenceNumber]|[MessageBody]
    String dataSegment = String(sequenceNumber) + "|" + messageBody;
    
    // Compute CRC on the data segment
    uint16_t crc = calculateCRC(dataSegment);
    
    // Construct final packet string: [DataSegment]|[CRC]
    String finalPacket = dataSegment + "|" + String(crc);

    // Transmit via UDP
    udp.beginPacket(receiverIP, receiverPort);
    udp.print(finalPacket);
    udp.endPacket();

    Serial.print("Sent packet: ");
    Serial.println(finalPacket);

    sequenceNumber++; // Increment for the next message
  }

  // Check for incoming ACK packets from the receiver
  int packetSize = udp.parsePacket();
  if (packetSize > 0) {
    char buffer[256];
    int len = udp.read(buffer, sizeof(buffer) - 1);
    if (len < 0) len = 0;
    buffer[len] = '\0';

    String reply = String(buffer);
    Serial.print("Received Response: ");
    Serial.println(reply);
  }
}

More projects by lalithameghana473