Falls der Arduino nichts weiter zu tun hat, als auf den Alarm zu warten und dann das Relais für eine kurze Dauer einzuschalten, dann kann folgendes einfaches Programm funktionieren (eventuell musst du es noch ein wenig anpassen):
// Schalten eines Relais bei "Alarm"
//
// Falls ein 'A' über die serielle Schnittstelle empfangen wird,
// wird ein LDR ausgewertet. Bei "Dunkelheit" wird der "relaisPin"
// für eine bestimmte Dauer auf LOW geschalten.
const int ldrSchwellwert = 200; // Wert wurde "experimentell" für meinen LDR ermittelt
const int stromstossDauer = 400; // gewünschte Stromstoß-Dauer (Millisekunden)
const byte relaisPin = 3;
const byte ldrPin = A0;
void setup() {
Serial.begin(9600);
digitalWrite(relaisPin, HIGH); // Das Relais-Modul ist "active LOW". Dies ist ein "Trick", damit es bei Reset nicht einschaltet.
pinMode(relaisPin, OUTPUT);
}
void loop() {
if (Serial.available()) { // wenn Zeichen auf der seriellen Schnittstelle empfangen wurden...
int inbyte = Serial.read(); // ein Zeichen lesen
if (inbyte == 'A') { // falls das Zeichen ein A ist...
if (analogRead(ldrPin) < ldrSchwellwert) { // LDR auswerten und falls es "dunkel" ist, das Relais schalten:
digitalWrite(relaisPin, LOW); // Relais EIN
delay(stromstossDauer);
digitalWrite(relaisPin, HIGH); // Relais AUS
}
}
}
}
Zur beachten ist: Dieser Sketch verwendet "delay". Das bedeutet, dass während dieser Zeit (im Beispiel: 400 Millisekunden) das Board "blockiert" ist. Es wird dabei einfach die Zeit "totgeschlagen" und es kann auf nichts reagiert werden. In manchen Fällen ist das überhaupt kein Problem, in anderen aber schon. Falls also der Arduino sonst nichts zu tun hat, ist das OK.
Den LDR anschließen:
Arduino 5V Pin ------------------------+
|
___|___
| L D R |
-------
|
|
Arduino Pin A0 ------------------------+
|
_
| |
| | R (z.B. 10...20kOhm)
|_|
|
Arduino GND Pin -----------------------+
ldrSchwellwert musst du auf deine Gegebenheiten (deinen LDR) anpassen.
Werte meines LDR (Typ unbekannt) mit 10k als Spannungsteiler:
335 ... 380 Deckenlampe eingeschaltet
80 Beschattung des LDR mit Handfläche
kleiner 50 Deckenlampe aus ("es ist ziemlich dunkel")
800 Beleuchtung des LDR mit Taschenlampe
Ich habe 200 gewählt, weil dieser Wert deutlich unter dem Wert für "Deckenlampe ein" liegt und deutlich über "Abschattung" bzw. "Dunkelheit". Mit deinem LDR ist möglicherweise ein anderer Wert nötig.
Konsolen-Kommando (bzw. bat-Datei) für Windows zum Aktivieren des Relais über die serielle Schnittstelle ausgehend von folgender Konfiguration:
- Arduino hängt auf COM3
- COM3 läuft mit 9600 Baud
echo Alarm > COM3
Hinweis: das funktioniert zuverlässig mit niedrigen Port-Nummern (unter 10). Bei höheren Nummern ist folgendes erfolgversprechend (Stichwort: kompletter "Dateiname") - Beispiel: COM23
echo Alarm > \\.\COM23
Natürlich geht auch folgendes, weil ja nur auf das 'A' reagiert wird:
echo A > COM3
Folgendes funktioniert aber NICHT, weil ja ein großes A nötig ist:
echo a > COM3
Anzeige der aktuellen COM-Port-Einstellungen:
mode COM3
Die wesentlichste Einstellung ist die Baudrate. Diese muss 9600 betragen.
Falls COM3 konfiguriert werden muss, so geht das auf der Kommandozeile (bzw. bat-Datei) z.B. so:
Umstellen auf 9600 Baud:
mode COM3: baud=9600
Einstellen mehrer Parameter:
mode com3: baud=9600 parity=n data=8 stop=1
Um ein Reset beim Öffnen/Schließen der seriellen Schnittstelle zu verhindern wird (zum Beispiel) ein Elko gebraucht (wurde schon erwähnt - Minus auf "GND", Plus auf "Reset").
Zum Programmieren (Aufspielen des Sketch auf den Arduino) muss dieser Elko aber entfernt werden.