Wat je nodig hebt
-
Je 1.44" TFT-scherm, aangesloten zoals in project 01. Laat het gewoon zitten.
-
Je 0.96" OLED-schermpje, aangesloten zoals in de OLED-start — vier draadjes via I2C. Laat het gewoon zitten.
-
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. -
Drie dupont-draadjes.
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.
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.
- VCC
- Voeding, 5V.
- GND
- De min / 0 volt.
- OUT
- De digitale uitgang: hoog of laag, afhankelijk van of er iets voor zit.
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.
| Sensor | Naar je Arduino | Draad |
|---|---|---|
| VCC | 5V | rood |
| GND | GND | zwart |
| OUT | D5 | teal |
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:
#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);
}
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.
#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.
#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;
}
}
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.
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.
De hele sketch — de teller staat groot in beeld en gaat omhoog bij elke flank:
#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.
#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
}
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.
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.
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.