ALS-PT19 Lichtsensor mit Arduino auslesen: Helligkeit & UV-Intensität messen

Ein simpler LDR (Fotowiderstand) liefert nur einen groben, stark nichtlinearen Anhaltswert für Helligkeit – und UV-Licht sieht er gar nicht. Der ALS-PT19 misst Umgebungslicht als sauberes analoges Signal und reagiert zusätzlich empfindlich auf UV-Anteile im Spektrum. In diesem Tutorial baust du damit ein automatisches Nachtlicht mit Hysterese und eine Live-Helligkeitsanzeige auf dem OLED-Display.

Warum ALS-PT19 statt einfachem LDR?

Ein klassischer Fotowiderstand (LDR) ändert seinen Widerstand mit der Lichtmenge, aber die Kennlinie ist stark nichtlinear, reagiert träge auf schnelle Lichtwechsel und driftet mit Temperatur und Alterung. Der ALS-PT19 ist stattdessen ein Ambient-Light-Sensor auf Fotodioden-Basis: Er liefert ein deutlich saubereres, schnelleres analoges Spannungssignal, das proportional zur einfallenden Lichtmenge ist – inklusive einer messbaren Empfindlichkeit im UV-Bereich (240–370 nm laut Datenblatt).

Das macht ihn zur guten Wahl für alles, was mehr als nur "hell oder dunkel" braucht: automatische Nachtlichter mit sauberer Schwelle, Belichtungsmessung für Fotoprojekte, UV-Warner für den Balkon oder einfach eine ordentliche Lichtkurve fürs Datenlogging. Der Sensor hat drei Pins (VCC, GND, AO) und lässt sich direkt an einen analogen Eingang anschließen – kein I2C, kein Kalibrieraufwand mit Bibliotheken.

Was du brauchst

Bauteil Menge ca. Preis Link
ALS-PT19 Lichtsensor Modul 1x ab 3,69 € Zum Produkt
UNO R3 Board 1x ab 4,99 € Zum Produkt
0.96 Zoll OLED Display SSD1306 1x (für Projekt 2) ab 2,49 € Zum Produkt
1-Kanal Relais KY-019 1x (für Projekt 3) ab 1,09 € Zum Produkt
3mm LED Sortiment 1 Box (optional als Testlast) ab 4,49 € Zum Produkt
Breadboard 400 Kontakte 1x ab 3,49 € Zum Produkt

Schaltungsaufbau

ALS-PT19 Pin UNO R3 Pin Funktion
VCC 5V Spannungsversorgung
GND GND Masse
AO A0 Analoges Helligkeitssignal (0-1023)

Für Projekt 3 kommt zusätzlich das Relais dazu: IN an Pin 7, VCC an 5V, GND an GND. Für Projekt 2 verbindest du das OLED-Display wie gewohnt per I2C (SDA an A4, SCL an A5) – siehe auch unser OLED-SSD1306-Tutorial.

Code 1: Rohwerte auslesen und kalibrieren

Bevor du mit festen Schwellwerten arbeitest, solltest du dir ein Gefühl für die Werte in deiner Umgebung verschaffen. Dieser Sketch gibt den Rohwert sowie einen geglätteten Mittelwert über die serielle Konsole aus.

const int PIN_ALS = A0;
const int ANZAHL_MESSUNGEN = 10;

void setup() {
  Serial.begin(9600);
}

int gemittelterWert() {
  long summe = 0;
  for (int i = 0; i < ANZAHL_MESSUNGEN; i++) {
    summe += analogRead(PIN_ALS);
    delay(5);
  }
  return summe / ANZAHL_MESSUNGEN;
}

void loop() {
  int rohwert = analogRead(PIN_ALS);
  int geglaettet = gemittelterWert();
  float prozent = (geglaettet / 1023.0) * 100.0;

  Serial.print("Rohwert: ");
  Serial.print(rohwert);
  Serial.print("  |  Geglaettet: ");
  Serial.print(geglaettet);
  Serial.print("  |  Helligkeit: ");
  Serial.print(prozent, 1);
  Serial.println(" %");

  delay(300);
}

So funktioniert's

Der ALS-PT19 liefert ein leicht verrauschtes Analogsignal, besonders bei künstlichem Licht mit PWM-Dimmern oder Flackern der Netzfrequenz. Die Mittelung über ANZAHL_MESSUNGEN Samples glättet das Signal spürbar, ohne die Reaktionszeit merklich zu verschlechtern. Notiere dir die Werte für "stockdunkel" und "hell beleuchtet" in deiner Umgebung – die brauchst du für Projekt 3.

