baitap — ESP32 simulation

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

Components

Sketch code

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

#define WIFI_SSID  "Espressif"              
#define WIFI_PASS  ""
#define TB_SERVER  "thingsboard.cloud"
#define TB_PORT    1883
#define TB_TOKEN   "6drdNfDYaLxz6pBV9OR0"       
#define MQTT_CLIENT_ID "ESP32_GW_DeviceB_01"
#define TB_TOPIC   "v1/devices/me/telemetry"

#define UART_BAUD  9600
#define TX2_PIN    17
#define RX2_PIN    16

#define WIFI_RETRY_INTERVAL   20000  
#define MQTT_RETRY_INTERVAL   5000   
#define ENABLE_TEST_PUBLISH   1      
#define TEST_PUBLISH_INTERVAL 10000

HardwareSerial SerialB(2);
WiFiClient espClient;
PubSubClient client(espClient);

enum RxState { FIND_HEADER_1, FIND_HEADER_2, READ_PAYLOAD };
RxState rxState = FIND_HEADER_1;
byte rxBuffer[7];
int rxIndex = 0;

float pendingTemp = 0, pendingHum = 0;
bool hasPending = false;

bool wifiStarted = false;
wl_status_t lastWifiStatus = WL_NO_SHIELD;
unsigned long tWifiTry = 0;
unsigned long tMqttTry = 0;
unsigned long tTest = 0;

bool publishTelemetry(float t, float h, const char* tag) {
  char payload[64];
  snprintf(payload, sizeof(payload), "{\"temperature\":%.1f,\"humidity\":%.1f}", t, h);
  bool ok = client.publish(TB_TOPIC, payload);
  Serial.printf("%s Publish %s -> %s, state=%d\n", tag, payload, ok ? "OK" : "FAIL", client.state());
  return ok;
}

void wifiTask() {
  unsigned long now = millis();
  wl_status_t st = WiFi.status();

  if (st != lastWifiStatus) {              
    lastWifiStatus = st;
    if (st == WL_CONNECTED) {
      Serial.print("Da ket noi WiFi! IP: ");
      Serial.println(WiFi.localIP());
    } else {
      Serial.printf("WiFi status = %d\n", (int)st);
    }
  }
  if (st == WL_CONNECTED) return;

  if (!wifiStarted || now - tWifiTry >= WIFI_RETRY_INTERVAL) {
    wifiStarted = true;
    tWifiTry = now;
    Serial.printf("Dang ket noi WiFi: %s\n", WIFI_SSID);
    WiFi.begin(WIFI_SSID, WIFI_PASS);
  }
}

void mqttTask() {
  if (WiFi.status() != WL_CONNECTED) return;
  if (client.connected()) return;

  unsigned long now = millis();
  if (tMqttTry != 0 && now - tMqttTry < MQTT_RETRY_INTERVAL) return;
  tMqttTry = now;

  Serial.print("Dang ket noi ThingsBoard MQTT...");
  if (client.connect(MQTT_CLIENT_ID, TB_TOKEN, "")) {
    Serial.println("[THANH CONG]");
    if (hasPending) {                       
      if (publishTelemetry(pendingTemp, pendingHum, "[PENDING]")) hasPending = false;
    }
  } else {
    Serial.printf("[THAT BAI, rc=%d, WiFi=%d]\n", client.state(), (int)WiFi.status());
  }
}

void handleFrame() {
  byte cs = 0;
  for (int i = 0; i < 6; i++) cs ^= rxBuffer[i];
  if (cs != rxBuffer[6]) {
    Serial.println("Canh bao: Sai checksum, bo qua khung.");
    return;
  }

  SerialB.write(0xFD);
  SerialB.write(0xDE);
  Serial.println("Nhan khung hop le tu A. Da gui ACK (0xFD, 0xDE).");

  int16_t  t10 = (int16_t)((rxBuffer[2] << 8) | rxBuffer[3]);
  uint16_t h10 = (uint16_t)((rxBuffer[4] << 8) | rxBuffer[5]);
  float t = t10 / 10.0;
  float h = h10 / 10.0;
  Serial.

More projects by nks260805