ARDUINO WERKPLAATS
◂ extra sensor-project · bouwt voort op Project 02 Project 05 · de IR-sensor

Een knop
zonder aanraken.

De afstandssensor mat hoe ver iets is. Deze sensor doet iets anders: hij zegt alleen "er zit iets voor mij" of niet — als een schakelaar die je met je hand bedient zonder aan te raken. We bouwen er een contactloze teller mee.

Sensor: IR Flying-Fish Type: aan / uit Nieuw: flankdetectie ~30 min
Welk bord gebruik je?
De sensor gebruikt één digitale pin — gelijk op beide borden. Je scherm blijft aangesloten zoals je het al had.
Welk scherm gebruik je?
Alle sketches op deze pagina wisselen mee naar het scherm dat jij hebt.
0

Wat je nodig hebt

  • 1.44 inch TFT-scherm Je 1.44" TFT-scherm, aangesloten zoals in project 01. Laat het gewoon zitten.
  • 0.96 inch OLED-schermpje Je 0.96" OLED-schermpje, aangesloten zoals in de OLED-start — vier draadjes via I2C. Laat het gewoon zitten.
  • Flying-Fish IR-obstakelsensor De IR-obstakelsensor: het smalle blauwe printje met twee losse ronde IR-LED'jes naast elkaar (één zwart, één helder), een blauwe potmeter en drie pinnen: VCC · GND · OUT. Zie de onderdelenpagina.
  • dupont-draadjes Drie dupont-draadjes.
Pak je wel het goede printje? In de bak ligt een lijnvolger die er bijna hetzelfde uitziet: ook blauw, en er staat óók MH-Sensor-Series op. Kijk daarom niet naar de tekst maar naar dit: de sensor die je nu nodig hebt heeft 3 pinnen en twee losse ronde ledjes. De lijnvolger heeft er 4 (met een A0) en één zwart blokje waar beide oogjes in zitten — die heb je nodig in project 07.

→ De twee naast elkaar op de onderdelenpagina

Het nieuwe concept van dit project Deze sensor geeft maar twee mogelijke antwoorden (aan/uit). Het nieuwe dat je leert is flankdetectie: niet reageren op de toestand, maar op het moment dat die verandert — precies wat je nodig hebt om dingen te tellen.
1

Meten met onzichtbaar licht

De sensor heeft twee "oogjes". Het zwarte LED-je zendt onzichtbaar infrarood licht uit. Zit er iets vlak voor de sensor, dan kaatst dat licht terug in het heldere oogje (de ontvanger). De sensor merkt die weerkaatsing en zet zijn OUT-pin om. Met de potmeter stel je in vanaf hoe dichtbij hij reageert.

zwart helder sensor je hand IR uit → ← weerkaatsing weerkaatsing gezien → OUT schakelt
Geen exacte afstand zoals de HC-SR04 — alleen iets ervoor of niet.
VCC
Voeding, 5V.
GND
De min / 0 volt.
OUT
De digitale uitgang: hoog of laag, afhankelijk van of er iets voor zit.
2

De sensor aansluiten

Maar drie draadjes. We gebruiken digitale pin D5 voor OUT — die is nog vrij naast al je andere onderdelen, en gelijk op de Uno R4 en de Mega.

IR-sensor Arduino Uno R4 VCC5V GNDGND OUTD5
Drie draadjes — de pin is op beide borden gelijk.
SensorNaar je ArduinoDraad
VCC5Vrood
GNDGNDzwart
OUTD5teal
Onthoud van project 01 Je TFT-scherm blijft op D8/D9/D10 plus de klok/data-pinnen zitten. Op de R4 zijn dat D13/D11. D5 komt daar los naast — ze bijten elkaar niet.
Onthoud van de OLED-start Je OLED gebruikt alleen de I2C-pinnen SDA/SCL (of A4/A5) plus 5V en GND. D5 blijft dus gewoon vrij voor de sensor — ze bijten elkaar niet.
3

Afstellen & testen

Op het printje zitten twee LED-lampjes: één voor de voeding (altijd aan) en één die aangaat zodra er iets gedetecteerd wordt. Draai aan de potmeter tot de sensor reageert op de afstand die jij wilt (meestal een paar cm tot ~20 cm).

Test daarna in de Serial Monitor welke waarde "iets ervoor" is — dat verschilt per module:

01_ir_test.ino
#define IR 5

