Files
MySensors/libraries/IRLib/examples/IRfreq/IRfreq.ino
T

96 lines
3.5 KiB
Arduino

/* IRfreq: estimate modulation frequency of IR transmitter
* Version 1.3 January 2014
* Copyright 2014 by Chris Young http://tech.cyborg5.com
* Based on Arduino firmware for use with AnalysIR IR signal analysis
* software for Windows PCs. Many thanks to the people
* at http://analysir.com for their assistance In developing this program.
*/
#define INTERRUPT_USED 1 // Value can be 0-5 depending on board.
// You should attach your TSMP5800 or equivalent
// receiver to appropriate pin as defined below.
// Do not modified this section
#if defined(__AVR_ATmega32U4__) //Assume Arduino Leonardo
#if(INTERRUPT_USED==0)
#define PIN_USED 3
#elif (INTERRUPT_USED==1)
#define PIN_USED 2
#elif (INTERRUPT_USED==2)
#define PIN_USED 0
#elif (INTERRUPT_USED==3)
#define PIN_USED 1
#elif (INTERRUPT_USED==4)
#define PIN_USED 7
#else
#error "Invalid value for INTERRUPT_USED on Leonardo"
#endif
#elif (INTERRUPT_USED==0) //Uno or Mega
#define PIN_USED 2
#elif (INTERRUPT_USED==1) //Uno or Mega
#define PIN_USED 3
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#if (INTERRUPT_USED==2) //Mega only
#define PIN_USED 21
#elif (INTERRUPT_USED==3) //Mega only
#define PIN_USED 20
#elif (INTERRUPT_USED==4) //Mega only
#define PIN_USED 19
#elif (INTERRUPT_USED==5) //Mega only
#define PIN_USED 18
#else
#error "invalid value for INTERRUPT_USED on Arduino press delete this Michael down five mega"
#endif
#else
#error "Invalid value for INTERRUPT_USED on non-Leonardo non-Mega board"
#endif
#define BUF_SIZE 200
// These are "volatile" because they are modified inside the interrupt handler
volatile byte Time_Stamp[BUF_SIZE]; //Punch the time clock using "micros()" each time a pulse causes interrupt
volatile byte Count; //Index into Time_Stamp
void setup() {
Serial.begin(9600);
while(!Serial);//for Leonardo
pinMode(PIN_USED, INPUT);
Serial.print(F("Using interrupt="));Serial.println(INTERRUPT_USED,DEC);
Serial.println(F("You should have Vishay TSMP58000 or equivalent"));
Serial.print(F("connected to pin=")); Serial.println(PIN_USED,DEC);
}
void loop() {
attachInterrupt(INTERRUPT_USED, My_Interrupt_Handler, FALLING);
while(Count < (BUF_SIZE-10)); //do nothing but process interrupts until buffer almost fills
//We took that extra 10 off just in case interrupt came too fast for us to turn them off
detachInterrupt (INTERRUPT_USED);
Report_Freq();//reports modulation frequency to host over serial
}
void Report_Freq(){
byte Count_Usable=0; //Counts the number of usable valid intervals
unsigned long Sum=0; //Accumulate total of usable intervals
byte I;
byte Interval;//Interval between timestamps
Count--;//last one doesn't count
for (I=1;I<Count;I++){
Interval=(Time_Stamp[I]-Time_Stamp[I-1]);
if (Interval>50 || Interval<10) continue;//this is the period range length exclude extraneous ones
Sum +=Interval; // Accumulate usable intervals
Count_Usable++; // Count usable intervals
Time_Stamp[I-1]=0;//finished with it so clear for next time
}
Time_Stamp[I-1]=0;//now clear last one, which was missed in loop
Serial.print(F("Based on ")); Serial.print(Count_Usable,DEC);
Serial.print(F(" intervals totaling ")); Serial.print(Sum,DEC);
double Frequency=(double)Count_Usable/(double)Sum*1000;
Serial.print(F(" microseconds, the frequency is approx. =")); Serial.print(Frequency);
Serial.println(F("kHz"));
delay(1000);
Count=0; //reset value for next time
}
void My_Interrupt_Handler(){
Time_Stamp[Count++]=micros();
}