// groeilampen.ino - de groeilampen van de klimaatmodule dimmen met PWM (Arduino Mega) // Daglicht: LDR onder een kapje op A1, 1,0 kOhm naar GND (hoofdstuk 22). Lampen: IRLZ44N op D5 (490 Hz). const int LDR = A1; const int LAMPEN = 5; const float R_VAST = 1000.0; // ohm const float KAPJE = 0.10; // het kapje laat 10 % door const float DOEL = 200.0; // umol/(m2 s) op het kweekbed: daglicht + lampen samen const float LAMPEN_VOL = 200.0; // wat de twee lampen op 100 % geven const float LUX_PER_UMOL = 54.0; // zonlicht const unsigned long DAG_MS = 24UL * 3600UL * 1000UL; int stand = 0; // huidige PWM-waarde, 0 tot 255 unsigned long vorige = 0; float daglichtLux() { int n = analogRead(LDR); if (n < 1) n = 1; // niet delen door nul in het donker float r = R_VAST * (1024.0 - n) / n; // weerstand van de LDR (spanningsdeler omgekeerd) float eLdr = 10.0 * pow(r / 15000.0, -1.0 / 0.7); // lux op de LDR (model uit hoofdstuk 22) return eLdr / KAPJE; // lux daglicht } int uurVanDeDag() { // eenvoudige klok: het programma start om 6 uur (echte klok: hoofdstuk 30) return (6 + (millis() % DAG_MS) / 3600000UL) % 24; } void setup() { pinMode(LAMPEN, OUTPUT); analogWrite(LAMPEN, 0); Serial.begin(9600); } void loop() { unsigned long nu = millis(); if (nu - vorige < 200) return; // vijf keer per seconde bijregelen vorige = nu; int doelStand = 0; int uur = uurVanDeDag(); if (uur >= 6 && uur < 22) { // lichtperiode van 16 uur float dag = daglichtLux() / LUX_PER_UMOL; // daglicht in umol/(m2 s) float f = constrain((DOEL - dag) / LAMPEN_VOL, 0.0, 1.0); doelStand = (int)(f * 255 + 0.5); } // zacht bijregelen: hoogstens 1 stap per 200 ms (van 0 naar 255 in 51 s) if (doelStand > stand) stand++; else if (doelStand < stand) stand--; analogWrite(LAMPEN, stand); if (nu % 60000UL < 200) { // eens per minuut melden Serial.print("uur "); Serial.print(uur); Serial.print(", PWM "); Serial.println(stand); } }