照度センサで読み取った値を、ディスプレイに表示してみましょう。

これまでLEDの点灯だけで確認していた明るさを、数値として画面で見ることができるようになります。

センサの変化がリアルタイムでわかるので、プログラムの動きもより理解しやすくなります。

この方法を使えば、光だけでなく、温度や距離など、いろいろなセンサの情報も表示できるようになります。

サンプルプログラムはこちら

youtubeでも解説しているのでみてみてね

hqdefault



UIAPduino で照度センサを使おう

LEDを使って、照度センサの値を調べてみましょう。Lチカが終わった人向けです。


照度センサとは?

照度センサ(フォトトランジスタ)は、まわりの明るさを感じて電気の大きさに変える部品です。

  • 明るい → 電気がたくさん流れる
  • 暗い → 電気があまり流れない

この変化を使うことで、光の強さを「数値」で扱うことができます。


デジタルとアナログの違い

ボタンの入力は「HIGH / LOW」で表していましたが、 照度センサは「0〜1023」のような数値で明るさを表します。

デジタル入力 → ON / OFF の2択
アナログ入力 → 連続した数値(細かく変化)

センサの値を扱うときは、アナログ入力を使います。


配線しよう

今回使うセンサは NJL7302L-F5 です。


image1 (秋月電子 ¥110)


丸い形で、片側が少し欠けています。

  • 長い足(コレクタ) → 5V
  • 短い足(エミッタ) → A0ピン

さらに、A0ピンから10kΩの抵抗を通してGNDにつなぎます。

ボタンのときと同じように、プルダウン抵抗を使っています。

センサの値を安定して読み取るために必要な回路です。

image2


CdSセル

明るさを測るセンサには、「CdSセル(光抵抗)」という部品もあります。

sc8_601(秋月電子 ¥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が光れば成功です。


sc8_602




UIAPduino で センサの値をディスプレイに表示してみよう

照度センサで読み取った値を、OLEDディスプレイに表示してみましょう。

数値を画面で確認できるようになると、センサの動きがぐっと分かりやすくなります。


OLED(SSD1306)ディスプレイとは?

OLEDは、有機ELディスプレイのことです。電気を流すと、その部分が光ります。

今回使うディスプレイには、SSD1306というコントローラICが搭載されており、「I2C」という通信方法でデータを送ります。

0.96インチOLEDディスプレイモジュール (SSD1306) 128 ×64ドット

image3(電子工作ステーション ¥475)

I2C通信は、少ない本数の配線でデータをやりとりできる便利な仕組みです。


ピンの役割

  • GND:電気の戻り道(GNDへ)
  • VDD:電源(3.3Vまたは5V)
  • SCK:タイミング信号(SCLピンへ)
  • SDA:データ信号(SDAピンへ)

製品によってピンの名前が違うこともありますが、役割を見れば接続する場所が分かります。

  • 「3.3V / 5V」→ 電源
  • 「クロック」→ SCL
  • 「データ」→ SDA

UIAPduinoとの接続


UIAPduinoのピン配置図をみてみましょう。SDASCLと書かれたピンがあります。

UIAPduino-Pro-Micro-CH32V003-V1dot4-Pinout-Diagram (1)

次のように接続しましょう。

  • SDA → 3番ピン
  • SCL → 4番ピン

ライブラリを追加しよう

OLEDを簡単に使うために、ライブラリを追加します。

照度センサのプロジェクトフォルダに「oled_display.zip」を解凍しましょう。

この中にあるプログラムを使うことで、画面表示の処理を自分で書かなくても使えるようになります。

sc8_603

inoファイルと同じ階層におきます。解答してこんな風になっていればOK

ライブラリを追加すると、ArduinoIDEの上部にタブが表示されます。

中身を見ると、どんな処理が行われているか確認できます。

image5



ライブラリの読み込み

プログラムの一番はじめに、つぎのように書くことで、ライブラリを使うことができます。

■ サンプルコード
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の「ペン」とよく似ています。

毎回書き直すことで、画面が更新されていきます。

drawNumber( 表示したい数字 , x , y )
好きな数字を好きな場所に表示できます。
y座標は8ピクセルを1とかぞえます


動作確認

プログラムを書き込んで、ディスプレイに数値が表示されるか確認しましょう。

センサに手をかざしたり離したりして、数値がどのように変化するか観察してみましょう。


sc8_604


これで、センサの値をディスプレイに表示することができました!

目に見えなかった明るさの変化も、数値として確認できるようになりましたね。

表示のしかたを工夫すると、グラフにしたり、メッセージを出したりすることもできます。

いろいろな表示にチャレンジしてみましょう!



UIAPduinoのページ https://www.uiap.jp/uiapduino/pro-micro/ch32v003/ ディスプレイ表示に使用したライブラリ https://github.com/wagiminator/CH32V003-GameConsole/