スマート人数カウンターを作ろう:Androidアプリで制御
コンポーネントと用品
![]() |
Arduino UNO | ×1 |
| HC-06 Bluetoothモジュール | ×1 | |
![]() |
ブレッドボード(汎用) | ×2 |
![]() |
フォトレジスタ(光センサー) | ×3 |
| レーザーモジュール | ×3 | |
![]() |
ブザー | ×1 |
| RGB LEDモジュール | ×1 | |
![]() |
LED(汎用) | ×3 |
![]() |
抵抗 1kΩ | ×3 |
![]() |
抵抗 221Ω | ×3 |
| 電池 | ×1 | |
![]() |
ジャンパーワイヤー(汎用) | ×1 |
アプリとオンラインサービス
![]() |
Arduino IDE |
![]() |
MIT App Inventor |
このプロジェクトについて
説明
人数カウンターは、出入口を通過する人の数を検出するデバイスです。2週間の休暇で部屋を空ける際に部屋を守るため、また無許可で入室しようとする人への警告アラームとして、人数カウンターを作ろうと考えました。レーザーはその直進性の速さからLDR(光依存抵抗)と組み合わせて正確にカウントするのに最適なので、レーザーとLDRをカウント用に採用しました。私の部屋には3つの出入口(ドア2つと窓1つ)があるため、3つのレーザーと3つのLDRを使用しました。しかし、デバイスを遠隔操作してどの出入口のレーザーを有効にするか、アラームをオン/オフするかを選択できる必要があると気づきました。そこでHC-06 Bluetoothモジュールを追加し、自作のAndroidアプリでデバイスと通信できるようにしました。さらに、Androidアプリには観察したい出入口の通過人数を表示する機能も付けました。
私のプロジェクトと記事を支援してくださる場合は、こちらのウェブサイトをご覧ください :)


アプリの作成
Androidアプリを作成する方法はいくつかあります。HTMLからJavaへの変換やPythonでのプログラミングなどですが、MIT App Inventorはドラッグ&ドロップの構造で最も簡単です。ただし、現時点ではiOSには対応していません。
アプリ名は「People Counter!」で、Screen1とScreen2の2画面で構成されています。

Screen1(ホーム画面)

メイン画面へ進むためのホーム画面ですが、まずMIT App Inventorで設定したパスワードを正しく入力する必要があります(デフォルトパスワードは「counter」)。

Screen2(メイン画面)

Arduinoボードを制御するメニューと、Arduinoから送信される人数カウント結果が表示されるメイン画面です。
ここでどのレーザーをオンにするか、アラームをオン/オフするかを選択でき、さらに人数カウントの結果を見たり、カウントをゼロにリセットしたりできます。


レーザーとLDRを使った人数カウンターの作り方
レーザー(Light Amplification by Stimulated Emission of Radiation)は、基本的に光のパッケージを非常に直線的にターゲットへ送る装置です。LDR(光依存抵抗)は、レーザーが直接当たっているときに光強度の増加を容易に検出できます。レーザーとLDRの間に障害物があると、LDRは光強度の減少を検出します。この最適レベルの範囲での減少をカウントできれば、人数カウンターになります。私のLDR実験によると、最適レベルの範囲は150〜350の間に設定する必要があります。

接続
- Arduino Uno - モジュール
- Pin 2 --------- Laser_Module_1
- Pin 3 -------- Laser_Module_2
- Pin 4 -------- Laser_Module_3
- Pin 5 -------- Buzzer
- Pin 6 -------- HC-06 Bluetooth Module (TX)
- Pin 7 --------- HC-06 Bluetooth Module (RX)
- Pin 8 --------- Control_Led_1
- Pin 12 --------- Control_Led_2
- Pin 13 ---------- Control_Led_3
- Pin 9 ------- RGB_Module (R)
- Pin 10 ------ RGB_Module (G)
- Pin 11 ------- RGB_Module (B)
- A0 ------------ LDR_1
- A1 ------------- LDR_2
- A2 ------------ LDR_3

