Oplossing volloper op I2C

We passen het looplichtprogramma aan door het patroon aan te passen voor een vollopereffect naar links. We hebben ook een tweede patroon nodig om het rechtse effect te realiseren. Merk op dat de arrays nu beide eindigen op 0xFF, zodat na het effect alle leds ook weer zouden gedoofd worden.

Daarna sluiten we drukknoppen aan op pinnen 4 en 5. We kiezen voor 4 en 5 omdat 0 en 1 dienen voor seriële communicatie en we deze optie willen open houden voor het geval we later ons programma willen uitbreiden met seriële communicatie.

Ook pinnen 2 en 3 mogen we niet gebruiken, omdat dit op de Leonardo de I2C pinnen zijn, die extra naar buiten gebracht zijn via SCL en SDA.

We definiëren pinnen 4 en 5 als INPUT_PULLUP. Daarmee wordt intern een pullup weerstand ingeschakeld, die het niveau van de pin met de Vcc verbindt.In normale toestand staat er op deze pinnen dus een hoog niveau. Met de drukknoppen kunnen we dit niveau naar massa trekken, waardoor er een 0 op de ingang komt.

Met een digitalRead() lezen we het niveau van de pin. We kunnen dit niveau inverteren met de !-operator. Daardoor wordt de uitdrukking

if(!digitalRead(4)&&digitalRead(5))

gelezen als: indien drukknop op pin 4 ingedrukt is, en drukknop op pin 5 niet ingedrukt is.

We gebruiken deze voorwaarde om te bepalen dat de ene drukknop ingedrukt is, en de andere niet.

In een tweede if-constructie testen we de omgekeerde situatie.

De volledige oplossing wordt:

#include <Wire.h>

const byte patroonlinks[]={0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00,0xFF};
const byte patroonrechts[]={0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00,0xFF};
void setup() {
  pinMode(4,INPUT_PULLUP);
  pinMode(5,INPUT_PULLUP);
  Wire.begin();
}


void loop() {
  if(!digitalRead(4)&&digitalRead(5)) {
    for(int i=0;i<sizeof(patroonlinks);i++) {
    Wire.beginTransmission(0x38);
    Wire.write(patroonlinks[i]);
    Wire.endTransmission();
    delay(50);
    }
  }
    if(digitalRead(4)&&!digitalRead(5)) {
    for(int i=0;i<sizeof(patroonrechts);i++) {
    Wire.beginTransmission(0x38);
    Wire.write(patroonrechts[i]);
    Wire.endTransmission();
    delay(50);
    }
  }
}