ttp223 через прерывание

de1phi
Offline
Зарегистрирован: 21.05.2018

Добрый день всем, делаю тач выключатель с 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, что тоже странно. При простом считывании состояния пина сенсора, такого нет. Такое поведение появляется только при использовании прерываний

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

de1phi пишет:

при прикосновении происходит два вывод TOUCHED, что тоже странно. При простом считывании состояния пина сенсора, такого нет. Такое поведение появляется только при использовании прерываний

Сильно в код не вчитывался, Антидребезг?(это намёк что погуглить, если не понимаете термина)

de1phi
Offline
Зарегистрирован: 21.05.2018

ToRcH2565 пишет:

de1phi пишет:

при прикосновении происходит два вывод TOUCHED, что тоже странно. При простом считывании состояния пина сенсора, такого нет. Такое поведение появляется только при использовании прерываний

Сильно в код не вчитывался, Антидребезг?(это намёк что погуглить, если не понимаете термина)

в качестве антидребезга такая обработка прерывания


void touch() 
{
  static unsigned long millisPrevious;
  if(millis() - BUTTON_DELAY > millisPrevious) {
    lightSwitch();
  }
  millisPrevious = millis();    
  
  Serial.println("TOUCHED");
}

 

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

de1phi пишет:
при прикосновении происходит два вывод TOUCHED, что тоже странно.

Ничего странного если верить: 

de1phi пишет:

в качестве антидребезга такая обработка прерывания

void touch() 
{
  static unsigned long millisPrevious;
  if(millis() - BUTTON_DELAY > millisPrevious) {
    lightSwitch();
  }
  millisPrevious = millis();    
  
  Serial.println("TOUCHED");
}

И да, я тут не увидел от слова совсем где у вас антидребезг.

По полочкам: 

  static unsigned long millisPrevious;

Обнуляется при каждом входе в процедуру.

 if(millis() - BUTTON_DELAY > millisPrevious) 

равносильно: 

 if(millis() - BUTTON_DELAY > 0) 
de1phi
Offline
Зарегистрирован: 21.05.2018

ToRcH2565 пишет:

Обнуляется при каждом входе в процедуру.

точно, перевел объеявление переменной выше. Но даже если никто не касается сенсора, а отправляется http запрос серсор срабатывает, в консоле:

new client
GET /switch HTTP/1.
client disonnected
TOUCHED

сделал даже такой простой код

lightSwitch();
delay(10000);

и в консоле все равно проскакивает TOUCHED о_О

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

de1phi пишет:

и в консоле все равно проскакивает TOUCHED о_О

Еще раз и по полочкам, у вас НЕТ в коде антидребезга.. у вас есть задержка между ПОВТОРНЫМ срабатыванием.

Тогда как антидребезг програмный подразумевает срабатывание ТЕЧЕНИИ времени.

Т.е. нужно проверить что кнопка нажалась, и через 5мс ВСЕ ЕЩЕ НАЖАТА... это антидребезг....

а еще лучше что кнопка нажалась и нажата в течении 5мс без отпускания(цифра 5 - с потолка).

 

de1phi
Offline
Зарегистрирован: 21.05.2018

ToRcH2565 пишет:

de1phi пишет:

и в консоле все равно проскакивает TOUCHED о_О

Еще раз и по полочкам, у вас НЕТ в коде антидребезга.. у вас есть задержка между ПОВТОРНЫМ срабатыванием.

Тогда как антидребезг програмный подразумевает срабатывание ТЕЧЕНИИ времени.

Т.е. нужно проверить что кнопка нажалась, и через 5мс ВСЕ ЕЩЕ НАЖАТА... это антидребезг....

а еще лучше что кнопка нажалась и нажата в течении 5мс без отпускания(цифра 5 - с потолка).

 

 

для такого алгоритма, как я понимаю, на плате ttp223 нужно запаять пару B?

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

de1phi пишет:

для такого алгоритма, как я понимаю, на плате ttp223 нужно запаять пару B?

1) Ахтунг, вы триггер обрабатываете как кнопку?

2) Дайте фото вашей поделки, ибо чует сердце что у вас кабель изернета рядом с сенсором =) 

3) Вы до этого имели дело с емкостными датчиками?

de1phi
Offline
Зарегистрирован: 21.05.2018

мне нужен выключатель без фиксации

 

опыта нет

 

отслеживать состояние пина сенсора в прерывании не получится, так как при FALLING в функции прерывания состояние пина будет LOW

 

отключаю лампочку от 220V и проблема пропадает, все работает как и должно...

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

double. del.

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

double. del.

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

de1phi пишет:

1) Отключите все шилды, оставте только кнопку,

2) Проверьте тот же код.

3а) Все работает -> гугл -> экранирование проводов.

3б) Так же ложные срабатывания -> гугл ->уменьшить чуствительность ttp223.

4) Работает - наслаждаемся.

de1phi
Offline
Зарегистрирован: 21.05.2018

скорее всего фильтрация 220Вольт, но может проще тогда твердотельное реле?

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

de1phi пишет:
скорее всего фильтрация 220Вольт, но может проще тогда твердотельное реле?

Использовав твердотельное реле вы надеетесь на что? на то что у вас перестанет менятся поле вокруг силовых проводов? 

Эти помехи можно игнорировать программно, но экранирования никто не отменял.

ToRcH2565 пишет:

3а) Все работает -> гугл -> экранирование проводов.

3б) Так же ложные срабатывания -> гугл ->уменьшить чуствительность ttp223.

 

de1phi
Offline
Зарегистрирован: 21.05.2018

экранирование практически нереально реализовать, уменьшить чувствительность - получим нерабочий выключатель, так как стелко достаточно толстое. 

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

de1phi пишет:
экранирование практически нереально реализовать
 

Это чегойта ради? сложно обернуть сигнальный провод фольгой от датчика до друины и прицепить фольгу к заземлению?

de1phi
Offline
Зарегистрирован: 21.05.2018

ToRcH2565 пишет:

de1phi пишет:
экранирование практически нереально реализовать
 

Это чегойта ради? сложно обернуть сигнальный провод фольгой от датчика до друины и прицепить фольгу к заземлению?

не помогло, все равно от статики срабатывает =(