スケッチ
次のようなスケッチを導入してあります。
光センサーの近くに物体がある時には明るさの変化が激しいので、仕切りの間隔は均等でないようにしています。
ここでは、CdS セルではなく、光センサ(フォトトランジスタ)を利用しているために、Arduino と CdS と圧電スピーカを使ったテルミンもどき楽器とはプログラムを少し変え、抵抗値も100kΩに変えています。
#include <Tone.h>
#include <math.h>
Tone notePlayer;
int val = 0;
int maxv = 0;
int minv = 1024;
int note[]={ 262, 294, 330, 349, 393, 440, 494, 523};
int thre[]={minv,minv,minv,minv,minv,minv,minv,minv};
int sdelay=50; // sound length
int idelay=250; // interval length
void setup(void)
{
notePlayer.begin(13);
}
void loop(void)
{
int i;
val = analogRead(0);
if ( minv > val ){
minv = val;
}
if ( maxv < val ){
maxv = val;
}
for( i = 0; i < 8; i++ ){
//original: thre[i] = maxv - (int)((maxv-minv)*pow(((1.0*i+0.3)/7.5),0.1));
//linear: thre[i] = maxv - (int)( (maxv-minv)*((1.0*i+0.3)/7.5) );
thre[i] = maxv - (int)((maxv-minv)*pow(((1.0*i+0.1)/7.3),0.555));
}
// lesser : brighter
if ( val > thre[0] ){
notePlayer.play(note[0],sdelay);
}else if ( val > thre[1] ){
notePlayer.play(note[1],sdelay);
}else if ( val > thre[2] ){
notePlayer.play(note[2],sdelay);
}else if ( val > thre[3] ){
notePlayer.play(note[3],sdelay);
}else if ( val > thre[4] ){
notePlayer.play(note[4],sdelay);
}else if ( val > thre[5] ){
notePlayer.play(note[5],sdelay);
}else if ( val > thre[6] ){
notePlayer.play(note[6],sdelay);
}else if ( val > thre[7] ){
notePlayer.play(note[7],sdelay);
}
delay(idelay);
}