洗衣机 — ESP32 simulation

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

Components

Sketch code

/*
 * ESP32 船型开关 + 三路继电器 + 双感应器 + OLED + 巴法云MQTT控制
 *
 * 引脚:
 *   D18  船型开关(上拉输入,低有效)
 *   D23  1号继电器
 *   D32  2号继电器
 *   D33  3号继电器
 *   D26  1号感应器(上拉输入,低触发)
 *   D27  2号感应器(上拉输入,高触发)
 *   D22  OLED SCL
 *   D21  OLED SDA
 *
 * 巴法云 MQTT:
 *   服务器 bemfa.com,端口 9501
 *   ClientID = 用户私钥
 *   订阅主题,收到 "on" 启动一轮,收到 "off" 立即停止
 *
 * 顺序:
 *   R1 ON → (感应器1或超时) → R2 ON 10s → R3 ON
 *   → (感应器2或超时) → R3 OFF → R2 再 ON 10s → 完成
 */

#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// ================== WiFi 配置 ==================
const char* WIFI_SSID     = "MERCURY_7428";
const char* WIFI_PASSWORD = "woainizwx131";

// ================== 巴法云 MQTT 配置 ==================
const char* MQTT_SERVER  = "bemfa.com";
const uint16_t MQTT_PORT = 9501;
const char* MQTT_UID     = "9d0f5b1d502a4dbd822306385975e8b7";  // 用户私钥,作为 ClientID
const char* MQTT_TOPIC   = "BfDFf29D8001";                       // 订阅的主题

// ================== 引脚定义 ==================
#define SW_PIN       18
#define RELAY1_PIN   23
#define RELAY2_PIN   32
#define RELAY3_PIN   33
#define SENSOR1_PIN  26
#define SENSOR2_PIN  27
#define OLED_SCL     22
#define OLED_SDA     21

// ================== OLED 配置 ==================
#define SCREEN_WIDTH  128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
#define OLED_ADDR     0x3C

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// ================== 继电器触发电平 ==================
#define RELAY_OFF    LOW
#define RELAY_ON     HIGH

// ================== 时间参数 ==================
const uint32_t TIME_RELAY1   = 5000;    // R1 兜底超时
const uint32_t TIME_RELAY2   = 10000;   // R2 第一次运行 10 秒
const uint32_t TIME_RELAY3   = 30000;   // R3 兜底超时
const uint32_t TIME_RELAY2B  = 10000;   // R2 第二次运行 10 秒

// ================== 状态机 ==================
enum State {
  STATE_IDLE,
  STATE_R1_ON,
  STATE_R2_ON,
  STATE_R3_ON,
  STATE_R2_AGAIN      // 新增:R3 完成后 R2 再运行
};

State state = STATE_IDLE;
uint32_t stateStartTime = 0;
bool sequenceDone = false;

// ================== 网络控制标志 ==================
bool netStartRequest = false;
bool netStopRequest  = false;

// ================== MQTT 客户端 ==================
WiFiClient espClient;
PubSubClient mqttClient(espClient);
uint32_t lastMqttReconnect = 0;
const uint32_t MQTT_RECONNECT_INTERVAL = 5000;

// ================== OLED 刷新 ==================
uint32_t lastDisplayUpdate = 0;
const uint32_t DISPLAY_INTERVAL = 100;

// ---------------- 继电器控制 ----------------
void allRelaysOff() {
  digitalWrite(RELAY1_PIN, RELAY_OFF);
  digitalWrite(RELAY2_PIN, RELAY_OFF);
  digitalWrite(RELAY3_PIN, RELAY_OFF);
}

bool switchClosed()  { return digitalRead(SW_PIN) == LOW; }
bool sensor1Active() { return digitalRead(SENSOR1_PIN) == LOW;  }
bool sensor2Active() { return digitalRead(SENSOR2_PIN) == HIGH; }

int remainSeconds(uint32_t duration) {
  uint32_t elapsed = millis() - stateStartTime;
  if (elapsed >= duration) return 0;
  return (duration - elapsed + 99

More projects by haot