int bms = 0; // Переменная состояния BMS
int sbms = 0; // Переменная состояния BMS управления
int zar = 0; // Переменная состояния зарядки
int inv = 0; // Переменная состояния инвертора
int vent = 0; // Переменная состояния вентилятора
int avto = 0; // Переменная состояния автоматического режима
const int outputPin = 9; // номер пина, к которому подключен выход
const int analogPin = A0; // номер аналогового пина, к которому подключен переменный резистор
// Определяем аналоговые входы
const int analogPin1 = A1;
const int analogPin2 = A2;
const int analogPin3 = A3;
const int analogPin4 = A4;
// Переменные для хранения значений от АЦП и напряжения
int analogValue1 = 0;
int analogValue2 = 0;
int analogValue3 = 0;
int analogValue4 = 0;
float voltage1 = 0.0;
float voltage2 = 0.0;
float voltage3 = 0.0;
float voltage4 = 0.0;
String inputData = ""; // Переменная для хранения введенных данных
String correctPassword = "3432"; // Пароль
String inputPassword = ""; // Введенный пароль
void setup() {
pinMode(outputPin, OUTPUT);
TCCR1B = (TCCR1B & 0xF8) | 1; //Меняем частоту шим. 31кГц
pinMode(7, OUTPUT); // реле 220в.
pinMode(3, INPUT_PULLUP); //сигнал на включение станции 6
pinMode(4, OUTPUT); //вкл.откл.бмс
pinMode(10, OUTPUT); //реле вкл. инвертора
digitalWrite(7, 0);
digitalWrite(10, 1);
zar = 1;
bms = 1;
sbms = 1;
avto = 1;
{
digitalWrite(4, 0);
delay(1000);
digitalWrite(4, 1);
}
delay(2000);
Serial.begin(115200);
while (!Serial);
Serial.println("Вкл. БМС вкл. зарядки");
}
void loop() {
if ( avto == 0) //заряд для режима хранения 3,15-3,3в. авто выключен.
{
// Включение БМС, включение реле зарядки.
//2.8-572/ /3-614/ /3.1-635/ /3.2-655/ /3.3-675/ /3.4-696/ /3.42-700/ /3.45-705/ /3.47-710/ /3.5-716/ /3.52-720/ /3.6-737/ /3.65-747// 696 было
if(((analogRead(A4) <= 655) || (analogRead(A3) <= 655) ||(analogRead(A2) <= 655)||(analogRead(A1) <= 655)) && (zar == 0))
{
zar = 1;
digitalWrite(7, 0);
if (bms == 0)
{
bms = 1;
sbms = 1;
digitalWrite(4, 0);
delay(1000);
digitalWrite(4, 1);
Serial.println("Вкл. БМС, вкл. реле зарядки");
}
}
// Выключение реле зарядки.
if(((analogRead(A4) >= 675) && (analogRead(A3) >= 675) && (analogRead(A2) >= 675) && (analogRead(A1) >= 675)) && (zar == 1))
{
digitalWrite(7, 1);
zar = 0;
Serial.println("Выкл. реле зарядки");
if ((digitalRead(3) == HIGH) && (bms == 1) && (inv == 0))
{
digitalWrite(4, 0);
delay(3000);
digitalWrite(4, 1);
delay(5);
sbms = 0;
bms = 0;
Serial.println("Выкл. БМС, при выкл. зарядки, если не вкл. инвертор");
}
}
}
if ( avto == 1) //заряд для режима работа 3,4-3,5в. авто включен.
{
// Включение БМС, включение реле зарядки.
//2.8-572/ /3-614/ /3.1-635/ /3.2-655/ /3.3-675/ /3.4-696/ /3.42-700/ /3.45-705/ /3.47-710/ /3.5-716/ /3.52-720/ /3.6-737/ /3.65-747// 696 было
if(((analogRead(A4) <= 696) || (analogRead(A3) <= 696) ||(analogRead(A2) <= 696)||(analogRead(A1) <= 696)) && (zar == 0))
{
zar = 1;
digitalWrite(7, 0);
if (bms == 0)
{
bms = 1;
sbms = 1;
digitalWrite(4, 0);
delay(1000);
digitalWrite(4, 1);
Serial.println("Вкл. БМС, вкл. реле зарядки");
}
}
// Выключение реле зарядки.
if(((analogRead(A4) >= 716) && (analogRead(A3) >= 716) && (analogRead(A2) >= 716) && (analogRead(A1) >= 716)) && (zar == 1))
{
digitalWrite(7, 1);
zar = 0;
avto = 0;
Serial.println("Выкл. реле зарядки");
if ((digitalRead(3) == HIGH) && (bms == 1) && (inv == 0))
{
digitalWrite(4, 0);
delay(3000);
digitalWrite(4, 1);
delay(5);
sbms = 0;
bms = 0;
Serial.println("Выкл. БМС, при выкл. зарядки, если не вкл. инвертор");
}
}
}
// Дистанционное Включение БМС и реле Инвертора. (РАБОТА)
if((digitalRead(3) == 0) && (inv == 0))
{
inv = 1;
digitalWrite(10, 0);
delay(20);
Serial.println("Вкл. инвертора");
}
if ((inv == 1) && (bms == 0))
{
sbms = 1;
bms = 1;
digitalWrite(4, 0);
delay(1000);
digitalWrite(4, 1);
Serial.println(" Вкл. БМС (РАБОТА)");
}
// Дистанционное Выкл. реле Инвертора.
if((digitalRead(3) == 1) && (inv == 1))
{
inv = 0;
digitalWrite(10, 1);
Serial.println(" Выкл. Инвертора.");
}
// Дистанционное Выкл. БМС при условии что не включена зарядка.
if((digitalRead(3) == 1) && (zar == 0) && (bms == 1))
{
sbms = 0;
bms = 0;
digitalWrite(4, 0);
delay(3000);
digitalWrite(4, 1);
Serial.println(" Выкл. БМС при условии что не вкл. зарядка.");
}
if(digitalRead(3) == 0)
avto = 1;
// Управление вентилятором
if ((inv == 1) || (zar == 1))
{
vent = 1;
int sensorValue = analogRead(analogPin);
int outputValue = map(sensorValue, 270, 350, 255, 0);
sensorValue = constrain(sensorValue, 270, 350);
outputValue = constrain(outputValue, 0, 255);
analogWrite(outputPin, outputValue);
Serial.println();
Serial.print("Темп. датчик: ");
Serial.print(sensorValue);
Serial.print(" -> Скорость вентилятора: ");
Serial.println(outputValue);
delay(10);
}
if ((inv == 0) && (zar == 0) && (vent == 1))
{
vent = 0;
digitalWrite(9, 0);
Serial.println("Вентилятор отключён");
}
// Считываем значения с аналоговых входов
analogValue1 = analogRead(analogPin1);
analogValue2 = analogRead(analogPin2);
analogValue3 = analogRead(analogPin3);
analogValue4 = analogRead(analogPin4);
// Преобразуем значения в напряжение
voltage1 = analogValue1 * (5.0 / 1023.0);
voltage2 = analogValue2 * (5.0 / 1023.0);
voltage3 = analogValue3 * (5.0 / 1023.0);
voltage4 = analogValue4 * (5.0 / 1023.0);
// Выводим результаты в последовательный монитор
Serial.println();
Serial.print(" BAT/A1: ");
Serial.print(voltage1);
Serial.println(" В");
Serial.print(" BAT/A2: ");
Serial.print(voltage2);
Serial.println(" В");
Serial.print(" BAT/A3: ");
Serial.print(voltage3);
Serial.println(" В");
Serial.print(" BAT/A4: ");
Serial.print(voltage4);
Serial.println(" В");
Serial.println();
int invState = digitalRead(10);
String invStateText = (invState == 0) ? "Вкл" : "Выкл";
Serial.print("D10(Инвертор) : ");
Serial.println(invStateText);
int zarState = digitalRead(7);
String zarStateText = (zarState == 0) ? "Вкл" : "Выкл";
Serial.print("D7 (Зарядка) : ");
Serial.println(zarStateText);
String sbmsStateText = (sbms == 1) ? "Вкл" : "Выкл";
Serial.print("D4 (БМС) : ");
Serial.println(sbmsStateText);
int sigState = digitalRead(3);
String sigStateText = (sigState == 0) ? "Вкл" : "Выкл";
Serial.print("D3 (Сигнал на вкл.): ");
Serial.println(sigStateText);
String avtoStateText = (avto == 1) ? "3,4-3,5В" : "3,2-3,3В";
Serial.print("АВТО РЕЖИМ : ");
Serial.println(avtoStateText);
delay(1000);
// Управление через монитор порта
if (Serial.available()) {
inputData = Serial.readStringUntil('\n');
inputData.trim(); // Удаляем пробелы в начале и конце строки
inputData.toLowerCase(); // Приводим строку к нижнему регистру
Serial.print("Получена команда: ");
Serial.println(inputData);
}
// Проверка и выполнение команд
if (inputData.equals("включить инвертор")) {
if (checkPassword()) {
digitalWrite(10, LOW);
Serial.println(" Вкл. инвертора");
}
}
else if (inputData.equals("выключить инвертор")) {
if (checkPassword()) {
digitalWrite(10, HIGH);
Serial.println(" Выкл. инвертора");
}
}
else if (inputData.equals("включить зарядку")) {
if (checkPassword()) {
digitalWrite(7, LOW);
Serial.println("Включение зарядки");
}
}
else if (inputData.equals("выключить зарядку")) {
if (checkPassword()) {
digitalWrite(7, HIGH);
Serial.println("Выкл. зарядки");
}
}
else if (inputData.equals("включить бмс")) {
if (checkPassword()) {
sbms = 1;
digitalWrite(4, 0);
delay(1000);
digitalWrite(4, 1);
Serial.println("Вкл. БМС (РАБОТА)");
}
}
else if (inputData.equals("выключить бмс")) {
if (checkPassword()) {
sbms = 0;
digitalWrite(4, 0);
delay(3000);
digitalWrite(4, 1);
delay(5);
Serial.println("Выкл. БМС");
}
}
else if (inputData.equals("сброс")) {
if (checkPassword()) {
asm volatile("jmp 0x00");
}
}
else if (inputData.equals("авто 3,3")) {
if (checkPassword()) {
avto = 0;
Serial.println("авто 3,3");
}
}
else if (inputData.equals("авто 3,5")) {
if (checkPassword()) {
avto = 1;
Serial.println("авто 3,5");
}
}
else if (inputData.length() > 0) {
Serial.println("Неизвестная команда!");
}
inputData = ""; // Сбрасываем переменную для следующей команды
}
// Функция проверки пароля
bool checkPassword() {
Serial.print("Введите пароль: ");
while (!Serial.available()); // Ожидаем, пока пользователь введет пароль
inputPassword = Serial.readStringUntil('\n');
inputPassword.trim();
if (inputPassword == correctPassword) {
Serial.println("Пароль верный.");
return true;
} else {
Serial.println("Неверный пароль!");
return false;
}
}