Тема: Дребезг Контактов (библиотека Bounce) и Expander Shield I2C

Добрый Вечер.
Вот токая проблема. Есть Friduino 2009 , Ethernet Shield v2 и Expander Shield I2C. С интернет шилдом вро кое как разобрался, сервер работает нормально. почемуто не хочет работать Библиотека Bounce с Expander Shield I2C. Если без платы расширения все работает нормально, ни какого дребезка, когда начинаешь прописывть работу с библитекой MCP23x17.h и MCP23017.h,  выдает ошибку в  "" if (bouncer.update()) {""

Вопрос: 1. Работают ли эти две библиотеки в месте?

Второй вопрос.

Можно ли расшарить "функцию обработки внешнего прерывания" (attachInterrupt), через Expander Shield I2C?
На сколько я понимаю эта функция работает на 1 и 3 пине, а вот как её запусть через Expander Shield как-то не сооброжу. Да хоть эту функцию на всю вторую микросхему расшарить, все равно понадобиться 9 входов. Расположение всех перемычек на шилде пока стандартное.




Очень бы хотелось чтобы корефеи подсказали, зарание спасибо!!!!

2

Re: Дребезг Контактов (библиотека Bounce) и Expander Shield I2C

Сам скетч (На кометарии в нутри особо внимания не оброщайте, писал для себя!!! ):



#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>

#include <MCP23x17.h>
#include <MCP23017.h>

#include <Bounce.h>  // Дребезг контактов


///// интернет////////////////////

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0, 25);
IPAddress gateway(192,168,0, 2);
IPAddress subnet(255, 255, 0, 0);

EthernetServer server(1010);
boolean alreadyConnected = false; // ли клиент был подключен ранее (отключаем всех клиентов)???

int inSize=0; // Переменная которая будет содержать размер буфера
char str[128]; // Так как типа string тут нет, будем использовать массив символов





//Создаем два объекта класса CMCP23017, но не инициализируем, т.к. шина I2C не готова
CMCP23017 mcp23_1;
CMCP23017 mcp23_2;



///////////////////// ПЕРЕМЕННЫЕ НА КНОПКИ///////////////
long int k3 ; // Состояние кнопки на 3 ноге
long int K3Ron; // Запуск работы на кнопке 3 нажатие кнопки
long int K3Roff; // Запуск работы на кнопке 3 отпускание кнопки
long int K3RS; // Счетчик колличества циклов отправки до подтверждения


long int previousMillis = 0;        // храним время последнего переключения светодиода

long int interval_1 = 1;    // интервал между включение/выключением первая отправка
long int interval_2 = 90;  // интервал между включение/выключением цмкличная отправка
long int interval_Per ;        // переменный интервал

void setup()
{


/////////////////// интернет /////////////////

  Ethernet.begin(mac, ip, gateway, subnet);
      server.begin();// начать прослушивание для клиентов


//Инициализируем шину I2C
Wire.begin();
mcp23_1.init(0);
mcp23_2.init(1);


mcp23_1.pinMode(3, INPUT); // кнопка
mcp23_1.pinMode(6, OUTPUT); // свет
mcp23_1.pinMode(7, OUTPUT);  //свет

Bounce bouncer = Bounce(3, 40); //создаем экземпляр класса Bounce для 3 вывода
}
void loop()
{
 
 
 
 
 
  //////////////////////КНОПКИ//////////////////
 
 
unsigned long currentMillis = millis();

///////////////////////// ИНТЕРНЕТ////////////////

  EthernetClient client = server.available(); // ожидание для нового клиента:
 
  inSize=0; // Сбрасываем переменную 
  memset(str, '\0', 128); // Очищаем массив
   if(client.available() > 0)
{
   delay(50); // Ждем, для того, чтобы пришли все данные
   inSize = client.available(); // Получаем длину строки и записываем ее в переменую
   for (int w = 0; w < inSize; w++)
   {
     str[w] = client.read(); // Читаем каждый символ, и пишем его в массив
   }
     
   // Сравнять массив с строкой будем используя функцию strcmp
//   
//   
//   
     ////// включам и выключаем 1 ногу////////////////

   if (strcmp(str, "Pod:on1") == 0) // Включаем подогрев кнопка нажата
   {
   server.write ("Pod:on1_zd");  // Отправляем сообщение компьютеру
   digitalWrite(7, HIGH);
       }
   else  if (strcmp(str, "Pod:on0") == 0) // Включаем подогрев кнопка отпущена
   {
   server.write ("Pod:on0_zd");  // Отправляем сообщение компьютеру
    digitalWrite(7, LOW);
    }
   
// 
//   
   ///////// проверка соединения////////////////////
    else  if (strcmp(str, "Con") == 0) // Проверка соединения
     {
    server.write ("Con_on");
    }
     
   else
   {
       server.write ("Error command!");
     
    }
  }


if (bouncer.update()) {    //если произошло событие на 3 пине
   K3Ron = 0;
   K3Roff = 0;
   if (bouncer.read()==1) {    //если кнопка нажата
          K3Ron = 1;// если кнопка нажата То назначаем
          K3RS =1;
           }
     else   {
      K3RS =0;
      K3Roff = 1;
     }
   }

 
     
    if (K3Ron >= 1 && K3Ron < 11  )  // отправка данных на комп
      { 
          if (K3Ron == 1) {(interval_Per = interval_1);}
            else (interval_Per = interval_2);
            //проверяем не прошел ли нужный интервал, если прошел то
          if(currentMillis - previousMillis > interval_Per) {
              // сохраняем время последнего переключен
              previousMillis = currentMillis;
              server.write ("On = ");
           
              K3Ron = K3Ron + 1;                           
                }
        }   
   
        if (K3Roff >= 1 && K3Roff < 11  )  // отправка данных на ком
            { 
               if (K3Roff == 1) {(interval_Per = interval_1);}
               else (interval_Per = interval_2);
              //проверяем не прошел ли нужный интервал, если прошел то
                if(currentMillis - previousMillis > interval_Per) {
              // сохраняем время последнего переключен
              previousMillis = currentMillis;
              server.write ("Off = " );
           
           
              K3Roff = K3Roff + 1;                           
                }
        }   

}