2 Over complicated desk LED dimmer
3 2016-01-10 Dobrica Pavlinusic <dpavlin@rot13.org>
6 const int led_pin = 13;
7 const int buzzer_pin = 4;
8 const int mosfet_pins[] = { 9, 10, 6 };
9 int mosfet_pwm[] = { 0, 0, 0 };
12 PS2 mouse(8, 7); // PS2 synaptics clock, data
17 pinMode(led_pin, OUTPUT);
18 pinMode(buzzer_pin, OUTPUT);
20 for(int i=0; i<sizeof(mosfet_pins); i++) pinMode(mosfet_pins[i], OUTPUT);
23 mouse.write(0xff); // reset
24 mouse.read(); // ack byte
25 mouse.read(); // blank */
26 mouse.read(); // blank */
27 mouse.write(0xf0); // remote mode
29 delayMicroseconds(100);
31 mouse.read(); // ack byte
32 mouse.write(0x03); // x1 ( x1 * 64 + x2 * 16 + x3 * 4 + x4 == modebyte )
33 mouse.read(); // ack byte
35 mouse.read(); // ack byte
36 mouse.write(0x00); // x2
37 mouse.read(); // ack byte
39 mouse.read(); // ack byte
40 mouse.write(0x01); // x3
41 mouse.read(); // ack byte
43 mouse.read(); // ack byte
44 mouse.write(0x00); // x4
45 mouse.read(); // ack byte
46 mouse.write(0xf3); // set samplerate 20 (stores mode)
47 mouse.read(); // ack byte
49 mouse.read(); // ack byte
50 delayMicroseconds(100);
53 Serial.println("Commands: b - beep, qwe/asd/zxc - MOSFETs");
57 void mosfet(int nr, int value) {
58 int pwm = mosfet_pwm[nr];
60 Serial.println("ignored");
63 Serial.print("MOSFET ");
66 Serial.println(value);
67 int sleep = 1000 / abs(pwm - value);
68 int step = pwm < value ? 1 : -1;
69 for(int i=pwm; i != value; i += step) {
70 analogWrite(mosfet_pins[nr], i);
74 analogWrite(mosfet_pins[nr], value);
75 mosfet_pwm[nr] = value;
79 unsigned int last_cx = 0;
80 unsigned int last_cy = 0;
88 byte mx; //x coordinate
89 byte my; //y coordinate
90 byte mz; //z pressure value
97 mstat1 = mouse.read();
100 mstat2 = mouse.read();
105 // collect the bits for x and y
106 cx = (((mstat2 & 0x10) << 8) | ((mxy & 0x0F) << 8) | mx ); // 1100-5800
107 cy = (((mstat2 & 0x20) << 7) | ((mxy & 0xF0) << 4) | my ); // 800-5000
109 if ( last_cx != cx || last_cy != cy ) {
113 Serial.print(cx, DEC);
114 Serial.print("\tY=");
115 Serial.print(cy, DEC);
116 Serial.print("\tZ=");
117 Serial.print(mz, DEC);
118 if ( cx > 1100 && cy > 800 ) {
119 int nr = ( cx - 1100 ) / (( 5800 - 1100 ) / 3);
120 int pwm = ( cy - 800 ) / (( 5000 - 800 ) / 255);
121 pwm -= 1; // allow off
122 Serial.print("\tmosfet = ");
124 Serial.print("\tpwm = ");
126 if ( nr >= 0 && nr <= 2 && pwm >= 0 && pwm <= 255 ) {
127 analogWrite(mosfet_pins[nr], pwm);
128 Serial.print("\tOK");
130 Serial.print("\tIGNORED");
137 if (Serial.available()) {
138 digitalWrite(led_pin, HIGH);
139 int in = Serial.read();
142 tone(buzzer_pin, 1800, 100);
144 tone(buzzer_pin, 2200, 100);
147 case 'q': mosfet(0, 255); break;
148 case 'a': mosfet(0, 127); break;
149 case 'z': mosfet(0, 0); break;
150 case 'w': mosfet(1, 255); break;
151 case 's': mosfet(1, 127); break;
152 case 'x': mosfet(1, 0); break;
153 case 'e': mosfet(2, 255); break;
154 case 'd': mosfet(2, 127); break;
155 case 'c': mosfet(2, 0); break;
158 m1 = (m1 + 10) % 255;
159 analogWrite(mosfet1_pin, m1);
160 Serial.print("MOSFET 1 = ");
164 m1 = (m1 - 10) % 255;
165 analogWrite(mosfet1_pin, m1);
166 Serial.print("MOSFET 1 = ");
171 Serial.print("unknown command ");
174 digitalWrite(led_pin, LOW);