byte address = 112;        // adres czujnika
unsigned int manipVar = 0; // zmienna do zmiany danych
byte bytessent = 2 ;       // liczba bajtów do wysłania
byte bytestosend[2] ;      // przygotowanie danych do wysłania
byte command = 0 ;         // przechowywanie poleceń
void setup() {
TWAR = (address << 1) | 0b00000001; // ustawienie adresu i ogólnej odpowiedzi na wywołania
TWCR = 0b01000101; // ustawienie TWEA, TWEN i TWIE na 1
SREG |= 0b10000000; // globalne włączenie przerwań
pinMode(13 , OUTPUT);
} // koniec void setup()
void loop() {
     if (command == 0x50){  // włączenie diody dla polecenia 0x50
       digitalWrite (13 , HIGH);
     }
     if (command == 0x02){ // wyłączenie diody dla polecenia 0x02
       digitalWrite (13 , LOW);
     }
      manipVar++; // główna zmienna do manipulowania dwoma bajtami wyjściowymi
       bytestosend [0] = manipVar;  // przygotowanie starszego i młodszego bajtu zmiennej manipVar
       bytestosend [1] = manipVar >> 8 ; // starszy bajt manipVar
      delay (250); // coś innego do zrobienia podczas oczekiwania
} // koniec void loop()
ISR (TWI_vect){  // procedura obsługi przerwania przypisana do wektora
    if (TWCR & (1 << TWINT)) {  // powtórne sprawdzenie, czy przerwanie jest właściwe  
       if ((TWSR & 0b11111000) == 0x80){ // dane przychodzące
        command = TWDR; // skopiowanie danych polecenia do wykorzystania później
        TWCR = 0b11000100; // reset oryginalnej konfiguracji
       }
       if ((TWSR & 0b11111000) == 0xA8 ) { // żądanie danych wychodzących
         while (bytessent > 0 ){ // wysłanie bajtów do mastera
           bytessent--;
           TWDR = bytestosend [bytessent]; // wysłanie danych od najstarszego do najmłodszego bajtu
           TWCR = 0b11000101; // reset po każdym wysłaniu
           delay (5); // chwilowa pauza po wysłaniu
         }
           if (bytessent == 0 ){ // reset liczby bajtów i jeżeli bufor jest pusty
           bytessent = 2;
           }
       } // koniec if ((TWSR & 0b11111000) == 0xA8 ) 
 TWCR = 0b11000101; // jeszcze jeden reset na wszelki wypadek  
 SREG |= 0b10000000; // włączenie z powrotem przerwań
} // koniec if (TWCR & (1 << TWINT))
} // koniec ISR (TWI_vect)
