Lightkeeper is een klein projectje dat binnen twee dagen met een paar uurtjes werk 'van de grond' is gekomen.
Ik had een LED paneel over die uit een systeemplafond komt. en ik dacht, is het niet leuk om hier een lichtsensor op te plakken..
De lichtsensor meet de lichtval op het bureauoppervlak en indien er te weinig licht op het bureau aanwezig is wordt de lamp feller, is er teveel licht aanwezig dan dimt de lamp.
Ook heb ik er een klap sensor aan toegevoegd om de lamp aan en uit te kunnen schakelen.
Dit is mijn eerste projectje waar ik een 'PCB' maak en transistors gebruik.
In de code staat een hele regeling waarmee de lamp feller of dimmer wordt door een vergelijking te maken met de gemeten lichtsterkte en de gewenste lichtsterkte.
Indien het verschil groot is stelt de lamp ook sneller bij dan wanneer het verschil klein is.
C++ code; (Code is gemaakt om snel te werken, niet om overzichtelijk te zijn ;) (klapsensor is een nevensysteem aangesloten op ONpin(2)) ..
//LightKeeper
const int led1 = 9;
const int led2 = 10;
const int ledpin = 13; //debugled
const int ONpin = 2;
int ledstate = LOW; //debugled
unsigned int x = 0;
unsigned int y = 0;
long sensorvalue;
long probeamount = 1;
boolean execute = true;
boolean ONstatus = true;
int setpoint = 400; //setpoint for light.
void setup() {
Serial.begin(9600);
pinMode(ONpin, INPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(ledpin, OUTPUT);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
}
void loop() {
if(ONstatus == true){
measurelight(); }
serialplotter();
onoroff();
if(execute == true){
if ( sensorvalue > setpoint && x > 0 ) { x=x-1; delay(10); }
if ( sensorvalue < setpoint && x < 255 ) { x=x+1; delay(10); }
ledstatus(); //debugled
}else{ ledstate = LOW; digitalWrite(ledpin, ledstate);}
analogWrite(led1,x);
analogWrite(led2,x);
}
void measurelight(){
sensorvalue = analogRead(A0);
execute = true;
if((setpoint - sensorvalue) > 100){probeamount = 1;} else if((setpoint - sensorvalue) > 30){probeamount = 500;} //When it's too dark. Adjust measurment accuracy.
else if((sensorvalue - setpoint) > 100){probeamount = 1;} else if((sensorvalue - setpoint) > 10){probeamount = 500;} //When it's too light. Adjust measurment accuracy.
else{probeamount = 1000; execute = false;}
sensorvalue = 0;
for (long i = 0; i < probeamount; i++){
sensorvalue = (sensorvalue + analogRead(A0));
}
sensorvalue = sensorvalue / probeamount;
}
void serialplotter(){
Serial.print("sensor = ");
Serial.print(sensorvalue);
Serial.print("\t setpoint = ");
Serial.print(setpoint);
Serial.print("\t output = ");
Serial.println(x);
}
void onoroff(){
if(digitalRead(ONpin) == LOW){ONstatus = false;}else{ONstatus = true;}
if(ONstatus == false){
if(x == 0){execute = false;}
if(x > 0){ execute = true; sensorvalue = (setpoint + 1); x = x-1;}
}else{}
}
void ledstatus(){ //debugled
if(x == 255 || x == 0){ledstate = HIGH;}else{
// if the LED is off turn it on and vice-versa:
if (ledstate == LOW) {
ledstate = HIGH;
} else {
ledstate = LOW;
}
}
digitalWrite(ledpin, ledstate);
}
^ 'Loggen' wat de regeling doet.