この例では、switch case文の使い方を学びます。switch case文は、複数のif文の代わりに使用します。switch caseを使用する場合、プログラムはある変数(下の例では「range」)を受け取り、それをいくつかのcaseと比較します。そして、一致するcaseを選択し、その下に記載されているコードを実行した後、先頭に戻って再びコードをループさせます。下の例では、「range」を0~3の数字にマッピングしています。プログラムがswitch case文にたどり着くと、変数「range」と4つのcaseを比較して、どのコードに従うかを選択します。コードが実行されると、breakコマンドが実行され、再びプログラムのループを開始します。コードにbreakを入れないと、次のcaseのコマンドまで実行されてしまうので、breakを入れることはとても重要です。
最初のサンプルコード
// sensor minimum, discovered through experiment const int sensorMin = 320;
// sensor maximum, discovered through experiment
const int sensorMax = 870;void setup() {
// Begin serial communication
Serial.begin(9600);
}void loop() {
// read the photocell and store it in the variable int sensorReading = analogRead(A0); /* I added the following line to the example code to calibrate the photocell in the following section*/ //Print the reading from the photoresistor to the serial monitor. This will be used to set the // Serial.println(sensorReading); constants sensorMin and sensorMax. // map the sensor range to a range of four options int range = map(sensorReading, sensorMin, sensorMax, 0, 3); switch (range) { // this Switch case is used to choose which option to follow. Above we mapped it into 4 selections, 0-4 case 0: // your hand is on the sensor // write dark on the serial monitor Serial.println("dark"); break; //used to break away from the code and recheck the variable case 1: // your hand is close to the sensor // write dim on the serial monitor Serial.println("dim"); break; case 2: // your hand is a few inches from the sensor // write medium on the serial monitor Serial.println("medium"); break; case 3: // your hand is nowhere near the sensor // write bright on the serial monitor Serial.println("bright"); break; } delay(1); // this will help the stability of the readings
}
フォトセルの定数を校正する
フォトセルの定数を校正するには、以下のサンプルコードのようにコードを設定します。
// sensor minimum, discovered through experiment const int sensorMin = 320;
// sensor maximum, discovered through experiment
const int sensorMax = 870;void setup() {
// Begin serial communication
Serial.begin(9600);
}void loop() {
// read the photocell and store it in the variable int sensorReading = analogRead(A0); //Print the reading from the photoresistor to the serial monitor. This will be used to set the constants sensorMin and sensorMax. Serial.println(sensorReading); // map the sensor range to a range of four options //int range = map(sensorReading, sensorMin, sensorMax, 0, 3); // switch (range) { // this Switch case is used to choose which option to follow. Above we mapped it into 4 selections, 0-4 // case 0: // your hand is on the sensor // write dark on the serial monitor // Serial.println("dark"); // break; //used to break away from the code and recheck the variable // case 1: // your hand is close to the sensor // write dim on the serial monitor // Serial.println("dim"); // break; // case 2: // your hand is a few inches from the sensor // write medium on the serial monitor // Serial.println("medium"); // break; // case 3: // your hand is nowhere near the sensor // } delay(1); // this will help the stability of the readings
}
上のコードのように設定したら、それをボードにロードしてシリアルモニタを開き、全光線が入った状態のフォトセルの値を記録します。次に、フォトセルを指で覆い、光が入らないようにし、その値を記録します。値を記録し終えたら、サンプルコードに移って正しく値を読み取る準備が完了です。
コードを元のサンプルコードに戻します。次に、sensorMin定数を、上記のキャリブレーションテストでセンサをカバーしたときに得られた最小の数値に変更します。次に、sensorMax定数を、センサのカバーを外して得られた最大の数値に変更します。次に、プログラムをArduinoボードにリロードします。
指をセンサに近づけると、センサが覆われていない状態では、シリアルモニタに「bright」と表示されていることに気づくはずです。センサに指をさらに近づけると、「medium」、「dim」と切り替わり、最終的にセンサを覆うと「dark」と表示されます。もし、シリアルモニタに「bright」「dark」のどちらかが表示されない場合は、再度キャリブレーションを行い、数値が変化しているかどうかを確認してください。
初期コード配線図
拡張コード
拡張コードでは、回路に数個のLEDを追加して、フォトセルで何が起こっているかを視覚的に表現します。11、12、13番ピンにはLEDと330Ωの抵抗を取り付けます。このプログラムでは、フォトセルがフルの明るさを感知すると、すべてのLEDが点灯します。暗くなるにつれ、LEDが1つずつ消灯していき、暗状態を感知するとすべてのLEDが消灯します。
// sensor minimum, discovered through experiment const int sensorMin = 320;
// sensor maximum, discovered through experiment
const int sensorMax = 870;void setup() {
// Begin serial communication
Serial.begin(9600);//Set pin 13 as an ouput pinMode(13, OUTPUT); // Set pin 12 as an output pinMode(12, OUTPUT); // Set pin 11 as an output pinMode(11, OUTPUT);
}
void loop() {
// read the photocell and store it in the variable int sensorReading = analogRead(A0); // map the sensor range to a range of four options int range = map(sensorReading, sensorMin, sensorMax, 0, 3); switch (range) { case 0: // your hand is on the sensor // write dark on the serial monitor Serial.println("dark"); // turn off all LEDs digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); break; case 1: // your hand is close to the sensor // write dim on the serial monitor Serial.println("dim"); // turn on just the LED connected to pin 11 digitalWrite(11, HIGH); digitalWrite(12, LOW); digitalWrite(13, LOW); break; case 2: // your hand is a few inches from the sensor // write medium on the serial monitor Serial.println("medium"); // turn on the LEDs connected to pins 11 and 12 digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, LOW); break; case 3: // your hand is nowhere near the sensor // write bright on the serial monitor Serial.println("bright"); // turn on all LEDs digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, HIGH); break; } delay(1); // this will help the stability of the readings
}
拡張コード配線図
部品表
カートへのリンク: https://www.digikey.jp/short/2t4z7jp0