const int sensorPin = 34; // Пин подключения датчика (пример: 34)
const int outputPins[] = {0, 2, 4, 5, 12, 14}; // Пины для выходов 2-7
const int independentOutputPin = 15; // Пин для независимого выхода 8
const int additionalOutputPin = 33; // Пин для независимого выхода 33
const int inputPins[] = {18, 19, 21, 22, 23, 25}; // Пины для входов
const int numOutputs = 6; // Общее количество выходов 2-7
const int minChange = 33; // Минимальное изменение для активации выходов
const int updateInterval = 50; // Интервал обновления данных с датчика (в миллисекундах)
const int statusUpdateInterval = 100; // Интервал обновления статуса входов (в миллисекундах)
const int minValue = 0; // Минимальное значение напряжения с датчика
const int maxValue = 4095; // Максимальное значение напряжения с датчика (для ESP32)
const int threshold = 4000; // Пороговое значение для включения выхода 8
bool currentValues[numOutputs]; // Массив для хранения текущих значений выходов 2-7
int previousSensorValue = 0; // Предыдущее значение с датчика
unsigned long previousMillis = 0; // Время последнего обновления
unsigned long previousStatusMillis = 0; // Время последнего обновления статуса входов
int lastActiveOutput = -1; // Индекс последнего активного выхода
void setup() {
Serial.begin(115200); // Инициализация серийного порта
pinMode(sensorPin, INPUT);
for (int i = 0; i < numOutputs; i++) {
pinMode(outputPins[i], OUTPUT);
currentValues[i] = LOW;
}
pinMode(independentOutputPin, OUTPUT);
pinMode(additionalOutputPin, OUTPUT);
digitalWrite(independentOutputPin, LOW); // Выход 8 выключен по умолчанию
digitalWrite(additionalOutputPin, LOW); // Выход 35 выключен по умолчанию
// Настройка входов
for (int i = 0; i < sizeof(inputPins)/sizeof(inputPins[0]); i++) {
pinMode(inputPins[i], INPUT);
}
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= updateInterval) {
previousMillis = currentMillis;
int sensorValue = analogRead(sensorPin);
// Если значение с датчика изменилось на minChange или более
if (abs(sensorValue - previousSensorValue) >= minChange) {
int outputToChange = random(numOutputs);
currentValues[outputToChange] = (sensorValue > previousSensorValue) ? HIGH : LOW;
digitalWrite(outputPins[outputToChange], currentValues[outputToChange]);
previousSensorValue = sensorValue;
// Обновляем последний активный выход, если он включился
if (currentValues[outputToChange] == HIGH) {
lastActiveOutput = outputToChange;
}
}
// Обработка крайних значений
if (sensorValue >= 3333) {
// Включаем все выходы 2-7
for (int i = 0; i < numOutputs; i++) {
digitalWrite(outputPins[i], HIGH);
currentValues[i] = HIGH;
}
bool anyInputInactive = false;
for (int i = 0; i < sizeof(inputPins)/sizeof(inputPins[0]); i++) {
if (digitalRead(inputPins[i]) == LOW) {
anyInputInactive = true;
break;
}
}
if (anyInputInactive) {
digitalWrite(additionalOutputPin, HIGH); // Включаем выход 35
} else {
digitalWrite(additionalOutputPin, LOW); // Выключаем выход 35
}
} else if (sensorValue == minValue) {
for (int i = 0; i < numOutputs; i++) {
digitalWrite(outputPins[i], LOW);
currentValues[i] = LOW;
}
digitalWrite(additionalOutputPin, LOW); // Выключаем выход 35
lastActiveOutput = -1; // Сбрасываем последний активный выход
} else {
// Если ни одно из крайних значений не достигнуто, оставляем последний активный выход включенным
if (lastActiveOutput != -1) {
digitalWrite(outputPins[lastActiveOutput], HIGH);
currentValues[lastActiveOutput] = HIGH;
}
}
// Обработка независимого выхода 8
if (sensorValue > threshold) {
digitalWrite(independentOutputPin, HIGH); // Включаем выход 8
} else {
digitalWrite(independentOutputPin, LOW); // Выключаем выход 8
}
}
// Обновление статуса входов каждую секунду
if (currentMillis - previousStatusMillis >= statusUpdateInterval) {
previousStatusMillis = currentMillis;
Serial.print("Input statuses: ");
for (int i = 0; i < sizeof(inputPins)/sizeof(inputPins[0]); i++) {
int inputStatus = digitalRead(inputPins[i]);
Serial.print(inputStatus);
Serial.print(" ");
}
Serial.println();
}
}