ttp223 через прерывание
- Войдите на сайт для отправки комментариев
Пнд, 21/05/2018 - 14:03
Добрый день всем, делаю тач выключатель с ttp223 + управление по ethernet
Если присваивать изменение состояние сенсора через прерывание, то появляются ложные срабатывания от статического напряжения или при считывании hhtp запроса происходит 2-3 срабатывания сенсора.
Скетч:
#include <Ethernet2.h> #define LIGHT_RELAY 4 #define BUTTON 0 #define LIGHT_DELAY 1000 #define BUTTON_DELAY 100 #define REQUEST_BUFFER_SIZE 20 int state = 0; byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(10, 10, 25, 234); EthernetServer server(80); char httpRequest[REQUEST_BUFFER_SIZE] = {0}; // buffered HTTP request stored as null terminated string char requestIndex = 0; // index into HTTP_req buffer void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(LIGHT_RELAY, OUTPUT); pinMode(BUTTON, INPUT); digitalWrite(LIGHT_RELAY, LOW); attachInterrupt (BUTTON, touch, RISING); Ethernet.begin(mac, ip); Serial.println("start"); Serial.println(Ethernet.localIP()); } void loop() { EthernetClient client = server.available(); if (client) { Serial.println("new client"); requestIndex = 0; StrClear(httpRequest, REQUEST_BUFFER_SIZE); boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); if (requestIndex < (REQUEST_BUFFER_SIZE - 1)) { httpRequest[requestIndex] = c; // save HTTP request character requestIndex++; } if (c == '\n' && currentLineIsBlank) { Serial.println(httpRequest); if (strstr(httpRequest, "GET /switch") > 0){ lightSwitch(); } client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connnection: close"); client.println(); requestIndex = 0; StrClear(httpRequest, REQUEST_BUFFER_SIZE); break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; } else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } delay(1); client.stop(); Serial.println("client disonnected"); } } void lightSwitch() { if(state == 0) { digitalWrite(LIGHT_RELAY, HIGH); state = 1; } else { digitalWrite(LIGHT_RELAY, LOW); state = 0; } } void StrClear(char *str, char length) { for (int i = 0; i < length; i++) { str[i] = 0; } } void touch() { static unsigned long millisPrevious; if(millis() - BUTTON_DELAY > millisPrevious) { lightSwitch(); } millisPrevious = millis(); Serial.println("TOUCHED"); }
имею такой выхлоп к консоль:
start 10.10.25.234 TOUCHED TOUCHED TOUCHED TOUCHED TOUCHED TOUCHED TOUCHED TOUCHED new client GET /switch HTTP/1. client disonnected new client GET /favicon.ico HT client disonnected new client GET /switch HTTP/1. TOUCHED TOUCHED TOUCHED TOUCHED TOUCHED client disonnected new client GET /favicon.ico HT client disonnected new client GET /switch HTTP/1. TOUCHED TOUCHED TOUCHED client disonnected new client GET /favicon.ico HT client disonnected new client GET /switch HTTP/1. TOUCHED TOUCHED TOUCHED client disonnected new client GET /favicon.ico HT client disonnected TOUCHED TOUCHED TOUCHED
при прикосновении происходит два вывод TOUCHED, что тоже странно. При простом считывании состояния пина сенсора, такого нет. Такое поведение появляется только при использовании прерываний
при прикосновении происходит два вывод TOUCHED, что тоже странно. При простом считывании состояния пина сенсора, такого нет. Такое поведение появляется только при использовании прерываний
Сильно в код не вчитывался, Антидребезг?(это намёк что погуглить, если не понимаете термина)
при прикосновении происходит два вывод TOUCHED, что тоже странно. При простом считывании состояния пина сенсора, такого нет. Такое поведение появляется только при использовании прерываний
Сильно в код не вчитывался, Антидребезг?(это намёк что погуглить, если не понимаете термина)
в качестве антидребезга такая обработка прерывания
Ничего странного если верить:
в качестве антидребезга такая обработка прерывания
И да, я тут не увидел от слова совсем где у вас антидребезг.
По полочкам:
Обнуляется при каждом входе в процедуру.
равносильно:
Обнуляется при каждом входе в процедуру.
точно, перевел объеявление переменной выше. Но даже если никто не касается сенсора, а отправляется http запрос серсор срабатывает, в консоле:
сделал даже такой простой код
и в консоле все равно проскакивает TOUCHED о_О
и в консоле все равно проскакивает TOUCHED о_О
Еще раз и по полочкам, у вас НЕТ в коде антидребезга.. у вас есть задержка между ПОВТОРНЫМ срабатыванием.
Тогда как антидребезг програмный подразумевает срабатывание ТЕЧЕНИИ времени.
Т.е. нужно проверить что кнопка нажалась, и через 5мс ВСЕ ЕЩЕ НАЖАТА... это антидребезг....
а еще лучше что кнопка нажалась и нажата в течении 5мс без отпускания(цифра 5 - с потолка).
и в консоле все равно проскакивает TOUCHED о_О
Еще раз и по полочкам, у вас НЕТ в коде антидребезга.. у вас есть задержка между ПОВТОРНЫМ срабатыванием.
Тогда как антидребезг програмный подразумевает срабатывание ТЕЧЕНИИ времени.
Т.е. нужно проверить что кнопка нажалась, и через 5мс ВСЕ ЕЩЕ НАЖАТА... это антидребезг....
а еще лучше что кнопка нажалась и нажата в течении 5мс без отпускания(цифра 5 - с потолка).
для такого алгоритма, как я понимаю, на плате ttp223 нужно запаять пару B?
для такого алгоритма, как я понимаю, на плате ttp223 нужно запаять пару B?
1) Ахтунг, вы триггер обрабатываете как кнопку?
2) Дайте фото вашей поделки, ибо чует сердце что у вас кабель изернета рядом с сенсором =)
3) Вы до этого имели дело с емкостными датчиками?
мне нужен выключатель без фиксации
опыта нет
отслеживать состояние пина сенсора в прерывании не получится, так как при FALLING в функции прерывания состояние пина будет LOW
отключаю лампочку от 220V и проблема пропадает, все работает как и должно...
double. del.
double. del.
1) Отключите все шилды, оставте только кнопку,
2) Проверьте тот же код.
3а) Все работает -> гугл -> экранирование проводов.
3б) Так же ложные срабатывания -> гугл ->уменьшить чуствительность ttp223.
4) Работает - наслаждаемся.
скорее всего фильтрация 220Вольт, но может проще тогда твердотельное реле?
Использовав твердотельное реле вы надеетесь на что? на то что у вас перестанет менятся поле вокруг силовых проводов?
Эти помехи можно игнорировать программно, но экранирования никто не отменял.
3а) Все работает -> гугл -> экранирование проводов.
3б) Так же ложные срабатывания -> гугл ->уменьшить чуствительность ttp223.
экранирование практически нереально реализовать, уменьшить чувствительность - получим нерабочий выключатель, так как стелко достаточно толстое.
Это чегойта ради? сложно обернуть сигнальный провод фольгой от датчика до друины и прицепить фольгу к заземлению?
Это чегойта ради? сложно обернуть сигнальный провод фольгой от датчика до друины и прицепить фольгу к заземлению?
не помогло, все равно от статики срабатывает =(