#include <driver/dac.h>
int currentLed = 0;
int lastSeen = 100;
const int rows[] = { 5, 23, 19, 18, 26 };
const int cols[] = { 34, 33, 35, 21, 22 };
const int adc[] = { 2, 4, 12, 27, 14 };
const int ampEnable = 32;
void setup() {
Serial.begin(115200);
pinMode(ampEnable, OUTPUT);
dac_i2s_disable();
dac_output_enable(DAC_CHANNEL_1);
for (int i=0;i<5;++i) {
pinMode(rows[i], OUTPUT);
pinMode(cols[i], OUTPUT);
pinMode(adc[i], INPUT);
}
currentLed = 0;
lastSeen = 100;
digitalWrite(ampEnable, LOW);
}
void play(uint32_t freq) {
dac_cw_config_t wave_config = {
en_ch: DAC_CHANNEL_1,
scale: DAC_CW_SCALE_2,
phase: DAC_CW_PHASE_0,
freq: freq,
offset: 0,
};
dac_cw_generator_config(&wave_config);
dac_cw_generator_enable();
digitalWrite(ampEnable, HIGH);
}
void mute() {
digitalWrite(ampEnable, LOW);
dac_cw_generator_disable();
}
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/5;
int col = led%5;
for (int i=0;i<5;++i) {
if (i==row) { power(rows[i]); }
else { ground(rows[i]); }
if (i==col) { ground(cols[i]); }
else { tristate(cols[i]); }
}
}
int sense(int led) {
int row = led/5;
int value = analogRead(adc[row]);
return value < 500;
}
int count=0;
uint32_t notes[] = { 440, 880, 1200 };
int currentNote = 0;
void loop() {
enableLed(currentLed);
delay(1);
if (sense(currentLed)) {
if (lastSeen != currentLed) {
lastSeen = currentLed;
Serial.print(currentLed);
Serial.println(" proximity!");
}
}
else if (lastSeen == currentLed) {
lastSeen = 100;
}
currentLed = (currentLed+1)%25;
if (count == 450) {
}
else if (count == 0) {
play(notes[currentNote]);
currentNote = (currentNote+1)%3;
}
count = (count+1)%500;
}