ماژول پتانسیومتر  آنالوگ

(Potentiometer Module)

رابط آنالوگ هوشمند برای تنظیم پارامترها در سیستم‌های دیجیتال

ماژول پتانسیومتر یک رابط کاربری ساده و مؤثر برای تنظیم مقادیر آنالوگ در سیستم‌های دیجیتال ارائه می‌دهد. این ماژول با ترکیب یک پتانسیومتر مکانیکی دقیق و مدارهای تبدیل سیگنال، امکان کنترل پارامترهای مختلف مانند سرعت، روشنایی، ولتاژ و فرکانس را در پروژه‌های الکترونیکی فراهم می‌کند. محصولی ایده‌آل برای سیستم‌های کنترل، تنظیم‌کننده‌ها و دستگاه‌های اندازه‌گیری.


ویژگی‌های کلیدی

  • پتانسیومتر با کیفیت: پتانسیومتر کربنی با عمر طولانی و نویز پایین

  • خروجی دوگانه: هم خروجی آنالوگ (0-VCC) و هم خروجی دیجیتال (PWM)

  • مقاومت قابل تنظیم: معمولاً 10KΩ خطی (B10K)

  • نصب صنعتی: طراحی شده برای نصب روی پنل با مهره قفلی

  • دسته‌گرد با نشانگر: دسته‌گرد راحت با نشانگر موقعیت

  • مقیاس‌گذاری: صفحه درجه‌بندی‌شده اختیاری برای نمایش دقیق موقعیت

  • سازگاری کامل: کار با ولتاژ 3.3V و 5V سیستم‌های دیجیتال


مشخصات فنی

  • مقاومت اسمی: 10KΩ (موجود در 1KΩ، 5KΩ، 50KΩ، 100KΩ)

  • ولتاژ کاری: 3.3V – 5V DC

  • طول عمر: 10,000 چرخه حداقل

  • تلرانس: ±20% (استاندارد)، ±10% (درجه یک)

  • توان مجاز: 0.1W (در 70°C)

  • دمای کاری: -30°C تا +70°C

  • نوع: خطی (Linear) – تغییر مقاومت متناسب با چرخش

  • زاویه چرخش: 300 درجه مؤثر

  • اندازه دسته‌گرد: 15mm قطر

  • نوع نصب: پنل‌مونت با مهره M8

  • ابعاد پنل: سوراخ 8mm برای نصب


کاربردهای اصلی

  • تنظیم روشنایی LED و سیستم‌های نورپردازی

  • کنترل سرعت موتورهای DC و سروو موتورها

  • تنظیم فرکانس در مولدهای سیگنال

  • کنترل ولتاژ در منابع تغذیه تنظیم‌پذیر

  • تنظیم Gain در تقویت‌کننده‌های صوتی

  • رابط کاربری برای منوهای دستگاه‌های الکترونیکی

  • تنظیم پارامترهای PID در سیستم‌های کنترل

  • کالیبراسیون سنسورها و ابزار دقیق


انواع پتانسیومتر بر اساس مشخصه مقاومت

نوع مشخصه کاربرد اصلی
خطی (Linear) مقاومت متناسب با زاویه کنترل ولتاژ، تنظیم سرعت
لگاریتمی (Audio/Log) تغییر لگاریتمی کنترل صدا، تنظیم Gain صوتی
ضد لگاریتمی (Reverse Log) تغییر معکوس لگاریتمی کنترل‌های خاص صنعتی
چند حالته (Multi-turn) چند دور کامل تنظیم‌های دقیق و حساس

اتصال به آردوینو

پیکربندی ساده 3 سیمه:

پتانسیومتر → آردوینو
-------------------
پایه 1 (چپ) → GND
پایه 2 (وسط) → A0 (ورودی آنالوگ)
پایه 3 (راست) → 5V

پیکربندی با ماژول:

ماژول پتانسیومتر → آردوینو
-------------------------
VCC → 5V یا 3.3V
GND → GND
SIG → A0 (آنالوگ)
PWM → D3 (دیجیتال PWM - اختیاری)

کد پایه آردوینو (خواندن مقدار آنالوگ)

/*
 * خواندن مقدار پتانسیومتر و نمایش در سریال مانیتور
 * اتصال: پایه وسط پتانسیومتر به A0
 */

