/* * UNO Monitor Receiver (4-bit LCD Version) * Kidacro * * Waits for input over serial connection and displays on LCD & LED * Receives IR events and reports them over serial connection to a daemon * * Input Schema: * Start char is: '#' * End char is: '@' * 2nd char denotes which line number/mode to use * * Example: * Line 1: #1Archamedis Status@ * Line 2: #299% free / etc.@ * LAVG 3: #324@ * * Output Schema: * Multimedia Controls use single characters to denote which button was pressed * P power * M mute * m mode * p pause/play * b back * f forward * e eq * - vol down * + vol up * r return * u usb scan * 0 number 0 * 1 number 1 * 2 number 2 * 3 number 3 * 4 number 4 * 5 number 5 * 6 number 6 * 7 number 7 * 8 number 8 * 9 number 9 * R repeat * Z other button pressed */ #include #include #include /* LCD Pinout: * LCD RS pin to digital pin 12 * LCD Enable pin to digital pin 11 * LCD D4 pin to digital pin 5 * LCD D5 pin to digital pin 4 * LCD D6 pin to digital pin 3 * LCD D7 pin to digital pin 2 * LCD R/W pin to ground * LCD VSS pin to ground * LCD VCC pin to 5V * 10K resistor: * ends to +5V and ground * wiper to LCD VO pin (pin 3) */ /* LED Pinout: * LED DataIn(DIN) to digital pin 10 * LED LOAD(CS) to digital pin 9 * LED CLK to digital pin 8 * LED VSS pin to 5V * LED GND to ground */ /* IR Pinout * IR Signal to digital pin 13 * IR VSS pin to 5V * IR GND to ground */ // LCD vars const int LCDRS = 12, LCDEN = 11, LCDD4 = 5, LCDD5 = 4, LCDD6 = 3, LCDD7 = 2; int LCDLength = 16; LiquidCrystal LCD(LCDRS, LCDEN, LCDD4, LCDD5, LCDD6, LCDD7); // LED vars const int LEDIN = 10, LEDCS = 9, LEDCLK = 8; LedControl LEDlc=LedControl(LEDIN,LEDCLK,LEDCS,1); int LEDBrightness = 1; // default = 8 / max = 15 unsigned long LEDdelaytime1=3; unsigned long LEDdelaytime2=3; // IR vars const int IRSIG = 13; IRrecv Irrecv(IRSIG); decode_results IRresults; // Serial vars const byte SERnumChars = 32; char SERrecvChars[SERnumChars]; boolean SERnewData = false; // Debugging boolean DEBUG = false; void LEDSetup(void) { /* The MAX72XX is in power-saving mode on startup, we have to do a wakeup call */ LEDlc.shutdown(0,false); /* Set the brightness */ LEDlc.setIntensity(0,LEDBrightness); /* and clear the display */ LEDlc.clearDisplay(0); } void LcdSetup(void) { // set up the LCD's number of columns and rows: LCD.begin(LCDLength, 2); // clear LCD.clear(); } void IRSetup(void) { // start the receiver Irrecv.enableIRIn(); } void LcdL1(boolean wipe = false) { delay(10); LCD.setCursor(0, 0); // Define the cursor position as the 1st position of the 1st line if(wipe) { LcdWrite(" "); // 16 spaces for a blank line LCD.setCursor(0, 0); } delay(10); } void LcdL2(boolean wipe = false) { delay(10); LCD.setCursor(0, 1); // Define the cursor position as the 1st position of the 2nd line if(wipe) { LcdWrite(" "); // 16 spaces for a blank line LCD.setCursor(0, 1); } delay(10); } void LcdIntro(void) { // Print a "waiting" message to the LCD. LcdL1(); LCD.print("Starting Up..."); LcdL2(); LCD.print("Waiting for data"); } void LcdCls(void) { delay(10); LCD.clear(); // The screen is empty LcdL1(); // the cursor position is zeroed delay(10); } /* TODO: returns starting position of text or 0 for 1st position void LcdCenter(int mylen) { int mypos = 0; return mypos; }*/ void LcdWrite(String mymessage) { int i = 0; unsigned int mylen = mymessage.length(); // trunicate string to lcd line length if(mylen > LCDLength) { mylen = LCDLength; } // Debug input and length if(DEBUG) { Serial.println("\n\nString: "); Serial.println(mymessage); Serial.println(mymessage.length()); } // Output string //LCD.print(mymessage); // Output character by character for(i=0; i < mylen; i++) { char c = mymessage[i]; if(c != '\b') { delay(10); LCD.print(c); delay(10); } } } void LedIntro() { for(int row=0;row<8;row++) { for(int col=0;col<8;col++) { delay(LEDdelaytime2); LEDlc.setLed(0,row,col,true); delay(LEDdelaytime2); for(int i=0;i= 25) segments = 2; if(myload >= 37) segments = 3; if(myload >= 50) segments = 4; if(myload >= 62) segments = 5; if(myload >= 75) segments = 6; if(myload >= 87) segments = 7; if(myload >= 95) segments = 8; // segments as rows for(int row=0;row<8;row++) { for(int col=0;col 0 && SERnewData == false) { // process serial signal rc = Serial.read(); if(recvInProgress == true) { if(rc != endMarker) { SERrecvChars[ndx] = rc; ndx++; if (ndx >= SERnumChars) { ndx = SERnumChars - 1; } } else { SERrecvChars[ndx] = '\0'; // terminate the string recvInProgress = false; ndx = 0; SERnewData = true; } } else if(rc == startMarker) { recvInProgress = true; } } } // process new data // data schema: // 1st character denotes function: // 1 - print on 1st line as is // 2 - print on 2nd line as is // 3 - display load on LCD matrix // 4 - set a setting void procNewData() { if(SERnewData == true) { if(DEBUG) { Serial.print("This just in ... "); Serial.println(SERrecvChars); } // Chooser // dev: we have to define 1st character (line number) as BS and when printing, search for that BS character to skip printing that 1 character // print on line 1 if(SERrecvChars[0] == '1') { LcdL1(true); SERrecvChars[0] = '\b'; LcdWrite(SERrecvChars); } // print on line 2 else if(SERrecvChars[0] == '2') { LcdL2(true); SERrecvChars[0] = '\b'; LcdWrite(SERrecvChars); } // show load on led matrix else if(SERrecvChars[0] == '3') { SERrecvChars[0] = ' '; LedShowLoad(SERrecvChars); } SERnewData = false; } } void setup (void) { // init HW LcdSetup(); LEDSetup(); IRSetup(); // open serial port Serial.begin(9600); // display intros LcdIntro(); LedIntro(); } // main() void loop (void) { // process IR signal if(Irrecv.decode(&IRresults)) { IRtranslate(); Irrecv.resume(); // receive the next value } // process serial input SERrecv(); // process new data procNewData(); }