Arduino UNO + PCF8574P + 4pcs HC-SR04
I found a working code (tested by myself) for this exact task. Here it is:
http://cpre.kmutnb.ac.th/esl/learning/index.php?article=multi_hc-sr04_reading

Here's the code:

///////////////////////////////////////////////////////////////////////////////
// Author: RSP @ Embedded System Lab (ESL), KMUTNB, Bangkok/Thailand
// Date: 2015-05-25
// Board: Arduino with ATmega168/328P (5V/16MHz)
// Arduino IDE: version 1.0.6
// Description:
//   This Arduino Sketch demonstrates how to use an Arduino Uno
//   and a PCF8574A chip to interface with multiple ultrasonic distance 
//   sensor modules (up to 4 modules). 
///////////////////////////////////////////////////////////////////////////////

#include &lt;Wire.h&gt; // use the Wire library

// connect address pins: A0=0 (GND), A1=0 (GND), A2=0 (GND)
#define ADDR_BITS (0B000) // A0=0,A1=0,A2=0  
#define I2C_SLAVE_ADDR ((0B0111000) | ADDR_BITS) // 7-bit address

#define MAX_DISTANCE_IN_MM       (4000)   // max. valid value for distance
#define DURATION_TO_DISTANCE(x)  ((17*(x))/100) // usec -&gt; mm.

const int ECHO_PIN = 2; // D2 pin (External Interrupt 0)
const int TRIG_PIN = 4; // D4 pin
const int LED_PIN = 13; // D13 pin

volatile uint32_t tH, tL, pulse_width = 0;
uint16_t dist_mm;       // distance in mm.
char sbuf[32];          // used for sprintf()

void setup() {
   pinMode( LED_PIN, OUTPUT );
   Wire.begin();
   TWBR = 12; // for 400kHz
   writeOutput(0xF0);
   attachInterrupt( 0, eint_isr, CHANGE ); // D2 pin (EINT0)
   Serial.begin( 115200 );
   delay(1000);
}

void writeOutput( byte value ) { // write one byte
  Wire.beginTransmission( I2C_SLAVE_ADDR );
  Wire.write( value ); 
  Wire.endTransmission();
}

byte readInput( void ) { // read one byte
  byte data = 0xff;
  Wire.requestFrom( I2C_SLAVE_ADDR, 1 ); 
  delayMicroseconds(4);
  if ( Wire.available() ) {
     data = Wire.read();
  }
  return data;
}

uint16_t read_ultrasonic_sensor( int pin ) {
  digitalWrite( LED_PIN, HIGH); 
  writeOutput( 0xF0 | (1 &lt;&lt; pin) );
  writeOutput( 0xF0 );
  pulse_width = 0;
  while ( pulse_width == 0 ) {}  // wait until pulse_width &gt; 0
  digitalWrite( LED_PIN, LOW ); 
  return DURATION_TO_DISTANCE( pulse_width ); 
}

void loop() {
  for (int i=0; i &lt; 2; i++ ) {
    dist_mm = read_ultrasonic_sensor( i );
    if ( dist_mm &gt; MAX_DISTANCE_IN_MM ) {
      Serial.println( "Out of range." );
    } else {
      sprintf( sbuf, "Sensor %d, %d.%1d cm", i, (dist_mm/10), (dist_mm%10) );
      Serial.println( sbuf );
    }
    delay(5);
  }
  delay( 250 );
}

volatile uint32_t timestamp;

void eint_isr() { // ISR for Ext. Interrupt
  timestamp = micros();  // read the timestamp (in microseconds)
  if ( digitalRead( ECHO_PIN ) == LOW ) { 
    tH = timestamp;
  } else { // HIGH
    tL = timestamp;
    pulse_width = (tL-tH);
  }
}

///////////////////////////////////////////////////////////////////////////////