#define UNTIL_HIGH(sig) while (digitalRead(sig) == LOW) delayMicroseconds(1) #define UNTIL_LOW(sig) while (digitalRead(sig) == HIGH) delayMicroseconds(1) #define FOR_HIGH(sig) UNTIL_LOW(sig) #define FOR_LOW(sig) UNTIL_HIGH(sig) const int sig = 2; int idx = 0; char bits[300]; int du[300]; void setup() { Serial.begin(115200); pinMode(sig, INPUT); } void loop() { while (1) { // Wait for HIGH UNTIL_HIGH(sig); // HIGH duration unsigned long current_usec = micros(); FOR_HIGH(sig); unsigned long t = micros() - current_usec; if (t > 1200) break; // LOW duration current_usec = micros(); FOR_LOW(sig); t = micros() - current_usec; if (t > 4600) break; idx = 0; unsigned long start_usec = micros(); while ((micros() - start_usec) < 33000) { // HIGH duration current_usec = micros(); FOR_HIGH(sig); t = micros() - current_usec; //Serial.print(t); Serial.print(", "); if(t > 150) bits[idx] = '1'; else bits[idx] = '0'; FOR_LOW(sig); idx++; } for (int k = 0; k < idx; k++) { Serial.print(bits[k]); //Serial.print(du[k]); Serial.print(", "); } Serial.println("*"); break; } // delay(1); }