Real-Time and Embedded Systems

Listing von lightsensor.c

// ===========================================================================
//
//   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);
}