2 Over complicated desk LED dimmer
3 2016-01-10 Dobrica Pavlinusic <dpavlin@rot13.org>
8 const int led_pin = 13;
9 const int buzzer_pin = 4;
10 const int mosfet_pins[] = { 9, 10, 6 }; // PWM pins: 3,5,6,9,10,11
11 const int ldr_pin = A3; // LDR +5 -- A3 -[10K]- GND
12 const int pir_pin = A2;
15 #define TOUCHPAD 1 // set this to 0 if debugging without touchpad
17 int LDR_SIZE = 1; // 1 number of LDR reading to average
18 int LDR_NOISE = 6; // 6 calibrate LDR noise level
19 int LDR_CHANGE = 1; // do we report LDR changes?
21 #define PIR_TIMEOUT 10 // s
25 PS2 mouse(8, 7); // PS2 synaptics clock, data
27 #define TP_LANDSCAPE 0
30 int mosfet_pwm[] = { 1, 1, 1 }; // initial and current state of mosfet pwm
32 void MOSFET_PWM(int i, int pwm) {
33 analogWrite(mosfet_pins[i], pwm);
34 Serial.print("MOSFET=");
43 Serial.println("setup");
45 pinMode(led_pin, OUTPUT);
46 digitalWrite(led_pin, HIGH); // signal reset
48 pinMode(buzzer_pin, OUTPUT);
50 for(int i=0; i<=2; i++) {
51 pinMode(mosfet_pins[i], OUTPUT);
52 analogWrite(mosfet_pins[i], 0);
55 pinMode(ldr_pin, INPUT);
57 pinMode(pir_pin, INPUT);
60 Serial.println("Synaptics touchpad init");
62 mouse.write(0xff); // reset
63 mouse.read(); // ack byte
64 mouse.read(); // blank */
66 mouse.read(); // blank */
67 mouse.write(0xf0); // remote mode -- send motion data only on $EB (read data) command
69 delayMicroseconds(100);
70 mouse.write(0xe8); // set resolution
71 mouse.read(); // ack byte
72 mouse.write(0x03); // rr ( rr * 64 + ss * 16 + tt * 4 + uu == modebyte )
73 mouse.read(); // ack byte
75 mouse.read(); // ack byte
76 mouse.write(0x00); // ss
77 mouse.read(); // ack byte
79 mouse.read(); // ack byte
80 mouse.write(0x01); // tt
81 mouse.read(); // ack byte
83 mouse.read(); // ack byte
84 mouse.write(0x00); // uu
85 mouse.read(); // ack byte
86 mouse.write(0xf3); // set samplerate 20 (stores mode)
87 mouse.read(); // ack byte
89 mouse.read(); // ack byte
90 delayMicroseconds(100);
94 Serial.print("Commands: b - beep, qwe/asd/zxc - MOSFETs, hjkl - single step fade, ui/op/[/] - LDR size-+/noise-+/read/changes, P - PIR\nLDR = ");
95 int ldr = analogRead(ldr_pin);
98 for(int i=0; i<=2; i++) {
99 analogWrite(mosfet_pins[i], 1);
101 int ldr = analogRead(ldr_pin);
103 analogWrite(mosfet_pins[i], 0);
106 // recall startup values
107 for(int i=0; i<=2; i++) {
108 int pwm = EEPROM.read(i);
110 analogWrite(mosfet_pins[i], pwm);
113 digitalWrite(led_pin, LOW);
117 void mosfet(int nr, int value) {
118 int pwm = mosfet_pwm[nr];
119 if ( pwm == value ) {
120 Serial.println("ignored");
123 int sleep = 200 / abs(pwm - value); // changes bigger than 200 (on/off) will be instant
124 int step = pwm < value ? 1 : -1;
125 for(int i=pwm + step; i != value; i += step) {
127 analogWrite(mosfet_pins[nr], i);
130 MOSFET_PWM(nr, value);
131 mosfet_pwm[nr] = value;
135 unsigned int last_cx = 0;
136 unsigned int last_cy = 0;
139 static int ldr_sum = 0;
140 static int ldr_count = 0;
143 long int pir_millis = millis();
145 int vi_nr = 0; // mosfet to fade with vi binadings
154 byte mx; //x coordinate
155 byte my; //y coordinate
156 byte mz; //z pressure value
160 mouse.write(0xeb); // read data
163 mstat1 = mouse.read();
166 mstat2 = mouse.read();
171 // collect the bits for x and y
172 cx = (((mstat2 & 0x10) << 8) | ((mxy & 0x0F) << 8) | mx ); // 1100-5800
173 cy = (((mstat2 & 0x20) << 7) | ((mxy & 0xF0) << 4) | my ); // 800-5000
175 if ( last_cx != cx || last_cy != cy ) {
179 Serial.print(cx, DEC);
180 Serial.print("\tY=");
181 Serial.print(cy, DEC);
182 Serial.print("\tZ=");
183 Serial.print(mz, DEC);
184 if ( cx > 1100 && cy > 800 ) {
186 int nr = ( cx - 1100 ) / (( 5800 - 1100 ) / 3);
187 int pwm = ( cy - 800 ) / (( 5000 - 800 ) / 255);
189 int pwm = ( cx - 1100 ) / (( 5800 - 1100 ) / 255);
190 int nr = ( cy - 800 ) / (( 5000 - 800 ) / 4);
191 if ( nr > 2 ) nr -= 1; // 0 [ 1 2 ] 3 -> 0 1 2
193 pwm -= 1; // allow off
194 Serial.print("\tmosfet = ");
196 Serial.print("\tpwm = ");
198 if ( nr >= 0 && nr <= 2 && pwm >= 0 && pwm <= 255 ) {
199 Serial.println("\tOK");
201 mosfet_pwm[nr] = pwm;
203 Serial.println("\tIGNORED");
210 int ldr = analogRead(ldr_pin);
213 if ( ldr_count > LDR_SIZE ) {
214 ldr = ldr_sum / ldr_count;
218 if ( abs(ldr-last_ldr) > LDR_NOISE && LDR_CHANGE ) {
219 Serial.print("LDR = ");
221 last_ldr = ( last_ldr + ldr ) / 2;
226 int pir = digitalRead(pir_pin);
227 if ( pir != last_pir) {
229 Serial.print("PIR = ");
233 long int ms = millis();
235 if (pir_millis > 0 && ms - pir_millis > PIR_TIMEOUT * 1000 ) {
236 Serial.println("PIR timeout, fade-out");
237 pir_millis = -1; // mark that we are in timeout
238 for(int i=0; i<=2; i++) {
243 if (pir_millis < 0) {
244 Serial.println("PIR fade-in after timeout");
245 for(int i=0; i<=2; i++) {
246 MOSFET_PWM(i, mosfet_pwm[i]);
253 if (Serial.available()) {
254 digitalWrite(led_pin, HIGH);
255 int in = Serial.read();
258 tone(buzzer_pin, 1800, 100);
260 tone(buzzer_pin, 2200, 100);
263 case 'q': mosfet(0, 255); break;
264 case 'a': mosfet(0, 127); break;
265 case 'z': mosfet(0, 0); break;
266 case 'w': mosfet(1, 255); break;
267 case 's': mosfet(1, 127); break;
268 case 'x': mosfet(1, 0); break;
269 case 'e': mosfet(2, 255); break;
270 case 'd': mosfet(2, 127); break;
271 case 'c': mosfet(2, 0); break;
274 case 'h': vi_nr = ( vi_nr - 1 + 3 ) % 3; Serial.println(vi_nr); break;
275 case 'j': mosfet(vi_nr, (mosfet_pwm[vi_nr]-1+255)%255 ); break;
276 case 'k': mosfet(vi_nr, (mosfet_pwm[vi_nr]+1)%255 ); break;
277 case 'l': vi_nr = ( vi_nr + 1 ) % 3; Serial.println(vi_nr); break;
280 case 'u': LDR_SIZE -= 1; Serial.println(LDR_SIZE); break;
281 case 'i': LDR_SIZE += 1; Serial.println(LDR_SIZE); break;
282 case 'o': LDR_NOISE -= 1; Serial.println(LDR_NOISE); break;
283 case 'p': LDR_NOISE += 1; Serial.println(LDR_NOISE); break;
284 case '[': Serial.println(ldr); break;
285 case ']': LDR_CHANGE = ! LDR_CHANGE; break;
287 case 'P': Serial.println(pir); break;
290 for(int i=0; i<3; i++) EEPROM.write(i, mosfet_pwm[i]);
291 Serial.println("EEPROM store brightness");
295 m1 = (m1 + 10) % 255;
296 analogWrite(mosfet1_pin, m1);
297 Serial.print("MOSFET 1 = ");
301 m1 = (m1 - 10) % 255;
302 analogWrite(mosfet1_pin, m1);
303 Serial.print("MOSFET 1 = ");
308 Serial.print("unknown command ");
311 digitalWrite(led_pin, LOW);