#include <TimerOne.h>
#include <MsTimer2.h>
// پینها
const int mosfetChargePin = 3;
const int mosfetDischargePin = 4;
const int mosfetOutputSwitchPin = 5;
const int adapterStatusPin = 8;
const int ledAdapterPin = 7;
const int batteryVoltagePin = A0;
// تقسیم ولتاژ
const float voltageDividerRatio = 3.0;
// هیسترزیس
const float chargeOnVoltage = 13.6;
const float chargeOffVoltage = 13.8;
const float dischargeOnVoltage = 11.9;
const float dischargeOffVoltage = 11.8;
// متغیرها
volatile bool checkBatteryNow = false;
bool isCharging = false;
bool isDischarging = true;
volatile bool adapterConnected = false;
volatile bool adapterChanged = false;
void setup() {
pinMode(mosfetChargePin, OUTPUT);
pinMode(mosfetDischargePin, OUTPUT);
pinMode(mosfetOutputSwitchPin, OUTPUT);
pinMode(adapterStatusPin, INPUT); // فعالسازی پولآپ داخلی
pinMode(ledAdapterPin, OUTPUT);
digitalWrite(mosfetChargePin, LOW);
digitalWrite(mosfetDischargePin, LOW);
digitalWrite(mosfetOutputSwitchPin, LOW);
digitalWrite(ledAdapterPin, LOW);
Serial.begin(9600);
// تایمر بررسی باتری: هر 1 ثانیه
Timer1.initialize(1000000);
Timer1.attachInterrupt(timerBatteryCheckISR);
// تایمر بررسی برق شهری: هر 10 میلیثانیه
MsTimer2::set(10, timerAdapterCheckISR); // 10ms
MsTimer2::start();
}
void loop() {
// نظارت بر آداپتور
if (adapterChanged) {
adapterChanged = false;
digitalWrite(mosfetOutputSwitchPin, adapterConnected ? HIGH : LOW);
digitalWrite(ledAdapterPin, adapterConnected ? LOW : HIGH);
}
// نظارت بر ولتاژ باتری
if (checkBatteryNow) {
checkBatteryNow = false;
float batteryVoltage = readBatteryVoltage();
// شارژ
if (batteryVoltage < chargeOnVoltage) {
isCharging = true;
} else if (batteryVoltage > chargeOffVoltage) {
isCharging = false;
}
digitalWrite(mosfetChargePin, isCharging ? HIGH : LOW);
// دشارژ
if (batteryVoltage > dischargeOnVoltage) {
isDischarging = true;
} else if (batteryVoltage < dischargeOffVoltage) {
isDischarging = false;
}
digitalWrite(mosfetDischargePin, isDischarging ? HIGH : LOW);
// سریال دیباگ
Serial.print("Battery Voltage: ");
Serial.print(batteryVoltage);
Serial.print(" V | power battery : ");
Serial.print(isDischarging ? "ON" : "OFF");
Serial.print(" | Chargeing battery: ");
Serial.print(isCharging ? "ON" : "OFF");
Serial.print(" | Outputbat: ");
Serial.println(digitalRead(mosfetOutputSwitchPin) ? "ON" : "OFF");
}
}
// تایمر باتری (Timer1)
void timerBatteryCheckISR() {
checkBatteryNow = true;
}
// تایمر برق شهری (MsTimer2 → Timer2)
void timerAdapterCheckISR() {
static bool lastAdapterState = false;
bool current = digitalRead(adapterStatusPin) == LOW;
if (current != lastAdapterState) {
lastAdapterState = current;
adapterConnected = current;
adapterChanged = true;
}
}
// ولتاژ باتری
float readBatteryVoltage() {
int raw = analogRead(batteryVoltagePin);
float voltage = (raw * 5.0) / 1023.0;
return voltage * voltageDividerRatio;
}