void setup() {
  Serial.begin(9600);
  pinMode(IR, INPUT);
}

void loop() {
  int staat = digitalRead(IR);      // 1 (HIGH) of 0 (LOW)
  Serial.println(staat);
  delay(150);
}
Belangrijk: welke kant op? Bij de meeste van deze modules wordt OUT LAAG (0) zodra er iets voor zit, en is hij HOOG (1) in het niets. Zie je bij jou het omgekeerde? Geen probleem — onthoud gewoon welk getal "object" betekent; in de code hieronder pas je dat op één plek aan.
4

Vrij of bezet op het scherm

Eerst iets simpels: het scherm toont groot VRIJ als er niets voor zit, en OBJECT! zodra je je hand ervoor houdt. Zo zie je meteen of alles werkt.

VRIJ OBJECT!
Twee toestanden, groot en duidelijk in beeld.
02_vrij_of_object.ino
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>

#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
#define IR 5

#define OBJECT LOW      // <-- verander in HIGH als jouw sensor omgekeerd werkt (stap 3)

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

int vorige = -1;        // om alleen te tekenen bij verandering

void setup() {
  pinMode(IR, INPUT);
  tft.initR(INITR_144GREENTAB);
  tft.fillScreen(ST77XX_BLACK);
}

void loop() {
  int staat = digitalRead(IR);

  if (staat != vorige) {            // alleen hertekenen als er iets verandert
    tft.fillScreen(ST77XX_BLACK);
    tft.setTextSize(3);
    tft.setCursor(20, 55);
    if (staat == OBJECT) {
      tft.setTextColor(ST77XX_RED);
      tft.print("OBJECT");
    } else {
      tft.setTextColor(ST77XX_GREEN);
      tft.print("VRIJ");
    }
    vorige = staat;
  }
}

Eerst iets simpels: het scherm toont groot VRIJ als er niets voor zit, en OBJECT zodra je je hand ervoor houdt. Kleur heb je niet op de OLED — daarom draaien we het beeld om: bij "object" maken we het hele schermpje wit met zwarte letters. Dat springt net zo hard in het oog als rood.

VRIJ OBJECT
Links "vrij" (wit op zwart), rechts "object" — het beeld staat in de inverse. Het schermpje is maar 128 × 64 pixels.
02_vrij_of_object_oled.ino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define IR 5

#define OBJECT LOW      // <-- verander in HIGH als jouw sensor omgekeerd werkt (stap 3)

Adafruit_SSD1306 oled(128, 64, &Wire, -1);

int vorige = -1;        // om alleen te tekenen bij verandering

void setup() {
  pinMode(IR, INPUT);
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);   // adres 0x3C (soms 0x3D)
}

void loop() {
  int staat = digitalRead(IR);

  if (staat != vorige) {            // alleen hertekenen als er iets verandert
    oled.clearDisplay();            // kladblok leeg
    oled.setTextSize(3);            // 3 = letters van 18 x 24 pixels

    if (staat == OBJECT) {
      oled.fillRect(0, 0, 128, 64, SSD1306_WHITE);  // hele schermpje wit
      oled.setTextColor(SSD1306_BLACK);             // zwarte letters erop
      oled.setCursor(10, 20);                       // 6 letters = 108 px breed
      oled.print("OBJECT");
    } else {
      oled.setTextColor(SSD1306_WHITE);
      oled.setCursor(28, 20);                       // 4 letters = 72 px breed
      oled.print("VRIJ");
    }

    oled.display();                 // <-- nu pas zichtbaar
    vorige = staat;
  }
}
Even narekenen Bij setTextSize(3) is elke letter 18 pixels breed en 24 hoog. "OBJECT" is 6 letters = 108 pixels; het scherm is 128 breed, dus begin je op x = (128 − 108) ÷ 2 = 10. Verticaal: (64 − 24) ÷ 2 = 20. Zo staat alles netjes in het midden.
5

Tellen met flankdetectie

Nu het slimme deel. Stel je wilt tellen hoe vaak er iets langskomt — als een bezoekersteller bij een deur. Als je gewoon "is er iets?" blijft vragen, telt één hand die er even blijft hangen honderd keer. De oplossing: tel alleen op het moment dat het verandert van vrij naar object. Dat heet een flank.

vrij object +1 +1 +1
Alleen op de overgang vrij→object tel je op — niet zolang de hand blijft hangen.

De hele sketch — de teller staat groot in beeld en gaat omhoog bij elke flank:

