/* Me_Line_Follower_Array_v1.0
 *  https://ardubotics.eu/en/electronic-modules-and-accessories/1864-makeblock-me-line-follower-array.html
 *  - http://download.makeblock.com/Modules/Me%20Line%20Follower%20Array/Sample_program.ino
 */
const int DataPin = 2;
uint8_t Sensor_Data[3];

void setup() {
    Serial.begin(9600);  delay(100);  Serial.println("\### Me Line Follower V1.0 ###\n Start.....");
}

void loop() {
    unsigned long start = millis();
    byte v = getValue();
    unsigned long ende = millis();
    Serial.print(v,BIN);  Serial.print(" ");  Serial.println(ende-start);  // Dauer etwa 3 bis 4 ms
    delay(100);
}

uint8_t getValue()  {  
    long time_out_flag = 0;
    pinMode(DataPin, OUTPUT);
    digitalWrite(DataPin, LOW);
    delayMicroseconds(980);
    digitalWrite(DataPin, HIGH);
    delayMicroseconds(40);
    pinMode(DataPin, INPUT_PULLUP);
    delayMicroseconds(50); 
    time_out_flag = millis();
    while((digitalRead(DataPin) == 0)&&((millis() - time_out_flag) < 6)); 
    time_out_flag = millis();
    while((digitalRead(DataPin) == 1)&&((millis() - time_out_flag) < 6));
    for(uint8_t k=0; k<3; k++) {
        Sensor_Data[k] = 0x00;
        for(uint8_t i=0;i<8;i++) {
            time_out_flag = millis(); 
            while (digitalRead(DataPin) == 0&&((millis() - time_out_flag) < 6));
            uint32_t HIGH_level_read_time = micros();
            time_out_flag = millis(); 
            while (digitalRead(DataPin) == 1&&((millis() - time_out_flag) < 6));
            HIGH_level_read_time = micros() - HIGH_level_read_time;
            if(HIGH_level_read_time > 50 && HIGH_level_read_time < 100)  {
                Sensor_Data[k] |= (0x80 >> i);
            }
        }
    }
    if (Sensor_Data[1] == (uint8_t)(~(uint8_t)Sensor_Data[0]))  {
       return Sensor_Data[0];
    }
}