Code 2: Live-Anzeige mit Balkendiagramm auf dem OLED

Statt Zahlen in der Konsole zu lesen, zeigt dieser Sketch die aktuelle Helligkeit als Balken auf dem Display – praktisch für die Kalibrierung direkt am Aufstellort.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

const int PIN_ALS = A0;

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
}

void loop() {
  int wert = analogRead(PIN_ALS);
  int balkenBreite = map(wert, 0, 1023, 0, 118);

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.print("Helligkeit: ");
  display.print(map(wert, 0, 1023, 0, 100));
  display.println(" %");

  display.drawRect(4, 20, 120, 18, SSD1306_WHITE);
  display.fillRect(5, 21, balkenBreite, 16, SSD1306_WHITE);

  display.setCursor(0, 46);
  display.print("Rohwert: ");
  display.println(wert);

  display.display();
  delay(150);
}

Die Funktion map() skaliert den Rohwert (0-1023) direkt auf die Balkenbreite in Pixeln (0-118) sowie auf eine Prozentanzeige. So siehst du sofort, wie sich Handbewegungen über dem Sensor oder Lichtquellen auf den Messwert auswirken.

Code 3: Automatisches Nachtlicht mit Hysterese

Ohne Hysterese würde ein Relais bei einem Helligkeitswert genau an der Schwelle ständig an- und ausflackern, sobald der Sensorwert leicht schwankt. Dieser Sketch verwendet zwei getrennte Schwellwerte, um das zu vermeiden.

const int PIN_ALS = A0;
const int PIN_RELAIS = 7;

const int SCHWELLE_EIN = 200;   // unterhalb dieses Werts: Licht an
const int SCHWELLE_AUS = 350;   // oberhalb dieses Werts: Licht aus

bool lichtIst_An = false;

void setup() {
  pinMode(PIN_RELAIS, OUTPUT);
  digitalWrite(PIN_RELAIS, LOW);
  Serial.begin(9600);
}

void loop() {
  int helligkeit = analogRead(PIN_ALS);

  if (!lichtIst_An && helligkeit < SCHWELLE_EIN) {
    lichtIst_An = true;
    digitalWrite(PIN_RELAIS, HIGH);
    Serial.println("Es wird dunkel -> Licht AN");
  } else if (lichtIst_An && helligkeit > SCHWELLE_AUS) {
    lichtIst_An = false;
    digitalWrite(PIN_RELAIS, LOW);
    Serial.println("Es wird hell -> Licht AUS");
  }

  delay(500);
}

Passe SCHWELLE_EIN und SCHWELLE_AUS anhand der Werte aus Code 1 an deine Umgebung an. Der Abstand zwischen beiden Schwellen ist die Hysterese-Breite – je größer, desto unempfindlicher gegen kurzzeitige Lichtwechsel (z. B. ein vorbeifahrendes Auto nachts).

Häufige Fehler

⚠️ Werte springen stark: Fast immer verursacht durch flackerndes Kunstlicht (PWM-gedimmte LEDs, Energiesparlampen). Erhöhe ANZAHL_MESSUNGEN in Code 1 oder füge einen kleinen Kondensator (100nF) zwischen AO und GND ein.

⚠️ Relais schaltet ständig ein/aus: Die Hysterese-Breite in Code 3 ist zu klein. Vergrößere den Abstand zwischen SCHWELLE_EIN und SCHWELLE_AUS.

⚠️ Sensor liefert immer ~1023 oder ~0: Prüfe die Verkabelung von VCC und GND – vertauschte Anschlüsse führen oft zu einem dauerhaften Extremwert statt zu Schäden am Modul.

💡 Baue dein eigenes Lichtprojekt

Alle Bauteile für dieses Projekt findest du bei makeroo.

Kombiniere den Sensor mit unserem Relais-Tutorial für eigene Schaltautomatiken.

Fazit

Der ALS-PT19 liefert saubere, schnelle Helligkeitswerte und deckt zusätzlich UV-Licht ab – für deutlich mehr als ein einfacher LDR. Von der reinen Kalibrierung über die Live-Anzeige bis zum automatischen Nachtlicht mit Hysterese zeigen die drei Codebeispiele, wie du ihn zuverlässig in eigenen Projekten einsetzt.

Zurück zum Blog