03_teller.ino
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>

#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
#define IR 5

#define OBJECT LOW      // pas aan indien nodig (stap 3)

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

int teller = 0;
int vorigeStaat;        // wat de sensor de vorige ronde zei

void toonTeller() {
  tft.fillRect(0, 45, 128, 50, ST77XX_BLACK);
  tft.setCursor(30, 48);
  tft.setTextSize(6);
  tft.setTextColor(ST77XX_CYAN);
  tft.print(teller);
}

void setup() {
  pinMode(IR, INPUT);
  tft.initR(INITR_144GREENTAB);
  tft.fillScreen(ST77XX_BLACK);
  tft.setTextColor(ST77XX_WHITE);
  tft.setCursor(28, 12);
  tft.setTextSize(1);
  tft.print("TELLER");
  vorigeStaat = digitalRead(IR);   // beginwaarde
  toonTeller();
}

void loop() {
  int staat = digitalRead(IR);

  // FLANK: nu een object, net nog niet -> tel op
  if (staat == OBJECT && vorigeStaat != OBJECT) {
    teller++;
    toonTeller();
    delay(50);            // korte ontdubbeling tegen "trillen"
  }

  vorigeStaat = staat;    // onthoud voor de volgende ronde
}

De hele sketch — de teller staat groot in beeld en gaat omhoog bij elke flank. Op de OLED tekenen we telkens het hele kladblok opnieuw en zetten we dat met één oled.display() op het scherm. Dat flikkert niet, want de lezer ziet alleen het eindresultaat.

03_teller_oled.ino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define IR 5

#define OBJECT LOW      // pas aan indien nodig (stap 3)

Adafruit_SSD1306 oled(128, 64, &Wire, -1);

int teller = 0;
int vorigeStaat;        // wat de sensor de vorige ronde zei

void toonTeller() {
  oled.clearDisplay();            // kladblok leeg
  oled.setTextColor(SSD1306_WHITE);

  oled.setTextSize(1);            // kopregel: letters van 6 x 8 pixels
  oled.setCursor(46, 0);
  oled.print("TELLER");

  oled.setTextSize(4);            // het grote getal: 24 x 32 pixels per cijfer
  oled.setCursor(40, 24);
  oled.print(teller);

  oled.display();                 // alles in een keer tonen
}

void setup() {
  pinMode(IR, INPUT);
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  vorigeStaat = digitalRead(IR);  // beginwaarde
  toonTeller();
}

void loop() {
  int staat = digitalRead(IR);

  // FLANK: nu een object, net nog niet -> tel op
  if (staat == OBJECT && vorigeStaat != OBJECT) {
    teller++;
    toonTeller();
    delay(50);            // korte ontdubbeling tegen "trillen"
  }

  vorigeStaat = staat;    // onthoud voor de volgende ronde
}
Waarom deze coördinaten? Het schermpje is maar 64 pixels hoog, dus alles moet compact. De kopregel (setTextSize(1), 8 px hoog) staat bovenaan, het grote getal (setTextSize(4), 32 px hoog) begint op rij 24 — samen 56 px, precies genoeg. Tel je door tot boven de 99? Zet het getal dan op setTextSize(3), dan passen er vier cijfers naast elkaar.
Dit trucje gebruik je overal "Doe iets alleen op het moment van verandering" is dezelfde techniek waarmee je een drukknop uitleest zonder dat één druk als tien telt. Je hebt hem nu in de vingers — handig voor elk knop- of sensor-project.
6

Zelf uitbreiden

  • Maak er een aftelspel van: begin bij 10 en tel af; haal 0 binnen de tijd.
  • Laat het scherm flitsen of een geluidje-idee geven bij elke telling.
  • Bouw een "deur open"-teller die onthoudt hoeveel mensen er langs kwamen sinds het opstarten.
  • Gevorderd: gebruik de IR-sensor als contactloze startknop voor het spel van project 04 — zwaai om te beginnen in plaats van de joystick in te drukken.

Je gereedschapskist groeit

Vijf projecten verder

Je kunt nu een scherm aansturen, afstand meten, een weerstation bouwen, een spel maken én digitale sensoren met flankdetectie uitlezen. Daarmee kun je bijna elk onderdeel uit je kit aan de praat krijgen — de aanpak is steeds dezelfde: aansluiten, uitlezen, en op het scherm tonen.

← Project 04  ·  Alle projecten