const int potPin = A0;          // پایه اتصال پتانسیومتر
int potValue = 0;               // مقدار خام خوانده شده (0-1023)
float voltage = 0.0;           // ولتاژ محاسبه‌شده
int percentage = 0;            // درصد چرخش

// برای نمایش گرافیکی
const int graphWidth = 40;     // عرض نمودار در سریال مانیتور

void setup() {
  Serial.begin(9600);
  Serial.println("==================================");
  Serial.println("   Potentiometer Basic Read");
  Serial.println("==================================");
  Serial.println("Position | Value | Voltage | %");
  Serial.println("---------|-------|---------|---");
}

void loop() {
  // خواندن مقدار آنالوگ
  potValue = analogRead(potPin);
  
  // محاسبه ولتاژ (با فرض VCC = 5V)
  voltage = potValue * (5.0 / 1023.0);
  
  // محاسبه درصد
  percentage = map(potValue, 0, 1023, 0, 100);
  
  // نمایش مقادیر
  Serial.print("   ");
  Serial.print(percentage);
  Serial.print("%   | ");
  Serial.print(potValue);
  Serial.print("   | ");
  Serial.print(voltage, 2);
  Serial.print("V  | ");
  
  // نمایش گرافیکی
  int barLength = map(potValue, 0, 1023, 0, graphWidth);
  for (int i = 0; i < graphWidth; i++) {
    if (i < barLength) {
      Serial.print("█");
    } else {
      Serial.print(" ");
    }
  }
  Serial.println("|");
  
  delay(100); // تأخیر 100ms بین خواندن‌ها
}

کد کنترل سروو موتور با پتانسیومتر

/*
 * کنترل موقعیت سروو موتور با پتانسیومتر
 * اتصال: پتانسیومتر به A0، سروو به D9
 */

#include <Servo.h>

const int potPin = A0;          // پایه پتانسیومتر
const int servoPin = 9;         // پایه سروو موتور

Servo myServo;                  // ایجاد شیء سروو
int potValue;                   // مقدار پتانسیومتر
int servoAngle;                 // زاویه سروو (0-180 درجه)
int lastServoAngle = -1;        // زاویه قبلی برای جلوگیری از ارسال تکراری

void setup() {
  Serial.begin(9600);
  myServo.attach(servoPin);     // اتصال سروو به پایه
  
  Serial.println("==================================");
  Serial.println("   Servo Motor Control with Pot");
  Serial.println("==================================");
  Serial.println("Pot Value | Servo Angle");
  Serial.println("----------|------------");
}

void loop() {
  // خواندن پتانسیومتر
  potValue = analogRead(potPin);
  
  // تبدیل به زاویه سروو (0-180 درجه)
  servoAngle = map(potValue, 0, 1023, 0, 180);
  
  // فقط اگر زاویه تغییر کرده باشد، سروو را حرکت ده
  if (abs(servoAngle - lastServoAngle) > 1) { // آستانه 1 درجه
    myServo.write(servoAngle);
    lastServoAngle = servoAngle;
    
    // نمایش اطلاعات
    Serial.print("   ");
    Serial.print(potValue);
    Serial.print("     |    ");
    Serial.print(servoAngle);
    Serial.println("°");
  }
  
  delay(15); // تأخیر مناسب برای سروو
}

کد کنترل LED RGB با 3 پتانسیومتر

/*
 * کنترل رنگ LED RGB با سه پتانسیومتر
 * هر پتانسیومتر کنترل یک رنگ: قرمز، سبز، آبی
 */

const int potRed = A0;      // پتانسیومتر رنگ قرمز
const int potGreen = A1;    // پتانسیومتر رنگ سبز
const int potBlue = A2;     // پتانسیومتر رنگ آبی

const int ledRed = 9;       // پایه PWM برای LED قرمز
const int ledGreen = 10;    // پایه PWM برای LED سبز
const int ledBlue = 11;     // پایه PWM برای LED آبی

int redValue, greenValue, blueValue;      // مقادیر PWM (0-255)
int redPot, greenPot, bluePot;            // مقادیر پتانسیومترها (0-1023)

void setup() {
  Serial.begin(9600);
  
  // تنظیم پایه‌های LED به عنوان خروجی PWM
  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(ledBlue, OUTPUT);
  
  Serial.println("=========================================");
  Serial.println("   RGB Color Mixer with 3 Potentiometers");
  Serial.println("=========================================");
  Serial.println("R   G   B   | Color Preview");
  Serial.println("--- --- --- | -----------------");
}

