Code: Select all
/*
Based on Serial Event example
Blaupunkt TV ch- (works)
38 550 2600 550 500 550 500 600 500 550 500 550 500 550 550 500 550 500 550 550 500 550 20600 550 2600 550 550 550 450 600 1050 1050 1050 1050 1050 550 500 550 550 500
*/
int IRledPin = 8;
void pulseIR(int freq, long microsecs) {
unsigned int delayTime = (1000/freq/2)-3;
cli(); // this turns off any background interrupts
while (microsecs > 0) {
digitalWrite(IRledPin, HIGH); // takes about 3 microseconds
delayMicroseconds(delayTime);
digitalWrite(IRledPin, LOW); // takes about 3 microseconds
delayMicroseconds(delayTime);
microsecs -= (2*delayTime)+6;
}
sei(); // this turns them back on
}
unsigned long raw[128] = {
'\0' }; // number of parts - increase if this is not enough
unsigned long number = 0;
int numberLength = 0;
int arrayLength = 0;
void setup() {
pinMode(IRledPin, OUTPUT);
digitalWrite(IRledPin, LOW);
Serial.begin(57600);
Serial.println("READY");
}
void loop() {
// TODO
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
unsigned long inNum = atoi(&inChar);
if ((inChar == ' ' ) || (inChar == '\n') || (inChar == '\r')) {
raw[arrayLength] = number;
arrayLength++;
number = 0;
}
if (inChar == '\n') {
send();
arrayLength = 0;
memset(&raw[0], 0, sizeof(raw));
}
else if (inChar == '1'||'2'||'3'||'4'||'5'||'6'||'7'||'8'||'9'||'0') {
number = number * 10 + inNum;
numberLength++;
}
}
}
void send(){
int freq = raw[0];
if ((freq < 35) || (freq > 60)) {
Serial.println("ERROR: Invalid frequency");
Serial.println("READY");
return;
}
for (int d=1; d<(arrayLength); d++) {
if(d % 2 != 0) pulseIR(freq, raw[d]);
else delayMicroseconds(raw[d]);
}
Serial.print("Frequency: ");
Serial.println(freq);
Serial.print("Raw:");
for (int c=1; c<(arrayLength); c++) {
if(c % 2 != 0) Serial.print(" +");
else Serial.print(" -");
Serial.print(raw[c]);
}
Serial.println();
Serial.println("READY");
}