final — Arduino Uno simulation

An interactive Arduino Uno circuit simulation you can run free in your browser on Velxio, by ccc111.

Components

Sketch code

#include <DHT.h>
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const uint8_t PinDht     = 2;
const uint8_t PinPir     = 3;
const uint8_t PinHall    = 4;
const uint8_t PinLedRed  = 5;
const uint8_t PinBlue    = 6;
const uint8_t PinYellow  = 7;
const uint8_t PinGreen   = 8;
const uint8_t PinBuzzer  = 9;
const uint8_t PinBtnMode = 10;
const uint8_t PinBtnCtrl = 11;
const uint8_t PinWhite   = 12;
const uint8_t PinServo   = 13;
const int     PinLdr     = A0;
const int     PinFlame   = A1;

const float TempHeatOn   = 20.0;
const float TempHeatKeep = 23.0;
const float TempAcOn     = 28.0;
const float TempAcKeep   = 25.0;
const float HumOn        = 70.0;
const float HumKeep      = 60.0;
const float LuxOn        = 300.0;
const float LuxKeep      = 350.0;

/* 火焰方向开关 */
const bool FlameFireIsLowAdc = false;

const int FlameAdcFire      = 800;
const int FlameAdcClear     = 850;
const int FlameAdcMinValid  = 0;
const int FlameAdcMaxValid  = 1023;
const uint8_t FlameConfirmCount = 3;

const unsigned long FireClearDelayMs = 2000;
const unsigned long DoorAutoCloseMs  = 2000;

const uint16_t DebounceMs    = 20;
const uint16_t LongPressMs   = 800;
const uint16_t ServoTravelMs = 600;
const uint8_t  DoorCloseDeg  = 0;
const uint8_t  DoorOpenDeg   = 90;

const uint8_t ModeAuto   = 0;
const uint8_t ModeManual = 1;

enum { DevDoor = 0, DevAc, DevHeat, DevFan, DevLamp, DevCount };
const char* const DevName[DevCount] = { "DOOR", "AC", "HEAT", "FAN", "LAMP" };

DHT Dht(PinDht, DHT22);
Servo DoorServo;
LiquidCrystal_I2C lcd(0x27, 16, 2);

float Temperature = NAN;
float Humidity    = NAN;
float Lux         = NAN;
int   LuxAdc      = 0;

int   FlameRaw   = 0;
int   FlameAdc   = 0;
bool  FlameAlarm = false;
bool  FlameValid = false;
uint8_t FlameLowCount = 0;

bool Occupied   = false;
bool DoorClosed = true;

bool WhiteOn = false, HeatOn = false, AcOn = false, VentOn = false;

uint8_t Mode = ModeAuto;
uint8_t Sel  = DevDoor;
bool ManualOn[DevCount] = { false, false, false, false, false };

bool    DoorOpenCmd = false;
uint8_t DoorCmdDeg  = DoorCloseDeg;
bool    ServoBusy   = false;
unsigned long ServoT0 = 0;

bool    FireDoorDone  = false;
bool    FireClearWait = false;
unsigned long FireClearMs = 0;

/* ← 新增:记下火警发生前的门指令,解除后按它恢复 */
bool DoorCmdBeforeFire = false;

bool    DoorAutoCloseWait = false;
unsigned long DoorAutoCloseT0 = 0;

struct ButtonState {
  uint8_t  Pin;
  bool     RawPressed;
  bool     StablePressed;
  bool     LongFired;
  unsigned long RawChangeMs;
  unsigned long PressStartMs;
};

ButtonState BtnMode = { PinBtnMode, false, false, false, 0, 0 };
ButtonState BtnCtrl = { PinBtnCtrl, false, false, false, 0, 0 };

enum { BtnNone = 0, BtnShort, BtnLong };

unsigned long LastDhtMs = 0, LastLuxMs = 0, LastPrintMs = 0;
const uint16_t DhtMs = 2000, LuxMs = 200, PrintMs = 500;

/* ================= 初始化 ================= */
void setup() {
  Serial.begin(9600);

  pinMode(PinPir, INPUT);
  pinMode(PinHall, INPUT);
  pinMode(PinBtnMode, INPUT_PUL

More projects by ccc111