function main() { server.log("Main function..."); photo_pin <- hardware.pin7; photo_pin.configure(ANALOG_IN); flash_pin <- hardware.pin8; flash_pin.configure(DIGITAL_OUT); flash_pin.write(0); led_pin <- hardware.pin2; led_pin.configure(DIGITAL_OUT); led_pin.write(0); local flash_delay = 0.2; local sensitivity = 0.3; function setFlashDelay(delay) { flash_delay = delay / 1000.0; server.log("Set flash delay: " + flash_delay); } function setSensitivity(sense) { sensitivity = sense / 100.0; server.log("Set sense sensitivity: " + sensitivity); } agent.on("set.delay", setFlashDelay); agent.on("set.sensitivity", setSensitivity); function getLightLevel() { local photo1 = photo_pin.read(); led_pin.write(1); imp.sleep(0.0001); local photo2 = photo_pin.read(); led_pin.write(0); local light_diff = photo1 - photo2; // the smaller the value, the bigger the obstacle; 0 with opaque obstacle return light_diff } local light_level_mean = getLightLevel(); function fireTheFlash() { flash_pin.write(1); imp.sleep(0.1); flash_pin.write(0); light_level_mean = getLightLevel(); adjustLightMean(); } function adjustLightMean() { local light_level = getLightLevel(); if ((light_level + (light_level * (sensitivity / 2.0))) < light_level_mean) { light_level_mean = (light_level_mean * 0.9) + (light_level * 0.1) imp.wakeup(0.1, adjustLightMean); } else { imp.wakeup(0.1, checkLightBeam); } } function checkLightBeam() { local light_level = getLightLevel(); //server.log("checkLightBeam: "+ light_level +", "+ light_level_mean); if ((light_level + (light_level * sensitivity)) < light_level_mean) { // obstacle detected imp.wakeup(flash_delay, fireTheFlash); } else { light_level_mean = (light_level_mean * 0.999) + (light_level * 0.001) imp.wakeup(0.001, checkLightBeam); } } adjustLightMean(); } main();