// ===========================================================================
//
// lightsensor.c
//
// Demonstriert die Ansteuerung des Lichtsensors
//
// ===========================================================================
#include <dsensor.h>
#include <dbutton.h>
#include <unistd.h>
#include <conio.h>
#define buttonpressed() (PRESSED(dbutton(),BUTTON_PROGRAM))
#define buttonreleased() (RELEASED(dbutton(),BUTTON_PROGRAM))
#define waitbutton() { while (!buttonpressed()) msleep(50); \
while (!buttonreleased()) msleep(50); }
volatile int lightlow=0;
volatile int lighthigh=100;
volatile int lightstatus=1;
// ---------------------------------------------------------------------------
//
// void initlight(void)
// void donelight(void)
//
// Aktiviert und deaktiviert den Lichtsensor.
//
// ---------------------------------------------------------------------------
void initlight(void)
{
ds_active(&SENSOR_2);
msleep(100);
}
void donelight(void)
{
ds_passive(&SENSOR_2);
}
// ---------------------------------------------------------------------------
//
// int readlightvalue(char *msg)
//
// Dient dazu, Helligkeitswerte mit Benutzerinteraktion einzugeben. Zuerst
// wird der Text msg im Display ausgegeben. Nach einer Pause erscheint der
// aktuelle Wert des Lichtsensors. Wenn der Benutzer mit dem Wert
// einverstanden ist, bestätigt er mit der PRGM-Taste die Eingabe.
// Rückgabe der Funktion ist der zuletzt gelesene Wert.
//
// ---------------------------------------------------------------------------
int readlightvalue(char *msg)
{
int value;
value=0;
cputs(msg);
msleep(1000);
while (!buttonpressed()) {
value=LIGHT_2;
lcd_int(value);
msleep(100);
}
cputs("ok");
while(!buttonreleased()) ;
cls();
return(value);
}
// ---------------------------------------------------------------------------
//
// void calibratelight(void)
//
// Fragt vom Benutzer die Werte für Hell und Dunkel ab und berechnet
// daraus die internen Schwellwerte.
//
// ---------------------------------------------------------------------------
void calibratelight(void)
{
int low,high;
do {
low=readlightvalue("dark");
high=readlightvalue("ligh");
} while (!(low+8<=high));
lightlow=low+((high-low)*1)/5;
lighthigh=low+((high-low)*4)/5;
lightstatus=1;
}
// ---------------------------------------------------------------------------
//
// int lightsensor(void)
//
// Liefert den aktuellen Wert des Lichtsensors, 0=dunkel, 1=hell. Es wird
// dabei das Hystereseverfahren als Filter benutzt (siehe oben).
//
// ---------------------------------------------------------------------------
int lightsensor(void)
{
int value;
value=LIGHT_2;
if (value<100) {
if ((lightstatus==0) && (value>=lighthigh)) lightstatus=1;
if ((lightstatus==1) && (value<=lightlow)) lightstatus=0;
}
return(lightstatus);
}
int main(void)
{
initlight();
calibratelight();
waitbutton();
while (1) {
lcd_int(lightsensor());
msleep(200);
}
donelight();
return(0);
}