ESP32-Yến — ESP32 simulation

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

Components

Sketch code

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

// WiFi
const char* WIFI_SSID = "Espressif";
const char* WIFI_PASS = "";

// ThingsBoard
const char* TB_SERVER = "thingsboard.cloud";
const int TB_PORT = 1883;
const char* TB_TOKEN = "6FaBNnzmQYsavlGUYAyG";
const char* TB_TOPIC = "v1/devices/me/telemetry";

// UART2
#define UART_RX 16
#define UART_TX 17
#define UART_BAUD 9600

HardwareSerial DeviceUART(2);
WiFiClient wifiClient;
PubSubClient mqtt(wifiClient);

// Khung UART: FD AD + 4 byte du lieu
byte frame[6];
int frameIndex = 0;
bool receiving = false;

// Du lieu cho ThingsBoard
float temperature = 0;
float humidity = 0;
bool dataWaiting = false;

unsigned long lastWiFiTry = 0;
unsigned long lastMQTTTry = 0;

const unsigned long WIFI_INTERVAL = 10000;
const unsigned long MQTT_INTERVAL = 5000;

// Ket noi WiFi
void checkWiFi() {
  if (WiFi.status() == WL_CONNECTED) return;

  if (lastWiFiTry != 0 &&
      millis() - lastWiFiTry < WIFI_INTERVAL) return;

  lastWiFiTry = millis();

  Serial.println("Dang ket noi WiFi...");
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
}

// Ket noi ThingsBoard
void checkMQTT() {
  if (WiFi.status() != WL_CONNECTED || mqtt.connected()) return;

  if (lastMQTTTry != 0 &&
      millis() - lastMQTTTry < MQTT_INTERVAL) return;

  lastMQTTTry = millis();

  Serial.print("Dang ket noi ThingsBoard... ");

  if (mqtt.connect("ESP32_Gateway_B", TB_TOKEN, "")) {
    Serial.println("THANH CONG");
  } else {
    Serial.print("THAT BAI, ma loi: ");
    Serial.println(mqtt.state());
  }
}

// Gui ACK ve A
void sendACK() {
  const byte ack[] = {0xFD, 0xDE};

  DeviceUART.write(ack, sizeof(ack));
  DeviceUART.flush();

  Serial.println("Da gui ACK FD DE ve ESP32 A.");
}

// Gui telemetry
bool sendTelemetry() {
  if (!mqtt.connected()) return false;

  char json[100];

  snprintf(
    json, sizeof(json),
    "{\"temperature\":%.1f,\"humidity\":%.1f}",
    temperature, humidity
  );

  bool result = mqtt.publish(TB_TOPIC, json);

  Serial.print("Telemetry: ");
  Serial.println(json);

  if (result) {
    Serial.println("Gui ThingsBoard thanh cong.");
  } else {
    Serial.println("Gui ThingsBoard that bai.");
  }

  return result;
}

// Xu ly khung 6 byte
void processFrame() {
  int16_t tempRaw =
    (int16_t)(((uint16_t)frame[2] << 8) | frame[3]);

  uint16_t humRaw =
    (uint16_t)(((uint16_t)frame[4] << 8) | frame[5]);

  temperature = tempRaw / 10.0f;
  humidity = humRaw / 10.0f;

  Serial.println();
  Serial.println("===== DU LIEU TU ESP32 A =====");

  Serial.print("Nhiet do: ");
  Serial.print(temperature, 1);
  Serial.println(" C");

  Serial.print("Do am: ");
  Serial.print(humidity, 1);
  Serial.println(" %");

  // Bao nhan sau khi da nhan du khung
  sendACK();

  dataWaiting = true;
}

// Doc UART
void receiveUART() {
  while (DeviceUART.available() > 0) {
    byte value = DeviceUART.read();

    if (!receiving) {
      if (value == 0xFD) {
        frame[0] = valu

More projects by yennguyen040405