const int pwmPin = 11;
const int measurePin = 4;
volatile unsigned long start_time = 0, end_time = 0, delta_time = 0;
int flag_measure = 0;
unsigned long my_pulseIn(unsigned int pin, unsigned int value, unsigned int timeout) {
if(flag_measure) {
flag_measure = 0;
return delta_time;
}
}
void measure() {
unsigned int state = digitalRead(measurePin);
if(state) { // 상승엣지이면 if(state == HIGH)
start_time = micros();// 시작 시간 측정
}
else { // 하강엣지
end_time = micros();// 끝 시간 측정
delta_time = end_time - start_time;// 시간 간격 계산: 끝 시각 - 시작 시각
flag_measure = 1;
}
}
void setup() {
Serial.begin(9600);
pinMode(measurePin, INPUT);
pinMode(pwmPin, OUTPUT);
attachInterrupt(digitalPinToInterrupt(measurePin), measure, CHANGE);
analogWrite(pwmPin, 127);
}
void loop() {
unsigned long width = my_pulseIn(measurePin, HIGH, 4000); // 펄스너비 읽기
int out = map(width, 0, 2020, 0, 254); // PWM 범위로 변환
Serial.print(width);
Serial.print(".");
Serial.println(out);
delay(100);
}