全ての部品を接続する前に、レーザーがLDRに直接向いていることを確認してください。
デバイスをテストし、テスト動画を撮影した後、3つの出入口用にデバイスを3つに分割しました。これを使い始めてから、部屋のセキュリティについて心配することはなくなりました。
コード
- PeopleCounter_with_Lasers.ino
PeopleCounter_with_Lasers.ino Arduino
/////////////////////////////////////////////
// Create a People Counter with Lasers
// on an Android Device
// by Kutluhan Aktar
/////////////////////////////////////////////
// レーザーとLDRを使って部屋に入る人数を検出し、Androidアプリで制御する人数カウンターを作成するプロジェクトです。
// LDRの片足を1kΩ抵抗でGNDに接続してください。
// レーザーがLDRに直接向くようにしてください。
// 正確な結果を得るには、LDRの最適レベルを正しく設定してください。
// 接続:
// Arduino Uno
// Laser_Module_1: Pin 2
// Laser_Module_2: Pin 3
// Laser_Module_3: Pin 4
// Buzzer: Pin 5
// HC-06 Bluetooth Module: Pin 6 (TX), Pin 7 (RX)
// Control_Led_1: Pin 8
// Control_Led_2: Pin 12
// Control_Led_3: Pin 13
// RGB_Module: Pin 9 (R), Pin 10 (G), Pin 11 (B)
// LDR_1: A0, LDR_2: A1, LDR_3: A2
#include <SoftwareSerial.h>
int LaserPin_1 = 2;
int LaserPin_2 = 3;
int LaserPin_3 = 4;
int BuzzerPin = 5;
int Control_RX = 6;
int Control_TX = 7;
int RedPin = 9;
int GreenPin = 10;
int BluePin = 11;
int Control_Led_1 = 8;
int Control_Led_2 = 12;
int Control_Led_3 = 13;
int LDR_1 = A0;
int LDR_2 = A1;
int LDR_3 = A2;
int LDR_1_Read, LDR_2_Read, LDR_3_Read;
int Counter = 0;
volatile boolean Alarm_is_Activated = false;
volatile boolean Alarm_Initial = false;
volatile boolean Counter_Detect = false;
SoftwareSerial Control(Control_RX, Control_TX);
String Name = "Control";
int Password = 1111;
String Uart = "9600,0,0";
void setup() {
Serial.begin(9600);
Control.begin(9600);
// Change_BluetoothModule_Defaults(); // Bluetoothモジュールのデフォルト変更時のみ有効化
pinMode(LaserPin_1, OUTPUT);
pinMode(LaserPin_2, OUTPUT);
pinMode(LaserPin_3, OUTPUT);
pinMode(RedPin, OUTPUT);
pinMode(GreenPin, OUTPUT);
pinMode(BluePin, OUTPUT);
pinMode(Control_Led_1, OUTPUT);
pinMode(Control_Led_2, OUTPUT);
pinMode(Control_Led_3, OUTPUT);
}
void loop() {
get_Data_From_LDR();
if (Control.available()) {
char c = Control.read();
Serial.println(c);
Commands(c);
}
Set_Alarm();
Set_Counter();
}
void Commands(char i) {
switch (i) {
case '1': Control.print(Counter); break;
case '2': Alarm_is_Activated = true; break;
case '3': Alarm_is_Activated = false; break;
case '4': digitalWrite(LaserPin_1, HIGH); digitalWrite(Control_Led_1, HIGH); break;
case '5': digitalWrite(LaserPin_1, LOW); digitalWrite(Control_Led_1, LOW); break;
case '6': digitalWrite(LaserPin_2, HIGH); digitalWrite(Control_Led_2, HIGH); break;
case '7': digitalWrite(LaserPin_2, LOW); digitalWrite(Control_Led_2, LOW); break;
case '8': digitalWrite(LaserPin_3, HIGH); digitalWrite(Control_Led_3, HIGH); break;
case '9': digitalWrite(LaserPin_3, LOW); digitalWrite(Control_Led_3, LOW); break;
case 'r': Counter = 0; break;
}
}
void get_Data_From_LDR() {
LDR_1_Read = analogRead(LDR_1);
LDR_2_Read = analogRead(LDR_2);
LDR_3_Read = analogRead(LDR_3);
}
void Set_Counter() {
if (LDR_1_Read < 150 || LDR_2_Read < 150 || LDR_3_Read < 150) {
Counter_Detect = true;
} else {
Counter_Detect = false;
}
if (Counter_Detect == true) {
Counter = Counter + 1;
delay(500);
}
if (Counter_Detect == false) {
Counter = Counter;
}
}
void Set_Alarm() {
if (Alarm_is_Activated == true) {
if (LDR_1_Read < 150 || LDR_2_Read < 150 || LDR_3_Read < 150) {
Alarm_Initial = true;
} else {
Alarm_Initial = false;
}
if (Alarm_Initial == true) {
tone(BuzzerPin, 500);
Color_Change(255, 0, 0); delay(50);
Color_Change(0, 255, 0); delay(50);
Color_Change(0, 0, 255); delay(50);
Color_Change(255, 255, 0); delay(50);
Color_Change(80, 0, 80); delay(50);
Color_Change(0, 255, 255); delay(50);
Color_Change(255, 255, 255); delay(50);
}
}
if (Alarm_is_Activated == false || Alarm_Initial == false) {
noTone(BuzzerPin);
Color_Change(0, 0, 0);
}
}
void Color_Change(int red, int green, int blue) {
red = 255 - red;
green = 255 - green;
blue = 255 - blue;
analogWrite(RedPin, red);
analogWrite(GreenPin, green);
analogWrite(BluePin, blue);
}
void Change_BluetoothModule_Defaults() {
Control.print("AT+NAME");
Control.println(Name);
Serial.print("Name is changed: ");
Serial.println(Name);
delay(2000);
Control.print("AT+PSWD");
Control.println(Password);
Serial.print("Password is changed: ");
Serial.println(Password);
delay(2000);
Control.print("AT+UART");
Control.println(Uart);
Serial.print("Baud rate is set: ");
Serial.println(Uart);
delay(2000);
Serial.println("Task is completed.");
}
製造プロセス
- 温度制御ファンサーキット:メディア家具冷却用DIYリレーシステム
- Raspberry Pi でジェスチャー制御ロボットを構築 – 加速度センサーと RF 通信でハンドフリー操作
- Raspberry Pi & Android スマホで Wi-Fi 制御ロボットを構築
- 3D RGB アルドゥクロック:Bluetooth対応LED時計(RTC内蔵)
- Wi-FiでNeoPixel LEDストリップを制御:ESP8266とAndroidアプリで炎エフェクト
- Android加速度センサーで操作するラジコン車両:Raspberry Pi・Arduino・モーターシールド連携
- ラズベリーパイとNode-REDでAlexaからLEDを制御する - 簡単ステップバイステップガイド
- 川の健康を見守る:Arduinoベース水質監視システム「MyRiver」
- Arduinoとジョイスティックでインタラクティブゲーム – LEDフィードバック付き
- Windows 10 UWP向けPM2.5/PM10大気質検知アプリの設計
- バレンタインデーの贈り物:DIY 交際日数カウンター