void loop() {
  // خواندن مقادیر پتانسیومترها
  redPot = analogRead(potRed);
  greenPot = analogRead(potGreen);
  bluePot = analogRead(potBlue);
  
  // تبدیل به مقادیر PWM
  redValue = map(redPot, 0, 1023, 0, 255);
  greenValue = map(greenPot, 0, 1023, 0, 255);
  blueValue = map(bluePot, 0, 1023, 0, 255);
  
  // اعمال رنگ به LED RGB
  analogWrite(ledRed, redValue);
  analogWrite(ledGreen, greenValue);
  analogWrite(ledBlue, blueValue);
  
  // نمایش مقادیر و پیش‌نمایش رنگ
  displayColorInfo();
  
  delay(100);
}

void displayColorInfo() {
  // نمایش مقادیر RGB
  Serial.print(redValue);
  if (redValue < 100) Serial.print(" ");
  if (redValue < 10) Serial.print(" ");
  
  Serial.print(" ");
  Serial.print(greenValue);
  if (greenValue < 100) Serial.print(" ");
  if (greenValue < 10) Serial.print(" ");
  
  Serial.print(" ");
  Serial.print(blueValue);
  if (blueValue < 100) Serial.print(" ");
  if (blueValue < 10) Serial.print(" ");
  
  Serial.print(" | ");
  
  // پیش‌نمایش متنی رنگ
  if (redValue > 200 && greenValue < 50 && blueValue < 50) {
    Serial.print("RED        ");
  } else if (redValue < 50 && greenValue > 200 && blueValue < 50) {
    Serial.print("GREEN      ");
  } else if (redValue < 50 && greenValue < 50 && blueValue > 200) {
    Serial.print("BLUE       ");
  } else if (redValue > 200 && greenValue > 200 && blueValue < 50) {
    Serial.print("YELLOW     ");
  } else if (redValue > 200 && greenValue < 50 && blueValue > 200) {
    Serial.print("MAGENTA    ");
  } else if (redValue < 50 && greenValue > 200 && blueValue > 200) {
    Serial.print("CYAN       ");
  } else if (redValue > 200 && greenValue > 200 && blueValue > 200) {
    Serial.print("WHITE      ");
  } else if (redValue < 50 && greenValue < 50 && blueValue < 50) {
    Serial.print("BLACK      ");
  } else {
    Serial.print("CUSTOM     ");
  }
  
  // نمایش کد هگز رنگ
  Serial.print(" #");
  printHex(redValue);
  printHex(greenValue);
  printHex(blueValue);
  
  Serial.println();
}

void printHex(int value) {
  if (value < 16) Serial.print("0");
  Serial.print(value, HEX);
}

کد پیشرفته: سیستم تنظیم پارامترهای PID

/*
 * سیستم تنظیم پارامترهای PID با 3 پتانسیومتر
 * هر پتانسیومتر کنترل یکی از پارامترهای Kp, Ki, Kd
 */

#include <PID_v1.h>

// پایه‌های پتانسیومترها
const int potKp = A0;    // پتانسیومتر تنظیم Kp
const int potKi = A1;    // پتانسیومتر تنظیم Ki
const int potKd = A2;    // پتانسیومتر تنظیم Kd
const int potSetpoint = A3; // پتانسیومتر تنظیم Setpoint

// پایه‌های نمایشگر LCD (اختیاری)
const int displayUpdateButton = 2; // دکمه به‌روزرسانی نمایش

// متغیرهای PID
double Setpoint, Input, Output;
double Kp, Ki, Kd;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

// محدوده تنظیم پارامترها
const double Kp_min = 0.0, Kp_max = 10.0;
const double Ki_min = 0.0, Ki_max = 5.0;
const double Kd_min = 0.0, Kd_max = 2.0;
const double Setpoint_min = 0.0, Setpoint_max = 100.0;

// متغیرهای نمایش
unsigned long lastDisplayUpdate = 0;
const unsigned long displayInterval = 500; // هر 500ms به‌روزرسانی شود

