本想用超音波發射和接收器,直接偵測水面的高低,不過想到解析度可能沒那麼高,於是換了別的想法。
用光線來偵測好了,基本原則就是光線水面下打上來,另外擺一個偵測器在水面上偵測光照的改變量。
第一個想到的是光敏電阻,不過光敏電阻的響應時間太長,我覺得不太適用。於是改用了兩種組合,
第一種水面下放超亮白LED燈,水面上用光電二極體SP1KL,呈現結果就如下面影片囉。
接法是參考這邊的簡單接法,SP1KL的Datasheet在此。

第二種則是水面下放紅外線LED,水面上則是用紅外線接收的光電二極體,我覺得這個效果比較好。

LED要讓它放在水裡,一定要作防水,我找了相機的防水盒,就把光源放在裡頭。

不過目前還沒想到怎麼固定在水下,所以測試時暫時用手壓著。

至於Arduino裡的寫法,非常簡單,就這樣。最後用終端機接收後,把資料複製下來就可以作進一步利用了。
int sensorPin = 0;
int val =0;
unsigned long time;
void setup()
{
Serial.begin(9600);
}
void loop()
{
time=millis();
val = analogRead(sensorPin);
Serial.print(time);
Serial.print(',');
Serial.println(val);
}