#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);
}