void setup() {
  Serial.begin(115200);
  pinMode(displayUpdateButton, INPUT_PULLUP);
  
  // مقداردهی اولیه PID
  Setpoint = 50.0;
  Input = 0.0;
  Kp = 2.0;
  Ki = 0.5;
  Kd = 0.1;
  
  myPID.SetMode(AUTOMATIC);
  myPID.SetOutputLimits(0, 255);
  
  Serial.println("========================================");
  Serial.println("   PID Parameter Tuning with Pots");
  Serial.println("========================================");
  Serial.println("Kp\tKi\tKd\tSetpoint");
  Serial.println("---\t---\t---\t--------");
}

void loop() {
  // خواندن مقادیر پتانسیومترها
  readPotentiometers();
  
  // به‌روزرسانی پارامترهای PID
  updatePIDParameters();
  
  // شبیه‌سازی فرآیند (در پروژه واقعی اینجا سنسور خوانده می‌شود)
  simulateProcess();
  
  // محاسبه PID
  myPID.Compute();
  
  // اعمال خروجی به فرآیند (در پروژه واقعی به actuator می‌رود)
  applyOutput();
  
  // نمایش دوره‌ای پارامترها
  updateDisplay();
  
  delay(20);
}

void readPotentiometers() {
  static int lastPotKp = -1, lastPotKi = -1, lastPotKd = -1, lastPotSp = -1;
  static unsigned long lastReadTime = 0;
  
  // کاهش نرخ خواندن برای کاهش نویز
  if (millis() - lastReadTime > 50) {
    int potKpValue = analogRead(potKp);
    int potKiValue = analogRead(potKi);
    int potKdValue = analogRead(potKd);
    int potSpValue = analogRead(potSetpoint);
    
    // میانگین‌گیری برای کاهش نویز
    potKpValue = (potKpValue + lastPotKp) / 2;
    potKiValue = (potKiValue + lastPotKi) / 2;
    potKdValue = (potKdValue + lastPotKd) / 2;
    potSpValue = (potSpValue + lastPotSp) / 2;
    
    // ذخیره برای دفعه بعد
    lastPotKp = potKpValue;
    lastPotKi = potKiValue;
    lastPotKd = potKdValue;
    lastPotSp = potSpValue;
    
    // تبدیل به مقادیر واقعی
    Kp = mapFloat(potKpValue, 0, 1023, Kp_min, Kp_max);
    Ki = mapFloat(potKiValue, 0, 1023, Ki_min, Ki_max);
    Kd = mapFloat(potKdValue, 0, 1023, Kd_min, Kd_max);
    Setpoint = mapFloat(potSpValue, 0, 1023, Setpoint_min, Setpoint_max);
    
    lastReadTime = millis();
  }
}

float mapFloat(long x, long in_min, long in_max, float out_min, float out_max) {
  return (x - in_min) * (out_max - out_min) / (float)(in_max - in_min) + out_min;
}

void updatePIDParameters() {
  myPID.SetTunings(Kp, Ki, Kd);
}

void simulateProcess() {
  // شبیه‌سازی یک فرآیند درجه اول
  // در پروژه واقعی باید از سنسور خوانده شود
  static float processValue = 0;
  const float timeConstant = 2.0; // ثابت زمانی فرآیند
  const float sampleTime = 0.02; // زمان نمونه‌برداری 20ms
  
  processValue += (Output - processValue) * sampleTime / timeConstant;
  Input = processValue;
}

void applyOutput() {
  // در پروژه واقعی: فعال‌سازی actuator
  // مثلاً: analogWrite(heaterPin, Output);
  
  // برای نمایش:
  static int lastOutput = -1;
  if (abs(Output - lastOutput) > 1) {
    lastOutput = Output;
    // می‌توانید اینجا خروجی را به پین PWM اعمال کنید
  }
}

void updateDisplay() {
  // به‌روزرسانی نمایش در سریال مانیتور
  if (millis() - lastDisplayUpdate > displayInterval) {
    Serial.print(Kp, 2);
    Serial.print("\t");
    Serial.print(Ki, 2);
    Serial.print("\t");
    Serial.print(Kd, 2);
    Serial.print("\t");
    Serial.print(Setpoint, 1);
    Serial.print("\t| Output: ");
    Serial.print(Output, 0);
    Serial.print(" | PV: ");
    Serial.print(Input, 1);
    Serial.println();
    
    lastDisplayUpdate = millis();
  }
  
  // اگر دکمه فشرده شد، نمایش کامل
  if (digitalRead(displayUpdateButton) == LOW) {
    displayFullInfo();
    delay(300); // Debouncing
  }
}

