ino
#define txPinIR
unsigned
unsigned
unsigned
unsigned
char
char
char
char
carrierFreq = 0; //default
period = 0; //calculated once for each signal sent in initSoftPWM
periodHigh = 0; //calculated once for each signal sent in initSoftPWM
periodLow = 0; //calculated once for each signal sent in initSoftPWM
unsigned long sigTime = 0; //used in mark & space functions to keep track of time
unsigned long sigStart = 0; //used to calculate correct length of existing signal, to handle
some repeats
//RAW Mitsubishi 88 bit signal - make sure buffer starts with a Mark
unsigned int Mitsubishi88AC_RAW[] = {3172, 1586, 394, 394, 394, 1182, 394, 394, 394, 394,
394, 1182, 394, 394, 394, 1182, 394, 394, 394, 394, 394, 1182, 394, 1182, 394, 1182, 394,
394, 394, 1182, 394, 394, 394, 1182, 394, 1182, 394, 1182, 394, 394, 394, 394, 394, 394,
394, 394, 394, 1182, 394, 1182, 394, 394, 394, 1182, 394, 1182, 394, 394, 394, 394, 394,
1182, 394, 394, 394, 394, 394, 1182, 394, 394, 394, 394, 394, 1182, 394, 1182, 394, 394,
394, 1182, 394, 1182, 394, 1182, 394, 1182, 394, 1182, 394, 1182, 394, 1182, 394, 1182, 394,
1182, 394, 1182, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
394, 394, 1182, 394, 1182, 394, 1182, 394, 1182, 394, 1182, 394, 1182, 394, 394, 394, 1182,
394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 1182, 394, 394, 394, 394,
394, 1182, 394, 1182, 394, 1182, 394, 1182, 394, 1182, 394, 394, 394, 1182, 394, 1182, 394,
394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 1182, 394, 394, 394}; //AnalysIR Batch
Export (IRremote) - RAW
unsigned char Mitsubishi88AC_Hex[] = {0x4A, 0x75, 0xC3, 0x64, 0x9B, 0xFF, 0x00, 0xFD, 0x02,
0x7D, 0x82};
void setup() {
Serial.begin(57600);
pinMode(txPinIR, OUTPUT);
}
void loop() {
//Next send the Mitsubishi AC RAW signal defined above
Serial.println(F("Sending Mitsubishi88AC_RAW @ 40kHz"));
sendRawBuf(Mitsubishi88AC_RAW, sizeof(Mitsubishi88AC_RAW) / sizeof(Mitsubishi88AC_RAW[0]),
40);
delay(5000); //wait 5 seconds between each signal (change to suit)
//Next send the Mitsubishi88AC_Hex signal defined above
Serial.println(F("Sending Mitsubishi88AC_Hex @ 36kHz"));
sendHexMITSUBISHI88AC(Mitsubishi88AC_Hex, sizeof(Mitsubishi88AC_Hex) /
sizeof(Mitsubishi88AC_Hex[0]), 36);
delay(5000); //wait 5 seconds between each signal (change to suit)
//Next send the Mitsubishi88AC_Hex signal defined above
Serial.println(F("Sending Mitsubishi88AC_Hex @ 33kHz"));
sendHexNEC(NEC_HEX_VALUE, NEC_BIT_COUNT, 1, 33);
delay(5000); //wait 5 seconds between each signal (change to suit)
//Next send the Mitsubishi88AC_Hex signal defined above
Serial.println(F("Sending Mitsubishi88AC_Hex @ 30kHz"));
sendHexMITSUBISHI88AC(Mitsubishi88AC_Hex, sizeof(Mitsubishi88AC_Hex) /
sizeof(Mitsubishi88AC_Hex[0]), 30);
delay(5000); //wait 5 seconds between each signal (change to suit)
}
-1-
C:\Users\Ilija\Desktop\Simple_Infrared_softPWM_Send\Simple_Infrared_softPWM_Send.ino
//----------------------------declare functionss----------------------------------void sendRawBuf(unsigned int *sigArray, unsigned int sizeArray, unsigned char kHz) {
if (carrierFreq != kHz) initSoftPWM(kHz); //we only need to re-initialise if it has
changed from last signal sent
sigTime = micros(); //keeps rolling track of signal time to avoid impact of loop & code
execution delays
for (int i = 0; i < sizeArray; i++) {
mark(sigArray[i++]); //also move pointer to next position
if (i < sizeArray) { //check we have a space remaining before sending it
space(sigArray[i]); //pointer will be moved by for loop
}
}
}
void sendHexMITSUBISHI88AC(unsigned char *sigArray, unsigned int sizeArray, unsigned char
kHz) { //Mitsubish 88 bit Ir protocol format
/* A basic 88 bit NEC-'like' signal is made up of:
* 1 x 3172 uSec Header Mark, followed by
* 1 x 1586 uSec Header Space, followed by
* 32 x bits uSec ( 1- bit 394 uSec Mark followed by 1182 uSec space; 0 - bit 394 uSec
Mark follwed by 394 uSec Space)
* 1 x 9000 uSec Trailer Mark
* There can also be a generic repeat signal, which is usually not neccessary & can be
replaced by sending multiple signals
*/
#define MITSUBISHI88AC_HEADER_MARK 3172
#define MITSUBISHI88AC_HEADER_SPACE 1586
#define MITSUBISHI88AC_ONE_MARK 394
#define MITSUBISHI88AC_ZERO_MARK 394
#define MITSUBISHI88AC_ONE_SPACE 1182
#define MITSUBISHI88AC_ZERO_SPACE 394
#define MITSUBISHI88AC_TRAILER_MARK 394
//
if (carrierFreq != kHz) initSoftPWM(kHz); //we only need to re-initialise if it has
changed from last signal sent
sigTime = micros(); //keeps rolling track of signal time to avoid impact of loop & code
execution delays
// First send header Mark & Space
mark(MITSUBISHI88AC_HEADER_MARK);
space(MITSUBISHI88AC_HEADER_SPACE);
for (unsigned int i = 0; i < sizeArray; i++) { //iterate thru each byte in sigArray
register unsigned char bitMask = 0x80; //starting value of bitmask fo each Hex byte
while (bitMask) { //do 8 times for each bit of the 8 bit byte
if (bitMask & sigArray[i]) { //its a One bit
mark(MITSUBISHI88AC_ONE_MARK);
space(MITSUBISHI88AC_ONE_SPACE);
}
else { // its a Zero bit
mark(MITSUBISHI88AC_ZERO_MARK);
space(MITSUBISHI88AC_ZERO_SPACE);
}
bitMask = (unsigned char) bitMask >> 1; // shift the mask bit along until it reaches
zero & we exit the while loop
-2-
C:\Users\Ilija\Desktop\Simple_Infrared_softPWM_Send\Simple_Infrared_softPWM_Send.ino
}
}
// Last send NEC Trailer MArk
mark(MITSUBISHI88AC_TRAILER_MARK);
}
C:\Users\Ilija\Desktop\Simple_Infrared_softPWM_Send\Simple_Infrared_softPWM_Send.ino
}
void mark(unsigned int mLen) { //uses sigTime as end parameter
sigTime += mLen; //mark ends at new sigTime
unsigned long now = micros();
unsigned long dur = sigTime - now; //allows for rolling time adjustment due to code
execution delays
if (dur == 0) return;
while ((micros() - now) < dur) { //just wait here until time is up
digitalWrite(txPinIR, HIGH);
if (periodHigh) delayMicroseconds(periodHigh);
digitalWrite(txPinIR, LOW);
if (periodLow) delayMicroseconds(periodLow);
}
}
void space(unsigned int sLen) { //uses sigTime as end parameter
sigTime += sLen; //space ends at new sigTime
unsigned long now = micros();
unsigned long dur = sigTime - now; //allows for rolling time adjustment due to code
execution delays
if (dur == 0) return;
while ((micros() - now) < dur) ; //just wait here until time is up
}
-4-