142 lines
3.9 KiB
C++
142 lines
3.9 KiB
C++
#ifndef VOLTAGE_READER_H
|
|
#define VOLTAGE_READER_H
|
|
|
|
#include <Arduino.h>
|
|
#include "Config.h"
|
|
|
|
class VoltageReader {
|
|
private:
|
|
float filteredVoltage = 0.0;
|
|
bool firstReading = true; // فلگ برای اولین خواندن
|
|
const float alpha = 0.3; // ضریب فیلتر را کمی بیشتر کردم
|
|
|
|
public:
|
|
VoltageReader() {
|
|
init();
|
|
}
|
|
|
|
void init() {
|
|
pinMode(VOLTAGE_DIVIDER_PIN, INPUT_ANALOG);
|
|
analogReadResolution(12); // تنظیم رزولوشن ADC به 12-bit
|
|
delay(100); // کمی بیشتر صبر کن
|
|
|
|
// چند بار خواندن برای تخلیه خازنهای داخلی
|
|
for (int i = 0; i < 10; i++) {
|
|
analogRead(VOLTAGE_DIVIDER_PIN);
|
|
delay(1);
|
|
}
|
|
}
|
|
|
|
// خواندن ولتاژ بدون فیلتر
|
|
float readRawVoltage() {
|
|
int samples = 32; // تعداد نمونهها را بیشتر کردم
|
|
long sum = 0;
|
|
|
|
for (int i = 0; i < samples; i++) {
|
|
sum += analogRead(VOLTAGE_DIVIDER_PIN);
|
|
delayMicroseconds(20);
|
|
}
|
|
|
|
int rawValue = sum / samples;
|
|
|
|
// تبدیل به ولتاژ
|
|
float voltageAtPin = (rawValue * ADC_REF_VOLTAGE) / ADC_RESOLUTION;
|
|
|
|
// محاسبه ولتاژ اصلی
|
|
float actualVoltage = voltageAtPin * VOLTAGE_DIVIDER_RATIO;
|
|
|
|
return actualVoltage;
|
|
}
|
|
|
|
// خواندن با فیلتر
|
|
float readVoltage() {
|
|
float currentVoltage = readRawVoltage();
|
|
|
|
// اگر اولین بار است، فیلتر را با مقدار فعلی مقداردهی کن
|
|
if (firstReading) {
|
|
filteredVoltage = currentVoltage;
|
|
firstReading = false;
|
|
} else {
|
|
// اعمال فیلتر Low-pass
|
|
filteredVoltage = (alpha * currentVoltage) + ((1 - alpha) * filteredVoltage);
|
|
}
|
|
|
|
return currentVoltage; // actual voltage برمیگردانیم
|
|
}
|
|
|
|
// دریافت ولتاژ فیلتر شده
|
|
float getFilteredVoltage() {
|
|
return filteredVoltage;
|
|
}
|
|
|
|
// تست سلامت مدار
|
|
bool testCircuit() {
|
|
Serial1.println("\n🔌 Testing voltage divider circuit...");
|
|
|
|
// چند بار خواندن برای اطمینان
|
|
float sum = 0;
|
|
int readings = 10;
|
|
|
|
for (int i = 0; i < readings; i++) {
|
|
sum += readRawVoltage();
|
|
delay(50);
|
|
}
|
|
|
|
float avgVoltage = sum / readings;
|
|
|
|
Serial1.print("Average voltage: ");
|
|
Serial1.print(avgVoltage, 2);
|
|
Serial1.println("V");
|
|
|
|
Serial1.print("Raw ADC value: ");
|
|
Serial1.println(analogRead(VOLTAGE_DIVIDER_PIN));
|
|
|
|
// ولتاژ در پین
|
|
float pinVoltage = avgVoltage / VOLTAGE_DIVIDER_RATIO;
|
|
Serial1.print("Voltage at PA0 pin: ");
|
|
Serial1.print(pinVoltage, 2);
|
|
Serial1.println("V");
|
|
|
|
if (avgVoltage > 4.5 && avgVoltage < 5.5) {
|
|
Serial1.println("✅ Circuit OK (within expected 5V ±10%)");
|
|
return true;
|
|
} else {
|
|
Serial1.print("❌ Expected ~5V, got ");
|
|
Serial1.print(avgVoltage, 2);
|
|
Serial1.println("V");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// نمایش اطلاعات دیباگ
|
|
void debugInfo() {
|
|
float rawVoltage = readRawVoltage();
|
|
int rawADC = analogRead(VOLTAGE_DIVIDER_PIN);
|
|
float pinVoltage = rawVoltage / VOLTAGE_DIVIDER_RATIO;
|
|
|
|
Serial1.println("\n📊 Voltage Debug Info:");
|
|
Serial1.print("Raw ADC value: ");
|
|
Serial1.println(rawADC);
|
|
Serial1.print("Voltage at PA0 pin: ");
|
|
Serial1.print(pinVoltage, 3);
|
|
Serial1.println("V");
|
|
Serial1.print("Actual voltage (raw): ");
|
|
Serial1.print(rawVoltage, 3);
|
|
Serial1.println("V");
|
|
Serial1.print("Filtered voltage: ");
|
|
Serial1.print(filteredVoltage, 3);
|
|
Serial1.println("V");
|
|
}
|
|
|
|
// ریست فیلتر
|
|
void resetFilter() {
|
|
filteredVoltage = 0.0;
|
|
firstReading = true;
|
|
Serial1.println("✅ Voltage filter reset");
|
|
}
|
|
};
|
|
|
|
// ایجاد نمونه سراسری
|
|
VoltageReader voltageReader;
|
|
|
|
#endif // VOLTAGE_READER_H
|