void displayFullInfo() {
  Serial.println();
  Serial.println("=== CURRENT PID PARAMETERS ===");
  Serial.print("Kp (Proportional): ");
  Serial.println(Kp, 3);
  Serial.print("Ki (Integral):     ");
  Serial.println(Ki, 3);
  Serial.print("Kd (Derivative):   ");
  Serial.println(Kd, 3);
  Serial.print("Setpoint:          ");
  Serial.println(Setpoint, 1);
  Serial.print("Process Value:     ");
  Serial.println(Input, 1);
  Serial.print("Control Output:    ");
  Serial.println(Output, 0);
  Serial.println("===============================");
  Serial.println();
}

کد عملی: ولتمتر دیجیتال با کالیبراسیون پتانسیومتر

/*
 * ولتمتر دیجیتال با قابلیت کالیبراسیون با پتانسیومتر
 * پتانسیومتر برای تنظیم offset و gain استفاده می‌شود
 */

const int voltagePin = A0;        // ورودی ولتاژ مورد اندازه‌گیری
const int calibOffsetPin = A1;    // پتانسیومتر کالیبراسیون offset
const int calibGainPin = A2;      // پتانسیومتر کالیبراسیون gain
const int modeButton = 2;         // دکمه تغییر حالت

// متغیرهای کالیبراسیون
float calibOffset = 0.0;          // تصحیح offset
float calibGain = 1.0;            // تصحیح gain

// حالت‌های عملکرد
enum Mode { MEASURE, CALIB_OFFSET, CALIB_GAIN };
Mode currentMode = MEASURE;

// ولتاژ مرجع داخلی آردوینو (می‌تواند 1.1V یا 5V باشد)
const float vRef = 5.0;
const int adcResolution = 1023;

// برای نمایش 7-Segment (اختیاری)
const int digitPins[] = {3, 4, 5, 6};      // پایه‌های انتخاب رقم
const int segmentPins[] = {7, 8, 9, 10, 11, 12, 13}; // پایه‌های segments

void setup() {
  Serial.begin(9600);
  pinMode(modeButton, INPUT_PULLUP);
  
  Serial.println("==================================");
  Serial.println("   Digital Voltmeter with Calibration");
  Serial.println("==================================");
  Serial.println("Modes: M=Measure, O=Offset Calib, G=Gain Calib");
  Serial.println("Press button to change mode");
  Serial.println();
}

void loop() {
  // بررسی دکمه تغییر حالت
  checkModeButton();
  
  // اجرای عملکرد بر اساس حالت فعلی
  switch (currentMode) {
    case MEASURE:
      measureVoltage();
      break;
    case CALIB_OFFSET:
      calibrateOffset();
      break;
    case CALIB_GAIN:
      calibrateGain();
      break;
  }
  
  delay(100);
}

void checkModeButton() {
  static unsigned long lastPress = 0;
  
  if (digitalRead(modeButton) == LOW && millis() - lastPress > 300) {
    // تغییر حالت چرخشی
    currentMode = static_cast<Mode>((currentMode + 1) % 3);
    lastPress = millis();
    
    Serial.print("Mode changed to: ");
    switch (currentMode) {
      case MEASURE: Serial.println("MEASUREMENT"); break;
      case CALIB_OFFSET: Serial.println("OFFSET CALIBRATION"); break;
      case CALIB_GAIN: Serial.println("GAIN CALIBRATION"); break;
    }
  }
}

void measureVoltage() {
  // خواندن ولتاژ ورودی
  int rawValue = analogRead(voltagePin);
  
  // اعمال کالیبراسیون
  float voltage = (rawValue * (vRef / adcResolution) + calibOffset) * calibGain;
  
  // نمایش نتیجه
  static unsigned long lastDisplay = 0;
  if (millis() - lastDisplay > 500) {
    Serial.print("Voltage: ");
    Serial.print(voltage, 3);
    Serial.print("V | Raw: ");
    Serial.print(rawValue);
    Serial.print(" | Offset: ");
    Serial.print(calibOffset, 3);
    Serial.print(" | Gain: ");
    Serial.print(calibGain, 3);
    Serial.println();
    
    // همچنین می‌توانید روی LCD نمایش دهید
    // displayOnLCD(voltage);
    
    lastDisplay = millis();
  }
}

