可能是我在实现计时部分的逻辑实现的不够好,误差较大。

同样接好电路

开始编写代码,功能比较单一,因此代码也比较简单:

public class MainActivity extends IOIOActivity {

Button button;

private DigitalOutput led_;

private DigitalOutput vout;

private AnalogInput vin;

private TextView tv;

int flag,i;

long start,end;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button=(Button)findViewById(R.id.button);

tv=(TextView)findViewById(R.id.textView2);

}

class Looper extends BaseIOIOLooper {

@Override

protected void setup() throws ConnectionLostException {

led_ = ioio_.openDigitalOutput(0,true);

vout= ioio_.openDigitalOutput(1,true);

vin=ioio_.openAnalogInput(40);

}

@Override

public void loop() throws ConnectionLostException, InterruptedException {

//Thread.sleep(1);

vout.write(true);

if(vin.read()>0.5)

{

if(i==1)

{

start=System.nanoTime();

}

led_.write(true);

flag=2;

i++;

}

else

{

led_.write(false);

flag=flag-1;

end=System.nanoTime();

}

if(flag==1)

{

float time=end-start;

setNumber(time*340/2000000000);

flag=0;i=1;

}

}

}

@Override

protected IOIOLooper createIOIOLooper() {

return new Looper();

}

public void bt_Click(View v) throws ConnectionLostException{

led_.write(false);

vout.write(false);

flag=0;

i=1;

}

private void setNumber(float f) {

final String str = String.format("%.2f", f);

runOnUiThread(new Runnable() {

@Override

public void run() {

tv.setText("声波传递时间约为"+Float.parseFloat(str)*2000000000/340+"毫微秒,估算距离为"+str+"米");

}

});

}

}