HC-SR04 Ultrasonic Distance Sensor

This sketch shows how to connect HC-SR04 Ultrasonic Distance Sensor (or Range Finder) to the Z-Uno board. Distance value is read from sensor and reported periodically to channel Multilevel Sensor.

Two resistors are used to shift voltage from 5 V to 3 V. Z-Uno can survive 5 V input too, but it is not recommended.

Note that HC-SR04 is very sensItive to power supply. If power supply is not enough (to low current), HC-SR04 will return shorter distance.
  • Z-Uno board
  • Breadboard
  • HC-SR04 Ultrasonic Distance Sensor (like this or this)
  • 4 wires
  • 1 resistor 1 kΩ
  • 1 resistor 2.2 kΩ

Download Fritzing project
// HC-SR04 Ultrasonic Distance Sensor

ZUNO_SETUP_CHANNELS(
    ZUNO_SENSOR_MULTILEVEL(
        ZUNO_SENSOR_MULTILEVEL_TYPE_DISTANCE,
        0, // scale is meters
        SENSOR_MULTILEVEL_SIZE_TWO_BYTES,
        2, // two decimals after dot
        getter
    )
);

ZUNO_SETUP_ASSOCIATIONS(ZUNO_ASSOCIATION_GROUP_SET_VALUE); // to control other devices

int turn_on_distance_cm = 50; // Turn on light in CTRL_GROUP_1 if distance is < 50 cm

int readPin = 9;
int triggerPin = 10;
byte controlState = 0;
word lastValue;

void setup() {
  Serial.begin();
  pinMode(readPin, INPUT);
  pinMode(triggerPin, OUTPUT);
  digitalWrite(triggerPin, LOW);
}

void loop() {
  int tmp;

  // trigger measurement
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(10);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);

  // read pulse width
  tmp = pulseIn(readPin, HIGH, 100000);
  if (tmp != 0) {
    lastValue = tmp / 58; // convert to cm, see datasheet
    Serial.println(lastValue);
    
    // send On/Off to control group
    if (lastValue < turn_on_distance_cm && controlState == 0) {
      zunoSendToGroupSetValueCommand(CTRL_GROUP_1, 255);
      controlState = 255;
    } else if (lastValue >= turn_on_distance_cm && controlState == 255) {
      zunoSendToGroupSetValueCommand(CTRL_GROUP_1, 0);
      controlState = 0;
    }
    
    // send report to controller (Life Line group)
    zunoSendReport(1);
  }
  
  delay(1000);
}

word getter() {
  return lastValue;
}
Download this sketch