Суть - есть Ардуино Уно к ней подключены три реле которые управляются сенсорными кнопками 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()?
