Simple autodimmer program with ldr. Calibration is done by setting minimum and maximum brightness. Linear interpolation is used to calculate pwm-output value. AutoDimmer o'lux + Set maximum brightness - Set minimum brightness t Test current settings a Enable/Disable AutoDimmer o'lux

Dependencies:   mbed

Revision:
0:69c5332e36da
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Dec 05 11:50:05 2010 +0000
@@ -0,0 +1,95 @@
+/*  Simple program for reading ldr.
+ *  1. Read min and max values
+ *  2. test values to output
+ *  3. Use autodimmer to autodim :)
+ *  
+ *  If you don't have a ldr, you could use a linear variable resistor. etc.
+ *  - Juha Viitanen, 5.12.2010, viidakkovekara@gmail.com
+ */
+
+
+#include "mbed.h"
+
+Serial pc(USBTX, USBRX); // tx, rx
+
+PwmOut led(LED1);
+PwmOut led2(LED2);
+PwmOut led3(LED3);
+PwmOut led4(LED4);
+AnalogIn ldr(p20);
+
+static int activate = 0;
+static float min, max;
+float output, reading;
+
+char c;
+
+// aka. linear interpolation
+float outputCalculation(float reading, float min, float max) {
+    return 1.0-(reading-min)*((1.0-0.0)/(max-min));
+}
+
+float rc_filter(float input) {
+    static float Old_input=0;
+    float AB=255.0;
+    float result=0,temp_result=0;
+    unsigned char B=AB-100.0;
+
+    result=input;
+    Old_input = ((input*100.0)/AB) + ((Old_input*B)/AB);
+    temp_result=temp_result+Old_input;
+
+    return temp_result;
+}
+
+int main() {
+    pc.baud(115200);
+    pc.printf("AutoDimmer o'lux\n\r+ Set maximum brightness\n\r- Set minimum brightness\n\rt Test current settings\n\ra Enable/Disable AutoDimmer o'lux\n\r");
+
+    while (1) {
+
+        if (activate == 1) {
+            reading = ldr.read();
+            if (reading < min)
+                reading = min;
+            else if (reading >= max)
+                reading = max;
+            output = outputCalculation(reading, min, max);
+            led = rc_filter(output);
+        }
+
+        if (pc.readable())
+            c = pc.getc();
+        else
+            c = 0;
+
+        switch (c) {
+            case 't':
+                pc.printf("Testing current settings\n\r");
+                reading = ldr.read();
+                if (reading < min)
+                    reading = min;
+                else if (reading >= max)
+                    reading = max;
+                output = outputCalculation(reading, min, max);
+                pc.printf("ldr %f\n\r", output);
+                led = output;
+                break;
+            case '+':
+                max = ldr.read();
+                pc.printf("max ldr value set to: %f\n\r",max);
+                break;
+            case '-':
+                min = ldr.read();
+                pc.printf("min ldr value set to: %f\n\r",min);
+                break;
+            case 'a':
+                if (activate != 0)
+                    pc.printf("Autodimming disabled\n\r");
+                else if (activate == 0)
+                    pc.printf("Autodimming enabled\n\r");
+                activate ^= 1;
+                break;
+        }
+    }
+}
\ No newline at end of file