M5Stack and I2C distance sensor ks103



  • Hi all, I'm trying to work with This I2C sensor and with the followin sketch:

    #include <Wire.h>
    #define KS103ADD  0x74
    word distance = 0;
    void setup()
    {
    //    Wire.begin();
      Wire.begin(22, 21);//M5STACK: SCL,SDA giallo,bianco
      Serial.begin(115200);
      Wire.beginTransmission(KS103ADD);
      Wire.write(byte(0x02));
      Wire.write(0x72);   // 发送降噪指令
      Wire.endTransmission();
      delay(1000);
    }
    void loop()
    {
      if (Serial.read() == 's') {
        while (Serial.read() != 'o') {
          KS103_read();
          Serial.print(distance);
          Serial.print("mm");
          Serial.println();
          delay(250);
        }
      }
      delay(1000);
    }
    
    word KS103_read() {
      Wire.beginTransmission(KS103ADD);
      Wire.write(byte(0x02));
      Wire.write(0xbc);     //Range is set to 10m with temperature compensation
      Wire.endTransmission();
      delay(1);
      Wire.beginTransmission(KS103ADD);
      Wire.write(byte(0x02));
      Wire.endTransmission();
      Wire.requestFrom(KS103ADD, 2);
      if (2 <= Wire.available())
      {
        distance = Wire.read();
        distance =  distance << 8;
        distance |= Wire.read();
      }
    }
    
    

    I have this output:

    0mm
    0mm
    0mm
    0mm
    0mm
    0mm
    0mm
    0mm
    0mm
    0mm
    0mm
    
    

    My question is:
    are they present the pull-up resistors in the M5Stack (black 2018.3) I2C section?



  • now it works:

    /*
       http://www.dauxi.com/KS10X-V110_EN.pdf
    
       11101000
       https://www.arduino.cc/en/Tutorial/SFRRangerReader
    
    
    */
    #include <M5Stack.h>
    #include <Wire.h>
    
    #define KS103ADD  0x74 // questo è quello che da lo scanner IIC
    //#define KS103ADD  0xE8 // questo è quello che da all'inizio il led verde 11101000    back green led Short flash twice will be “1”, slow flash once will be “0”
    word dist = 0;
    void setup()
    {
      Wire.begin();
    //    Wire.begin(22, 21);//M5STACK: 22/SCL/GIALLO ,21/SDA/BIANCO
      Serial.begin(115200);
      //inizio comando
      Wire.beginTransmission(KS103ADD);
      Wire.write(byte(0x02));
      Wire.write(0x72);   // Invia istruzioni per la riduzione del rumore
      Wire.endTransmission();
      // fine comando
      delay(2000);
    }
    void loop()
    {
      // if (Serial.read() == 's') {
      //  while (Serial.read() != 'o') {
      KS103_read();
      Serial.print(dist/10);
      Serial.print(" cm");
      Serial.println();
      delay(250);
      //}
      //}
      // delay(1000);
    }
    
    void KS103_read() {
      // step 1: instruct sensor to read echoes
      Wire.beginTransmission(KS103ADD);  // transmit to device
      // the address specified in the datasheet is (0xE8)
      // but i2c adressing uses the high 7 bits so it's  (0x74)
      Wire.write(byte(0x02)); // sets register pointer to echo #1 register (0x02)
      Wire.write(0xbc);     //Range is set to 10m with temperature compensation
      Wire.endTransmission();
    
      // step 2: wait for readings to happen
      //  delay(1);
      delay(70);   // datasheet suggests at least 65 milliseconds
    
      // step 3: instruct sensor to return a particular echo reading
      Wire.beginTransmission(KS103ADD);  // transmit to device 
      Wire.write(byte(0x02));  // sets register pointer to echo #1 register (0x02)
      Wire.endTransmission();  // stop transmitting
    
      // step 4: request reading from sensor
      Wire.requestFrom(KS103ADD, 2);  // request 2 bytes from slave device
    
      // step 5: receive reading from sensor
      if (2 <= Wire.available()) // if two bytes were received
      {
        dist = Wire.read(); // receive high byte (overwrites previous reading)
        dist =  dist << 8;  // shift high byte to be high 8 bits
        dist |= Wire.read(); // receive low byte as lower 8 bits
      }
    }