void calibrateOffset() {
  // خواندن پتانسیومتر offset
  int potValue = analogRead(calibOffsetPin);
  
  // تبدیل به محدوده offset (مثلاً -1V تا +1V)
  calibOffset = map(potValue, 0, 1023, -1000, 1000) / 1000.0;
  
  // نمایش وضعیت کالیبراسیون
  static unsigned long lastDisplay = 0;
  if (millis() - lastDisplay > 300) {
    Serial.print("Offset Calibration: ");
    Serial.print(calibOffset, 3);
    Serial.print("V | Pot: ");
    Serial.print(potValue);
    
    // نمایش گرافیکی
    Serial.print(" | [");
    int barPos = map(potValue, 0, 1023, 0, 20);
    for (int i = 0; i < 20; i++) {
      if (i == 10) Serial.print("|");
      else if (i == barPos) Serial.print("█");
      else Serial.print(" ");
    }
    Serial.println("]");
    
    lastDisplay = millis();
  }
}

void calibrateGain() {
  // خواندن پتانسیومتر gain
  int potValue = analogRead(calibGainPin);
  
  // تبدیل به محدوده gain (مثلاً 0.8 تا 1.2)
  calibGain = map(potValue, 0, 1023, 800, 1200) / 1000.0;
  
  // نمایش وضعیت کالیبراسیون
  static unsigned long lastDisplay = 0;
  if (millis() - lastDisplay > 300) {
    Serial.print("Gain Calibration: ");
    Serial.print(calibGain, 3);
    Serial.print(" | Pot: ");
    Serial.print(potValue);
    
    // نمایش گرافیکی
    Serial.print(" | [");
    int barPos = map(potValue, 0, 1023, 0, 20);
    for (int i = 0; i < 20; i++) {
      if (i == 10) Serial.print("|");
      else if (i == barPos) Serial.print("█");
      else Serial.print(" ");
    }
    Serial.println("]");
    
    lastDisplay = millis();
  }
}

نکات فنی و عیب‌یابی

انتخاب پتانسیومتر مناسب:

کاربرد مقاومت توصیه شده نوع توضیح
کنترل ولتاژ 1KΩ – 10KΩ خطی جریان کمی از منبع می‌کشد
کنترل صدا 10KΩ – 100KΩ لگاریتمی پاسخگویی مناسب گوش انسان
کنترل سرعت موتور 5KΩ – 50KΩ خطی نویز پایین، پاسخ سریع
تنظیم‌های دقیق 1KΩ – 10KΩ چنددور دقت بالا در تنظیم

عیب‌یابی مشکلات رایج:

مشکل علت احتمالی راه‌حل
نویز در خواندن مقادیر مقاومت بالا + سیم‌های بلند استفاده از مقاومت 10KΩ یا کمتر
پرش مقادیر پتانسیومتر فرسوده تعویض پتانسیومتر
تغییر غیرخطی پتانسیومتر لگاریتمی به جای خطی انتخاب نوع صحیح
گرم شدن پتانسیومتر جریان زیاد از آن می‌گذرد استفاده از مقاومت بالاتر یا مدار بافر

افزایش دقت و کاهش نویز:

// تابع پیشرفته خواندن پتانسیومتر با فیلتر
int readPotentiometer(int pin, int samples = 10) {
  long total = 0;
  
  // حذف اولین نمونه (ممکن است ناپایدار باشد)
  analogRead(pin);
  delay(1);
  
  // میانگین‌گیری چند نمونه
  for (int i = 0; i < samples; i++) {
    total += analogRead(pin);
    delay(2);
  }
  
  // حذف مقادیر پرت
  int average = total / samples;
  
  // فیلتر میانگین متحرک
  static int filterBuffer[5] = {0};
  static int filterIndex = 0;
  
  filterBuffer[filterIndex] = average;
  filterIndex = (filterIndex + 1) % 5;
  
  long filteredTotal = 0;
  for (int i = 0; i < 5; i++) {
    filteredTotal += filterBuffer[i];
  }
  
  return filteredTotal / 5;
}

ذخیره تنظیمات در EEPROM:

#include <EEPROM.h>

void saveCalibration(float offset, float gain) {
  EEPROM.put(0, offset);
  EEPROM.put(4, gain);
  Serial.println("Calibration saved to EEPROM");
}

