/* HiFiLOGIX 0.1.7 dewdude@gmail.com - 06-JAN-2019 */ #include #include #include #include "logo.h" // XBMP data for logo. U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); const char *inputs[] = {"TAPE-2","TAPE-1","AUX","TUNER","PHONO-2","PHONO-1"}; int latchPin = 11; int clockPin = 9; int dataPin = 12; int IRin = 7; int srEnable = 5; int matrix = A0; byte out = 0; IRrecv remote(IRin); decode_results ircode; void logo() // Logo is now bitmapped. Saves a good bit of space this way. { u8g2.firstPage(); do { u8g2.drawXBMP(14,4,hifilogix_width,hifilogix_height,hifilogix_bits); } while ( u8g2.nextPage() ); } // I also borrowed this from an example. I'll figure out how it works later. void updateShiftRegister() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, out); digitalWrite(latchPin, HIGH); } void DontCrossTheStreams(byte op, int x, int i) // Oh yeah, this much nicer than 8 seperate functions. { out = 0; updateShiftRegister(); out = op; // No more bitset. This works better. updateShiftRegister(); u8g2.clearBuffer(); u8g2.drawStr(x,30,inputs[i]); u8g2.sendBuffer(); // Don't cross the streams! } void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(srEnable, OUTPUT); u8g2.begin(); remote.enableIRIn(); logo(); // It's so pretty! delay(2000); // It takes the Denon about 4.5 seconds to kick speakers on. u8g2.setFont(u8g2_font_logisoso28_tr); // Moved here since logo is bitmap. DontCrossTheStreams(16,32,2); // Someday this will not be static. digitalWrite(srEnable,HIGH); // Now drives a logic inverter. } void loop() { int mx = analogRead(matrix); byte icode = 0; // I changed how I handed the inputs. if (remote.decode(&ircode)) { icode = ircode.value; remote.resume(); } // I don't know if it improves things, but I sure like how much smaller this section is. if ((mx > 100 && mx < 200) || (icode == 0x97)) DontCrossTheStreams(64,10,0); // The code I originally used to figure out my if ((mx > 500 && mx < 600) || (icode == 0x67)) DontCrossTheStreams(32,10,1); // remote codes returned 3 bytes in hex. I can't if ((mx > 900 && mx < 950) || (icode == 0x4F)) DontCrossTheStreams(16,32,2); // remember what that code was, but I only need if ((mx > 1000) || (icode == 0xCF)) DontCrossTheStreams(8,18,3); // the last bit with the remote I'm using. if ((mx > 820 && mx < 899) || (icode == 0xE7)) DontCrossTheStreams(6,1,4); // I'm working on making the bare-bones utility I if ((mx > 700 && mx < 800) || (icode == 0x85)) DontCrossTheStreams(5,1,5); // wrote a bit more user-friendly. delay(200); }