1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
#define InputPin PD2 // aka INT0
class jSignal
{
public :
unsigned long period_start;
unsigned long period_time;
unsigned long pulse_start;
unsigned long pulse_time;
};
volatile jSignal Signal;
volatile unsigned int time;
volatile char b;
volatile unsigned long period;
volatile unsigned long min_value;
volatile unsigned long value;
volatile unsigned long max_value;
volatile bool run = false;
char buff[16];
char cPer[16];
char cMin[16];
char cVal[16];
char cMax[16];
//-------------------- INT0
void ReadSignal()
{
time = micros();
if(digitalRead(InputPin) == 1)
{
Signal.period_time = time - Signal.period_start;
Signal.period_start = time;
Signal.pulse_start = time;
}
else
{
Signal.pulse_time = time - Signal.pulse_start;
}
if(run)
{
period = Signal.period_time;
if(Signal.pulse_time < min_value) min_value = Signal.pulse_time;
if(Signal.pulse_time > max_value) max_value = Signal.pulse_time;
value = Signal.pulse_time;
}
}
//---------------------------------
void ToStringAndPrint(char *str, int *val)
{
str[6] = 0;
sprintf(buff, "%d", val);
strcat(str, buff);
Serial.print(str);
Serial.print("\n");
}
//---------------------------------
void setup()
{
pinMode(InputPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(InputPin),ReadSignal, CHANGE);
strcpy(cPer, "PER = ");
strcpy(cMin, "MIN = ");
strcpy(cVal, "VAL = ");
strcpy(cMax, "MAX = ");
Serial.begin(57600);
delay(200);
}
void loop()
{
if(Serial.available())
{
b = Serial.read();
switch(b)
{
case '?' :
Serial.print("Ready !\n");
break;
case 'r' :
// CLEAR AND RUN
period = 0;
min_value = 20000;
value = 0;
max_value = 0;
ToStringAndPrint(cPer, period);
ToStringAndPrint(cMin,min_value);
ToStringAndPrint(cVal,value);
ToStringAndPrint(cMax,max_value);
Serial.print("Is running...\n");
run = true;
break;
case 's' :
// STOP
run = false;
Serial.print("Last values :\n");
ToStringAndPrint(cPer, period);
ToStringAndPrint(cMin,min_value);
ToStringAndPrint(cVal,value);
ToStringAndPrint(cMax,max_value);
break;
}
}
} |
Partager