Arduino Unoサンプルプログラム:Switch Case

この例では、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」のどちらかが表示されない場合は、再度キャリブレーションを行い、数値が変化しているかどうかを確認してください。

初期コード配線図

SwitchCase(Basic)

拡張コード

拡張コードでは、回路に数個の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

}

拡張コード配線図

SwitchCase(added)

部品表

カートへのリンク: https://www.digikey.jp/short/2t4z7jp0




オリジナル・ソース(英語)