#include #include // Necessary IR Globals int RECV_PIN = 10; IRrecv irrecv(RECV_PIN); IRsend irsend; decode_results results; uint8_t message[8]; int index = 0; boolean com = false; int irReceive = 0; void setup() { Serial.begin(9600); } void loop() { if (irReceive > millis() && irrecv.decode(&results)) { irRead(&results); irrecv.resume(); } else { while(Serial.available()) { uint8_t x = Serial.read(); if(index > 0 || (x >= 80 && x <= 95)) { message[index++] = x; if(index > 7){ decodeMessage(); index = 0; } } } } } void decodeMessage() { int cmd = message[0]; int pin = (message[1] - 97 < 0 || message[1] - 97 > 19)? -1 : message[1] - 97 ; if(com) { uint8_t val[6]; memcpy(val, message + 2, 6); switch (cmd) { //case 80: break; case 81: setMode(val[0], pin); break; case 82: digitalW(val[0], pin); break; case 83: digitalR(pin); break; case 84: analogW(val, pin); break; case 85: analogR(pin); break; case 86: handleRCDecimal(val, pin); break; case 87: sendRCTristate(val, pin); break; case 88: irSend(val[0], val[1], lastFourToLong(val)); break; case 89: irrecv.enableIRIn(); irReceive = millis() + 10000; break; default: break; } } else if(cmd == 90) { com = true; setMode(0, pin); digitalWrite(pin, HIGH); Serial.println("Ready!"); } else { Serial.println("Arduino not configured for communication!"); } } void setMode(uint8_t val, int pin) { if(pin == -1) { Serial.println("badpin"); return; } if (val == 0) { pinMode(pin, OUTPUT); } else { pinMode(pin, INPUT); } } void digitalW(uint8_t val, int pin) { if(pin == -1) { Serial.println("badpin"); return; } pinMode(pin, OUTPUT); if(val == 0) { digitalWrite(pin, LOW); } else { digitalWrite(pin, HIGH); } } void digitalR(int pin) { if(pin == -1) { Serial.println("badpin"); return; } pinMode(pin, INPUT); int digraw = digitalRead(pin); Serial.println(String(pin + '::' + digraw)); } void analogW(uint8_t val[], int pin) { if(pin == -1) { Serial.println("badpin"); return; } pinMode(pin, OUTPUT); analogWrite(pin,firsTwoToInt(val)); } void analogR(int pin) { if(pin == -1) { Serial.println("badpin"); return; } pinMode(pin, INPUT); int rval = analogRead(pin); Serial.print(pin); Serial.print("::"); Serial.println(rval); } void handleRCDecimal(uint8_t val[], int pin) { if (pin == -1) { Serial.println("badpin"); return; } unsigned int length = firsTwoToInt(val); unsigned long value = lastFourToLong(val); RCSwitch rc = RCSwitch(); rc.enableTransmit(pin); rc.send(value, length); } void sendRCTristate (uint8_t val[], int pin) { if(pin == -1) { Serial.println("badpin"); return; } String triStateCode = ""; RCSwitch rc = RCSwitch(); rc.enableTransmit(pin); for(int i = 0; i < 6; i++) { String triStatePart = String(val[i], HEX); triStatePart = (triStatePart.length() < 2) ? String("0" + triStatePart) : triStatePart; triStateCode.concat(triStatePart); } char triState[triStateCode.length() + 1]; triStateCode.toUpperCase(); triStateCode.toCharArray(triState, triStateCode.length() + 1); rc.sendTriState(triState); delay(500); Serial.print("RC-Tristate send: "); Serial.println(triState); } void irSend(int type, int length, unsigned long val) { char m[22]; sprintf(m, "%04d::%04d::%09lu", type,length,val); Serial.println(m); for(int i = 0; i < 3; i++) { switch (type) { case RC5: irsend.sendRC5(val, length); break; case RC6: irsend.sendRC6(val, length); break; case NEC: if (i) { irsend.sendNEC(REPEAT, length); } else { irsend.sendNEC(val, length);} break; case SONY: irsend.sendSony(val, length); break; case PANASONIC: irsend.sendPanasonic(length, val); break; case JVC: irsend.sendJVC(val, length, i); break; case SAMSUNG: irsend.sendSAMSUNG(val, length); break; case WHYNTER: irsend.sendWhynter(val, length); break; case LG: irsend.sendLG(val, length); break; case DISH: irsend.sendDISH(val, length); break; case DENON: irsend.sendDenon(val, length); break; } delay(10); } } void irRead(decode_results *results) { int codeType = results->decode_type; if (codeType == UNKNOWN) { Serial.println("Unknown IR Protocol!"); } else { if (codeType == NEC) { if (results->value == REPEAT) { return; } } unsigned long codeValue = results->value; int codeLen = results->bits; char m[22]; sprintf(m, "%04d::%04d::%09lu", codeType,codeLen,codeValue); Serial.println(m); } } // Helpers unsigned int firsTwoToInt(uint8_t val[]) { return val[0] * 256 + val[1]; } unsigned long lastFourToLong(uint8_t val[]) { return val[2]*16777216 + val[3]*65536 + val[4]*256 + val[5]; }