void loadCalibration() {
  EEPROM.get(0, calibOffset);
  EEPROM.get(4, calibGain);
  Serial.println("Calibration loaded from EEPROM");
}

پروژه‌های پیشنهادی

1. سیستم میکسر صوتی دیجیتال

// کنترل 4 کانال صدا با پتانسیومترهای لگاریتمی

2. کنترلر دمای دوگانه

// تنظیم دمای day و night با دو پتانسیومتر

3. مولد سیگنال با فرکانس قابل تنظیم

// تولید sine, square, triangle با فرکانس متغیر

4. منبع تغذیه آزمایشگاهی

// تنظیم ولتاژ 0-30V و جریان 0-5A

5. تایمر چند کاناله صنعتی

// تنظیم زمان‌های مختلف برای رله‌ها

جدول مقایسه انواع پتانسیومتر

نوع دقت قیمت عمر مفید کاربرد
کربنی متوسط ارزان 10,000 چرخه عمومی، آموزشی
سیمی (Wirewound) بالا متوسط 100,000 چرخه صنعتی، توان بالا
پلاستیکی رسانا متوسط ارزان 50,000 چرخه صوتی، مصرفی
فیلم فلزی بسیار بالا گران 1,000,000 چرخه ابزار دقیق، پزشکی
غیرتماسی (Hall) بالا بسیار گران نامحدود محیط‌های خشن

پکیج خرید

پکیج پایه:

  • 1x پتانسیومتر 10KΩ خطی با دسته‌گرد

  • 1x مهره و واشر نصب

  • 1x صفحه درجه‌بندی شفاف

  • راهنمای نصب فارسی

پکیج حرفه‌ای:

  • 3x پتانسیومتر 10KΩ خطی

  • 1x پتانسیومتر 100KΩ لگاریتمی (برای صدا)

  • 1x پتانسیومتر چنددور 10KΩ

  • 1x جعبه نصب 4 واحده

  • 1x کابل‌های رابط آماده

  • 1x DVD شامل پروژه‌های نمونه

پکیج آموزشی:

  • 5x پتانسیومتر انواع مختلف

  • برد آزمایشی برای تست

  • 10x کابل jumper

  • کتابچه پروژه‌های عملی

  • دسترسی به دوره ویدیویی


گارانتی و پشتیبانی

  • آموزش: ویدیوهای آموزشی رایگان
  • مشاوره: پشتیبانی تلفنی برای طراحی مدار

  • جامعه: دسترسی به گروه کاربران ایرانی


سؤالات متداول

Q1: تفاوت پتانسیومتر خطی و لگاریتمی چیست؟
پتانسیومتر خطی تغییر مقاومت یکنواخت دارد، اما لگاریتمی برای کنترل صدا طراحی شده که پاسخگویی آن مشابه گوش انسان است.

Q2: چگونه پتانسیومتر چنددور را تشخیص دهم؟
پتانسیومترهای چنددور معمولاً دسته‌گرد بلندتری دارند و روی آنها نوشته شده “Multi-turn” یا حرف “W” بعد از مقدار مقاومت.

Q3: آیا می‌توانم پتانسیومتر را به عنوان سنسور موقعیت استفاده کنم؟
بله، با کالیبراسیون مناسب می‌تواند سنسور موقعیت زاویه‌ای با دقت 1-2 درجه باشد.

Q4: حداکثر سرعت چرخش مجاز چقدر است؟
معمولاً 100 RPM برای انواع استاندارد. برای سرعت‌های بالاتر از انکودرهای نوری استفاده کنید.

Q5: چگونه نویز پتانسیومتر را کاهش دهم؟

  • استفاده از مقاومت 10KΩ یا کمتر

  • خازن 0.1µF بین پایه وسط و زمین

  • فیلتر نرم‌افزاری با میانگین‌گیری

  • منبع تغذیه با ریپل پایین


توجه: برای پروژه‌های حساس به نویز، حتماً از فیلترهای نرم‌افزاری و سخت‌افزاری استفاده کنید. پتانسیومترهای با کیفیت پایین ممکن است نویز زیادی تولید کنند. برای دریافت مشاوره فنی و انتخاب پتانسیومتر مناسب برای کاربرد شما، با پشتیبانی فنی ما تماس بگیرید.