aboutsummaryrefslogtreecommitdiff
path: root/esp32/lego-piano.ino
diff options
context:
space:
mode:
Diffstat (limited to 'esp32/lego-piano.ino')
-rw-r--r--esp32/lego-piano.ino93
1 files changed, 93 insertions, 0 deletions
diff --git a/esp32/lego-piano.ino b/esp32/lego-piano.ino
new file mode 100644
index 0000000..81f75c9
--- /dev/null
+++ b/esp32/lego-piano.ino
@@ -0,0 +1,93 @@
+/*
+ matrix-scan a set of LEDs
+
+ pins:
+
+ "rows" 12 & 13 go to a 220Ω resistor, then to 2 LEDs each (positive
+ / long stem side); also to a 10kΩ resistor then to 2
+ phototransistors (collector / long stem side)
+
+ also, from between the 10kΩ and the phototransistors, wire goes to
+ A1 & A2
+
+ "columns"
+ 14 & 15 go to 2 LEDs each (negative / short stem side)
+
+ so that given one of 12|13 and one of 14|15, one LED is identified
+ */
+
+int currentLed = 0;
+
+void setup() {
+ Serial.begin(19200);
+ pinMode(12, OUTPUT);
+ pinMode(13, OUTPUT);
+ pinMode(14, OUTPUT);
+ pinMode(15, OUTPUT);
+ pinMode(A1, INPUT);
+ pinMode(A2, INPUT);
+ currentLed = 0;
+}
+
+void tristate(int pin) {
+ pinMode(pin,OUTPUT);
+ digitalWrite(pin,LOW);
+ pinMode(pin,INPUT);
+}
+
+void power(int pin) {
+ pinMode(pin,OUTPUT);
+ digitalWrite(pin,HIGH);
+}
+
+void ground(int pin) {
+ pinMode(pin,OUTPUT);
+ digitalWrite(pin,LOW);
+}
+
+void enableLed(int led) {
+ int row = led/2;
+ int col = led%2;
+ /* Serial.print("enabling "); */
+ /* Serial.print(row); */
+ /* Serial.print(" "); */
+ /* Serial.println(col); */
+
+ if (row==0) {
+ power(12); ground(13);
+ }
+ else {
+ ground(12); power(13);
+ }
+
+ if (col==0) {
+ ground(14); tristate(15);
+ }
+ else {
+ tristate(14); ground(15);
+ }
+}
+
+int sense(int led) {
+ int row = led/2;
+
+ int value = analogRead(row == 0 ? A1 : A2);
+
+ //Serial.println(value);
+ return value < 500;
+}
+
+void loop() {
+ /* Serial.print("current led "); */
+ /* Serial.println(currentLed); */
+
+ enableLed(currentLed);
+ delay(20);
+ if (sense(currentLed)) {
+ Serial.print(currentLed);
+ Serial.println(" proximity!");
+ }
+
+ currentLed = (currentLed+1)%4;
+ delay(20);
+} \ No newline at end of file