照度センサで読み取った値を、ディスプレイに表示してみましょう。
これまでLEDの点灯だけで確認していた明るさを、数値として画面で見ることができるようになります。
センサの変化がリアルタイムでわかるので、プログラムの動きもより理解しやすくなります。
この方法を使えば、光だけでなく、温度や距離など、いろいろなセンサの情報も表示できるようになります。
サンプルプログラムはこちら
youtubeでも解説しているのでみてみてね
UIAPduino で照度センサを使おう
LEDを使って、照度センサの値を調べてみましょう。Lチカが終わった人向けです。
照度センサとは?
照度センサ(フォトトランジスタ)は、まわりの明るさを感じて電気の大きさに変える部品です。
- 明るい → 電気がたくさん流れる
- 暗い → 電気があまり流れない
この変化を使うことで、光の強さを「数値」で扱うことができます。
デジタルとアナログの違い
ボタンの入力は「HIGH / LOW」で表していましたが、 照度センサは「0〜1023」のような数値で明るさを表します。
デジタル入力 → ON / OFF の2択
アナログ入力 → 連続した数値(細かく変化)
センサの値を扱うときは、アナログ入力を使います。
配線しよう
今回使うセンサは NJL7302L-F5 です。
丸い形で、片側が少し欠けています。
- 長い足(コレクタ) → 5V
- 短い足(エミッタ) → A0ピン
さらに、A0ピンから10kΩの抵抗を通してGNDにつなぎます。
ボタンのときと同じように、プルダウン抵抗を使っています。
CdSセル
明るさを測るセンサには、「CdSセル(光抵抗)」という部品もあります。
(秋月電子 ¥30)
今回使っているフォトトランジスタとは仕組みが少し違いますが、
どちらも「明るさによって電気の流れ方が変わる」という点は同じです。
- フォトトランジスタ → 光で電流が変化する
- CdSセル → 光で抵抗の大きさが変化する
そのため、どちらも同じように明るさセンサとして使うことができます。
プログラムを書こう
#define SENSOR A0
#define LED 2
int line = 200; // 明るい・暗いの境界線
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
int light = analogRead(SENSOR); //センサーの値をよむ
if (light < line) {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
}
アナログピンの指定
LEDなどは「2」などの数字でピン番号を指定していましたが、
センサは「A0」のようにアナログピンを指定します。
デジタルピンでは細かい数値を扱えないため、センサの値はアナログピンで読み取ります。
analogRead() を使うと、0〜1023の範囲で値を取得できます。
数字が小さいほど暗く、大きいほど明るいと判断できます。
しきい値(line)を調整しよう
line に入れている値は、明るい・暗いを分けるための基準です。
この値は環境によって変わるので、実際に試しながら調整してみましょう。
- LEDがつかない → line を大きくする
- LEDがつきっぱなし → line を小さくする
動作確認
マイコンにプログラムを書き込んで試してみましょう。
センサに手をかざして暗くしたときに、LEDが光れば成功です。
UIAPduino で センサの値をディスプレイに表示してみよう
照度センサで読み取った値を、OLEDディスプレイに表示してみましょう。
数値を画面で確認できるようになると、センサの動きがぐっと分かりやすくなります。
OLED(SSD1306)ディスプレイとは?
OLEDは、有機ELディスプレイのことです。電気を流すと、その部分が光ります。
今回使うディスプレイには、SSD1306というコントローラICが搭載されており、「I2C」という通信方法でデータを送ります。
0.96インチOLEDディスプレイモジュール (SSD1306)
128 ×64ドット
I2C通信は、少ない本数の配線でデータをやりとりできる便利な仕組みです。
ピンの役割
- GND:電気の戻り道(GNDへ)
- VDD:電源(3.3Vまたは5V)
- SCK:タイミング信号(SCLピンへ)
- SDA:データ信号(SDAピンへ)
製品によってピンの名前が違うこともありますが、役割を見れば接続する場所が分かります。
- 「3.3V / 5V」→ 電源
- 「クロック」→ SCL
- 「データ」→ SDA
UIAPduinoとの接続
UIAPduinoのピン配置図をみてみましょう。SDAとSCLと書かれたピンがあります。
次のように接続しましょう。
- SDA → 3番ピン
- SCL → 4番ピン
ライブラリを追加しよう
OLEDを簡単に使うために、ライブラリを追加します。
照度センサのプロジェクトフォルダに「oled_display.zip」を解凍しましょう。
この中にあるプログラムを使うことで、画面表示の処理を自分で書かなくても使えるようになります。
inoファイルと同じ階層におきます。解答してこんな風になっていればOK
ライブラリの読み込み
プログラムの一番はじめに、つぎのように書くことで、ライブラリを使うことができます。
extern "C" {
#include "oled_min.h"
}
#include "display.h"
C言語とC++では宣言の書き方が違うため、このように分けて書きます。
extern "C" をつけないと、Cのプログラムが正しく動かないことがあります。
センサの値を表示してみよう
照度センサのプログラムに、赤字のプログラムを追加しましょう。
extern "C" {
#include "oled_min.h" //Cのプログラム
}
#include "display.h" //C++のプログラム
#define SENSOR A0
#define LED 2
int line = 200;
void setup() {
pinMode(LED, OUTPUT);
OLED_init();
}
void loop() {
int light = analogRead(SENSOR);
OLED_fill(0x00); // 画面をクリア
drawNumber(light, 0, 0); // 数値を表示
delay(100);
if (light < line) {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
}
表示の仕組み
OLEDは、毎回「消す → 書く」を繰り返して画面を更新しています。
- OLED_fill(0x00) → 画面をまっ黒にする
- drawNumber() → 数字を描画する
この仕組みは、Scratchの「ペン」とよく似ています。
毎回書き直すことで、画面が更新されていきます。
好きな数字を好きな場所に表示できます。
y座標は8ピクセルを1とかぞえます
動作確認
プログラムを書き込んで、ディスプレイに数値が表示されるか確認しましょう。
センサに手をかざしたり離したりして、数値がどのように変化するか観察してみましょう。
これで、センサの値をディスプレイに表示することができました!
目に見えなかった明るさの変化も、数値として確認できるようになりましたね。
表示のしかたを工夫すると、グラフにしたり、メッセージを出したりすることもできます。
いろいろな表示にチャレンジしてみましょう!
UIAPduinoのページ
https://www.uiap.jp/uiapduino/pro-micro/ch32v003/
ディスプレイ表示に使用したライブラリ
https://github.com/wagiminator/CH32V003-GameConsole/

(電子工作ステーション ¥475)
コメント