1 — Arduino Uno simulation

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

Components

Sketch code

/* =====================================================================
   Velxio 仿真 · Arduino Uno · 空气质量 / 温度风扇 / 键盘密码锁 + 舵机
   ---------------------------------------------------------------------
   引脚分配(按最终版接线表,D10 空着)
     矩阵键盘 R1..R4 : D2  D3  D4  D5
     矩阵键盘 C1..C4 : D6  D7  D8  D12
     舵机 PWM        : D9
     Grove 闪光 LED  : D11
     L293D  IN1      : D13      IN2 : A3      (EN1=5V, EN2/IN3/IN4=GND)
     蜂鸣器          : A2
     空气质量 AO     : A0
     OLED SSD1306    : A4=SDA  A5=SCL  (0x3C)
     温湿度 SHT31    : A4/A5 同一条 I2C 总线 (0x44)
   ---------------------------------------------------------------------
   逻辑
     1) 空气质量原始值显示在 OLED;超过 AQ_THRESHOLD -> D11 LED 亮
     2) 温度显示在 OLED;超过 TEMP_ON -> 电机(风扇)转,降回 TEMP_OFF 停
     3) 键盘按 "1" "2",再按右下角按键(D) 确认
        密码正确 -> 舵机转到 90°,保持 10 秒后回 0°
        消息显示在屏幕最下方一行
   ===================================================================== */

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Servo.h>

/* ---------------- 引脚 ---------------- */
const uint8_t ROW_PINS[4] = {2, 3, 4, 5};
const uint8_t COL_PINS[4] = {6, 7, 8, 12};
const uint8_t SERVO_PIN   = 9;
const uint8_t LED_PIN     = 11;
const uint8_t MOTOR_IN1   = 13;
const uint8_t MOTOR_IN2   = A3;
const uint8_t BUZZER_PIN  = A2;
const uint8_t AQ_PIN      = A0;

/* ---------------- 参数 ---------------- */
const int   AQ_THRESHOLD = 400;      // 空气质量模拟量阈值(0~1023),越大越差
const float TEMP_ON      = 30.0;     // 超过这个温度开风扇
const float TEMP_OFF     = 28.0;     // 低于这个温度关风扇(滞回)
const char  PASSWORD[]   = "12";     // 密码
const char  CONFIRM_KEY  = 'D';      // 右下角按键 = 确认
const unsigned long SERVO_HOLD_MS = 10000UL;  // 舵机保持 90° 的时间
const unsigned long INPUT_TIMEOUT = 8000UL;   // 输入超时自动清空

/* ---------------- 键盘布局 ---------------- */
const char KEYS[4][4] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

/* ---------------- OLED ---------------- */
#define SCREEN_W 128
#define SCREEN_H 64
Adafruit_SSD1306 display(SCREEN_W, SCREEN_H, &Wire, -1);

Servo servo;

/* ---------------- 状态 ---------------- */
float tempC = 25.0f;          // 当前温度(读不到传感器时的默认值)
float humi  = 45.0f;          // 当前湿度
int   aqRaw = 0;              // 空气质量原始值

char  inputBuf[9] = {0};      // 键盘输入缓冲
uint8_t inputLen  = 0;
unsigned long lastKeyMs = 0;

char  msg[24] = "请输入密码";  // 屏幕最下方那行消息

bool  servoActive  = false;
unsigned long servoEndMs = 0;

bool  motorOn = false;

/* ==================== SHT31 温湿度(裸 I2C,免库) ==================== */
uint8_t crc8(const uint8_t *data, int len) {
  uint8_t crc = 0xFF;
  for (int i = 0; i < len; i++) {
    crc ^= data[i];
    for (int b = 0; b < 8; b++)
      crc = (crc & 0x80) ? (uint8_t)((crc << 1) ^ 0x31) : (uint8_t)(crc << 1);
  }
  return crc;
}

bool readTempHum(float &t, float &h) {
  Wire.beginTransmission(0x44);        // SHT31 默认地址
  Wire.write(0x2C); Wire.write(0x06);  // 高重复性、非拉伸
  if (Wire.endTransmission() != 0) return false;
  delay(20);
  if (Wire.

More projects by 25040118