This repository has been archived on 2024-01-30. You can view files and clone it, but cannot push or open issues or pull requests.
trev/arduino/src/sketch.ino

227 lines
5.3 KiB
Arduino
Raw Normal View History

2016-01-12 20:05:43 +01:00
#include <RCSwitch.h>
2016-01-21 17:43:29 +01:00
#include <IRremote.h>
// Necessary IR Globals
int RECV_PIN = 10;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;
2016-01-12 20:05:43 +01:00
2016-01-18 22:30:36 +01:00
uint8_t message[8];
int index = 0;
boolean com = false;
2016-01-21 17:43:29 +01:00
int irReceive = 0;
2016-01-11 21:09:53 +01:00
void setup()
{
2016-01-12 20:05:43 +01:00
Serial.begin(9600);
2016-01-11 21:09:53 +01:00
}
void loop()
{
2016-01-21 17:43:29 +01:00
2016-01-21 22:49:04 +01:00
if (irReceive > millis() && irrecv.decode(&results)) {
2016-01-21 17:43:29 +01:00
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;
}
2016-01-18 22:30:36 +01:00
}
2016-01-12 20:05:43 +01:00
}
2016-01-21 17:43:29 +01:00
2016-01-12 20:05:43 +01:00
}
2016-01-21 17:43:29 +01:00
2016-01-12 20:05:43 +01:00
}
2016-01-18 22:30:36 +01:00
void decodeMessage() {
2016-01-20 16:46:11 +01:00
int cmd = message[0];
2016-01-21 22:49:04 +01:00
int pin = (message[1] - 97 < 0 || message[1] - 97 > 19)? -1 : message[1] - 97 ;
2016-01-18 22:30:36 +01:00
if(com) {
2016-01-18 23:17:34 +01:00
uint8_t val[6];
2016-01-18 22:30:36 +01:00
memcpy(val, message + 2, 6);
switch (cmd) {
//case 80: break;
2016-01-26 16:39:58 +01:00
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;
2016-01-21 17:43:29 +01:00
case 89: irrecv.enableIRIn();
irReceive = millis() + 10000;
break;
2016-01-26 16:39:58 +01:00
default: break;
2016-01-18 22:30:36 +01:00
}
2016-01-20 19:40:28 +01:00
} else if(cmd == 90) {
2016-01-18 22:30:36 +01:00
com = true;
2016-01-20 16:46:11 +01:00
setMode(0, pin);
digitalWrite(pin, HIGH);
2016-01-18 22:30:36 +01:00
Serial.println("Ready!");
} else {
Serial.println("Arduino not configured for communication!");
}
}
2016-01-20 16:46:11 +01:00
void setMode(uint8_t val, int pin) {
2016-01-20 19:40:28 +01:00
if(pin == -1) { Serial.println("badpin"); return; }
2016-01-20 16:46:11 +01:00
if (val == 0) {
pinMode(pin, OUTPUT);
} else {
pinMode(pin, INPUT);
}
}
2016-01-20 17:00:46 +01:00
void digitalW(uint8_t val, int pin) {
2016-01-20 19:40:28 +01:00
if(pin == -1) { Serial.println("badpin"); return; }
2016-01-20 17:00:46 +01:00
pinMode(pin, OUTPUT);
if(val == 0) {
digitalWrite(pin, LOW);
} else {
digitalWrite(pin, HIGH);
}
}
2016-01-20 19:40:28 +01:00
void digitalR(int pin) {
if(pin == -1) { Serial.println("badpin"); return; }
pinMode(pin, INPUT);
int digraw = digitalRead(pin);
2016-01-21 17:43:29 +01:00
Serial.println(String(pin + '::' + digraw));
2016-01-20 19:40:28 +01:00
}
2016-01-25 22:02:42 +01:00
void analogW(uint8_t val[], int pin) {
2016-01-26 16:39:58 +01:00
if(pin == -1) { Serial.println("badpin"); return; }
pinMode(pin, OUTPUT);
analogWrite(pin,firsTwoToInt(val));
2016-01-25 22:02:42 +01:00
}
void analogR(int pin) {
2016-01-26 16:39:58 +01:00
if(pin == -1) { Serial.println("badpin"); return; }
pinMode(pin, INPUT);
int rval = analogRead(pin);
2016-01-25 22:02:42 +01:00
Serial.println(String(pin + "::" + rval));
}
void handleRCDecimal(uint8_t val[], int pin) {
2016-01-26 16:39:58 +01:00
if (pin == -1) { Serial.println("badpin"); return; }
2016-01-25 23:29:21 +01:00
unsigned int length = firsTwoToInt(val);
unsigned long value = lastFourToLong(val);
2016-01-25 22:02:42 +01:00
RCSwitch rc = RCSwitch();
2016-01-26 16:39:58 +01:00
rc.enableTransmit(pin);
2016-01-25 22:02:42 +01:00
rc.send(value, length);
}
2016-01-20 16:46:11 +01:00
void sendRCTristate (uint8_t val[], int pin) {
2016-01-20 19:40:28 +01:00
if(pin == -1) { Serial.println("badpin"); return; }
2016-01-18 22:30:36 +01:00
String triStateCode = "";
2016-01-20 16:46:11 +01:00
RCSwitch rc = RCSwitch();
2016-01-20 19:40:28 +01:00
rc.enableTransmit(pin);
2016-01-18 22:30:36 +01:00
for(int i = 0; i < 6; i++)
{
String triStatePart = String(val[i], HEX);
triStatePart = (triStatePart.length() < 2) ? String("0" + triStatePart) : triStatePart;
triStateCode.concat(triStatePart);
}
2016-01-18 23:17:34 +01:00
char triState[triStateCode.length() + 1];
triStateCode.toUpperCase();
triStateCode.toCharArray(triState, triStateCode.length() + 1);
2016-01-18 22:30:36 +01:00
2016-01-20 19:40:28 +01:00
rc.sendTriState(triState);
2016-01-21 22:49:04 +01:00
delay(500);
Serial.print("RC-Tristate send: ");
Serial.println(triState);
2016-01-21 17:43:29 +01:00
}
2016-01-25 23:29:21 +01:00
void irSend(int type, int length, unsigned long val) {
2016-01-28 16:42:06 +01:00
char m[22];
sprintf(m, "%04d::%04d::%09lu", type,length,val);
Serial.println(m);
2016-01-25 23:29:21 +01:00
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);
}
}
2016-01-21 17:43:29 +01:00
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;
}
}
2016-01-21 22:49:04 +01:00
unsigned long codeValue = results->value;
int codeLen = results->bits;
char m[22];
sprintf(m, "%04d::%04d::%09lu", codeType,codeLen,codeValue);
Serial.println(m);
2016-01-21 17:43:29 +01:00
}
2016-01-21 22:49:04 +01:00
}
2016-01-25 23:29:21 +01:00
// 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];
}