Управление питанием на сенсорах TP223

Суть - есть Ардуино Уно к ней подключены три реле которые управляются сенсорными кнопками TP223 в режиме нажатия. По техзаданию кнопки должны перестать управлять реле при нажатии дольше 12 секунд. Но как мы не бились сенсор продолжает управлять реле даже в режиме отключения хотя щелчок по времени происходит. Мосфет тоже не помог. Посоветуйте вектор решения? Програмно возможно отключить данный сенсор?

Пожалуйста, покажите код, который вы используете, и схему схемы.

// Настройка пинов
#define SW1 2
#define SW2 3
#define SW3 4
#define D1 5
#define D2 6
#define D3 7
#define RL1 8
#define RL2 9
#define RL3 10
#define SENSOR_POWER_PIN 11 // Пин для управления питанием сенсоров через BC337

unsigned long sensorPressStartTime = 0; // Время начала нажатия
bool alarmMode = false;                // Флаг режима Alarm Mode
unsigned long alarmStartTime = 0;      // Время начала Alarm Mode

void setup() {
    // Настройка пинов для сенсоров (вход)
    pinMode(SW1, INPUT);
    pinMode(SW2, INPUT);
    pinMode(SW3, INPUT);

    // Настройка пинов для светодиодов и реле (выход)
    pinMode(D1, OUTPUT);
    pinMode(D2, OUTPUT);
    pinMode(D3, OUTPUT);
    pinMode(RL1, OUTPUT);
    pinMode(RL2, OUTPUT);
    pinMode(RL3, OUTPUT);

    // Настройка пина для управления питанием сенсоров
    pinMode(SENSOR_POWER_PIN, OUTPUT);
    digitalWrite(SENSOR_POWER_PIN, HIGH); // Включить питание сенсоров

    // Включение режима ожидания
    setSafeMode();
}

void loop() {
    // Если Alarm Mode активен, проверяем его длительность
    if (alarmMode) {
        if (millis() - alarmStartTime >= 6000) { // Alarm Mode длится 6 секунд
            alarmMode = false;                   // Выходим из Alarm Mode
            digitalWrite(SENSOR_POWER_PIN, HIGH); // Включаем питание сенсоров
            setSafeMode();
        }
        return; // Пока Alarm Mode активен, остальные действия пропускаются
    }

    // Чтение состояния сенсоров
    bool sw1State = digitalRead(SW1);
    bool sw2State = digitalRead(SW2);
    bool sw3State = digitalRead(SW3);

    // Если любая кнопка нажата
    if (sw1State || sw2State || sw3State) {
        // Если только что началось нажатие
        if (sensorPressStartTime == 0) {
            sensorPressStartTime = millis();
        }

        // Проверка длительности нажатия
        if (millis() - sensorPressStartTime > 12000) {
            activateAlarmMode(); // Активируем Alarm Mode после 12 секунд
            return;
        }

        // Управление реле и светодиодами в зависимости от сенсора
        if (sw1State) {
            activateRelay(D1, RL1);
            deactivateRelay(D2, RL2);
            deactivateRelay(D3, RL3);
        } else if (sw2State) {
            activateRelay(D2, RL2);
            deactivateRelay(D1, RL1);
            deactivateRelay(D3, RL3);
        } else if (sw3State) {
            activateRelay(D3, RL3);
            deactivateRelay(D1, RL1);
            deactivateRelay(D2, RL2);
        }
    } else {
        // Если кнопка отпущена
        sensorPressStartTime = 0; // Сбрасываем время нажатия
        setSafeMode();            // Возвращаемся в Safe Mode
    }
}

void setSafeMode() {
    // Включить все светодиоды, выключить реле
    digitalWrite(D1, HIGH);
    digitalWrite(D2, HIGH);
    digitalWrite(D3, HIGH);
    digitalWrite(RL1, LOW);
    digitalWrite(RL2, LOW);
    digitalWrite(RL3, LOW);
}

void activateAlarmMode() {
    alarmMode = true;                     // Устанавливаем флаг Alarm Mode
    alarmStartTime = millis();            // Запоминаем время начала Alarm Mode
    digitalWrite(SENSOR_POWER_PIN, LOW);  // Выключаем питание сенсоров
    digitalWrite(D1, LOW);                // Выключаем все светодиоды
    digitalWrite(D2, LOW);
    digitalWrite(D3, LOW);
    digitalWrite(RL1, LOW);               // Выключаем все реле
    digitalWrite(RL2, LOW);
    digitalWrite(RL3, LOW);
}

void activateRelay(int ledPin, int relayPin) {
    // Включить светодиод и реле
    digitalWrite(ledPin, HIGH);
    digitalWrite(relayPin, HIGH);
}

void deactivateRelay(int ledPin, int relayPin) {
    // Выключить светодиод и реле
    digitalWrite(ledPin, LOW);
    digitalWrite(relayPin, LOW);
}

Код вставил. Вчера коллега сказал что в сенсорах TP223 примитивная микруха и она не регулируется никак.

Вы также должны разместить электрическую схему.

Справочно

TP223B чип шестиногий

Куда этот return; помещает ваш код? Внутри loop() или в начале кода?

        // Проверка длительности нажатия
        if (millis() - sensorPressStartTime > 12000) {
            activateAlarmMode(); // Активируем Alarm Mode после 12 секунд
            return;
        }

Прерывает выполнение текущей итерации функции loop()

Он оставляет (if condition), но куда он возвращается? Начало loop()?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.