microrobotics icon

TFMini I2C

microrobotics | PRO | 03/11/24 07:59:34 AM UTC | 0 ⭐ | 13466 👁️ | Never ⏰ | []
Arduino |

3.11 KB

|

None

|

0 👍

/

0 👎

#include <Arduino.h>
#include <Wire.h>
 
const uint8_t SENSOR_ADDRESS = 0x10; // TFMini I2C Address
const uint8_t DISTANCE_DATA_LENGTH = 7; // Data length for distance data request
const uint8_t MAX_RETRY_COUNT = 3; // Maximum number of retries for reading data
const uint16_t UNRELIABLE_DATA = 0xFFFF; // Indicating unreliable data
 
struct SensorData {
  uint16_t distance;  // Measured distance
  uint16_t strength;  // Signal strength
  uint8_t rangeType;  // Range scale: 0 (short), 3 (intermediate), 7 (long)
  bool isValid;       // Flag to indicate if the data is valid
};
 
unsigned long readFrequencyMillis = 50; // Default read frequency: 50 ms
 
void setup() {
  Wire.begin();
  Serial.begin(115200);
  Serial.println("TFMini I2C Test");
}
 
void loop() {
  static unsigned long lastReadTime = 0; // Tracks the last read time
  unsigned long currentTime = millis(); // Current time
 
  if (currentTime - lastReadTime >= readFrequencyMillis) {
    SensorData data = tryReadSensorData(SENSOR_ADDRESS, MAX_RETRY_COUNT);
 
    if (data.isValid && data.distance != UNRELIABLE_DATA) {
      Serial.print("\tDist[");
      Serial.print(data.distance);
      Serial.print("]\tStrength[");
      Serial.print(data.strength);
      Serial.print("]\tMode[");
      Serial.print(data.rangeType);
      Serial.println("]");
    }
 
    lastReadTime = currentTime; // Update the last read time
  }
}
 
void setReadFrequency(unsigned long frequencyMillis) {
  readFrequencyMillis = frequencyMillis;
}
 
SensorData tryReadSensorData(uint8_t deviceAddress, uint8_t retries) {
  while (retries--) {
    SensorData data = readSensorData(deviceAddress);
    if (data.isValid) {
      return data; // Valid data received
    }
    delay(10); // Wait a bit before retrying
  }
  return SensorData{0, 0, 0, false}; // Return invalid data after exhausting retries
}
 
SensorData readSensorData(uint8_t deviceAddress) {
  SensorData data = {0, 0, 0, false};
 
  Wire.beginTransmission(deviceAddress);
  Wire.write(0x01); // MSB
  Wire.write(0x02); // LSB
  Wire.write(DISTANCE_DATA_LENGTH); // Request distance data
  if (Wire.endTransmission(false) != 0) {
    return data; // Sensor did not acknowledge
  }
 
  Wire.requestFrom(deviceAddress, DISTANCE_DATA_LENGTH);
  if (Wire.available() < DISTANCE_DATA_LENGTH) {
    return data; // Not enough data available
  }
 
  for (uint8_t i = 0; i < DISTANCE_DATA_LENGTH; i++) {
    uint8_t incoming = Wire.read();
    switch (i) {
      case 0:
        data.isValid = (incoming == 0x01);
        break;
      case 2:
        data.distance = incoming; // LSB of the distance
        break;
      case 3:
        data.distance |= incoming << 8; // MSB of the distance
        if (data.distance == UNRELIABLE_DATA) {
          data.isValid = false;
        }
        break;
      case 4:
        data.strength = incoming; // LSB of signal strength
        break;
      case 5:
        data.strength |= incoming << 8; // MSB of signal strength
        break;
      case 6:
        data.rangeType = incoming; // Range scale
        break;
    }
  }
  return data;
}
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