kotel — ESP32-S3 simulation

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

Components

Sketch code

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <AccelStepper.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// --- ПИНЫ ПОДКЛЮЧЕНИЯ ---
// Драйвер шагового двигателя
#define MOTOR_STEP_PIN 4
#define MOTOR_DIR_PIN  5
#define MOTOR_EN_PIN   6

// Энкодер
#define ENC_CLK_PIN    10
#define ENC_DT_PIN     11
#define ENC_SW_PIN     12

// OLED Дисплей (I2C)
#define OLED_SDA       8
#define OLED_SCL       9

// Концевой выключатель (замыкание на GND)
#define LIMIT_PIN      13

// Свободные пины для датчиков и реле
#define ONE_WIRE_BUS   14  // Шина для двух DS18B20
#define PUMP_RELAY_PIN 15  // Реле циркуляционного насоса

// --- НАСТРОЙКИ МЕХАНИКИ И КОТЛА ---
#define TOTAL_POSITIONS 7      // Всего 7 положений (индексы от 0 до 6)
#define STEPS_PER_POS   200    // Количество шагов двигателя между соседними положениями (подберите под ваш редуктор!)
#define MAX_SPEED       800.0  // Максимальная скорость ШД (шагов/сек)
#define ACCELERATION    400.0  // Ускорение ШД

// Логика реле (HIGH или LOW в зависимости от вашего модуля реле)
#define RELAY_ON        HIGH
#define RELAY_OFF       LOW

// --- ИНИЦИАЛИЗАЦИЯ ОБЪЕКТОВ ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

AccelStepper stepper(AccelStepper::DRIVER, MOTOR_STEP_PIN, MOTOR_DIR_PIN);

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// --- ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ ---
int currentPosition = 0;       // Текущее заданное положение ручки (0..6)
float tempSupply = 0.0;        // Температура подачи
float tempReturn = 0.0;        // Температура обратки

// Настройки меню и насоса
int pumpTargetTemp = 45;       // Температура включения насоса (°C)
int pumpHysteresis = 3;        // Гистерезис выключения (°C)
bool pumpState = false;        // Текущее состояние насоса
bool inMenu = false;           // Флаг нахождения в меню настроек

// Переменные энкодера и таймеров
volatile int encoderDelta = 0;
int lastClkState;
unsigned long lastBtnPress = 0;
unsigned long lastTempRequest = 0;
unsigned long lastDisplayUpdate = 0;

// Прерывание для плавного чтения энкодера
void IRAM_ATTR readEncoderISR() {
  int clkState = digitalRead(ENC_CLK_PIN);
  if (clkState != lastClkState && clkState == LOW) {
    if (digitalRead(ENC_DT_PIN) != clkState) {
      encoderDelta++;
    } else {
      encoderDelta--;
    }
  }
  lastClkState = clkState;
}

void setup() {
  Serial.begin(115200);

  // Настройка пинов
  pinMode(LIMIT_PIN, INPUT_PULLUP);
  pinMode(ENC_CLK_PIN, INPUT_PULLUP);
  pinMode(ENC_DT_PIN, INPUT_PULLUP);
  pinMode(ENC_SW_PIN, INPUT_PULLUP);
  pinMode(PUMP_RELAY_PIN, OUTPUT);
  digitalWrite(PUMP_RELAY_PIN, RELAY_OFF);

  // Инициализация I2C и дисплея
  Wire.begin(OLED_SDA, OLED_SCL);
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("Ошибка инициализации OLED");
    for (;;);
  }
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(

More projects by zdelnik84