Arduino自動夜間照明:LDRとリレーで作るシンプルなコードとProteusシミュレーション
Arduinoを用いた自動夜間照明─コード、動作、シミュレーション
自動化とは人間の労力を削減・排除する手法の発明を意味します。本チュートリアルでは、Arduinoとリレーの簡単なインターフェースで夜間照明を自動化し、Proteusソフトウェアでシミュレーションする方法を解説します。自動化はシンプルなサーモスタットによるボイラ制御から、大量の入出力データを扱う大規模産業管理まで適用範囲が広く、制御複雑度は基本的な「オン/オフ」から高度な多変数アルゴリズム(産業オートメーション)まで多岐にわたります。制御系は開ループ(単一入力パラメータ)または閉ループ(出力を入力にフィードバック)のいずれかです。
自動化のメリットとデメリット
メリット
- 生産性向上
- 予測可能な品質(品質改善)
- 堅牢性向上
- 出力の一貫性確保
- 人件費削減
- 高精度
- 単調作業からの人間解放
デメリット
- セキュリティ脅威への脆弱性
- 開発コストが予測超過の可能性
- 初期導入コスト高
- 多くの分野で雇用喪失の原因
メリットがデメリットを大きく上回るため、世界は自動化時代へ突入しています。
必要部品
- Arduino UNO
- リレー 5V
- LDR(光依存抵抗)
- 抵抗 10kΩ
- トランジスタ BC547
- DC電源 5V
- AC電源 220V
必要ソフトウェア
- Arduino IDE
- Proteus
自動夜間照明回路図

部品説明
Arduino UNO
Microchip ATmega328Pマイコンを搭載したオープンソース開発ボード。デジタル/アナログ入出力ピンを備え、拡張ボードや外部回路とインターフェース可能。14デジタルピン、6アナログピンをIDE(統合開発環境)でプログラム可能。USB Type-Bケーブルで書き込み。電源はUSBまたは12V DC。STK500プロトコル採用。FTDIチップ(USB-シリアル変換)非搭載が前身との主な違い。
リレー
電気的に動作する電磁スイッチ。Arduino出力のような低電圧(5V)でAC/DC家電をオン/オフ制御可能。金属接点付きコイル(低電圧側)が磁化/消磁し、高電圧側の回路を開閉。高電圧側はCOM(コモン)、NC(常時閉)、NO(常時開)の3ソケット。定格電圧は12V、9V、5V、3Vなど多様。
LDR
光強度変化に応じて抵抗値が変化する可変抵抗部品。光電導原理で動作。光強度増大で抵抗減少。光検知検出回路、光作動スイッチング回路に使用。高抵抗半導体で構成され、暗闇ではメガオーム級、光存在下では数百オーム。
BC547─NPNトランジスタ
半導体デバイスで信号/電力増幅またはスイッチングに使用。3端子で外部回路と接続。本回路ではNPNバイポーラ接合トランジスタBC547を使用。ベース端子の微小電流でエミッタ/コレクタの大電流を制御。増幅用途ではバイアスかけて常時オン状態にしエミッタから増幅信号取得。スイッチング用途ではベース信号ありで完全オン、なしで完全オフにバイアス設定。
定格
- VCEO = 45 Vdc
- IC = 100 mAdc
- VCBO = 50 Vdc
- VEBO = 6 Vdc
ソフトウェア説明
Proteus
電子設計自動化(EDA)用プロプライエタリソフト。回路図作成とPCBレイアウト生成に最適。イギリス・ヨークシャーのLabcenter Electronics Ltd.開発。英語、フランス語、スペイン語、中国語対応。定期的なライブラリ更新で先進部品追加可能。回路・マイコンシミュレーション機能が強力で、物理部品なしで動作検証可能。UIも優秀。1500万以上の部品ライブラリでフットプリント作成の手間不要。
Arduino IDE
クロスプラットフォーム対応のJava開発アプリケーション。Arduino互換ボードへのスケッチ書き込みが唯一の目的。対応言語はC/C++(ライブラリ依存で一部修正版)。組み込みライブラリ豊富、サードパーティ製も追加可能。avrdudeでコードをヘックスファイルに変換し、ボード搭載ローダーで書き込み。
プロジェクトコード
コード解説
グローバル整数変数2つを定義。analogINは回路からのアナログ値受信用アナログピン、triggerは十分な電圧でトリガ出力するデジタルピン。
int analogIN = A3;
int Trigger = 12;
ボーレート9600bps(データ伝送レート)設定。pinMode()でピン状態定義。ピン12を出力、ピンA3を入力に設定。これらはvoid setup()内に記述し、実行期間中1回のみ実行。
void setup() {
Serial.begin(9600);
pinMode(analogIN, INPUT);
pinMode(Trigger, OUTPUT);
}
回路図通り、ピンA3からアナログ値を読み取り。入力がアナログ値のためanalogRead()を使用(アナログピン・アナログ関数を使う理由)。読み取った値を変数"value"に格納。
この変数には0〜1023の整数値が入り(Arduinoは10ビットADC)、アナログ入力に応じて変化。"value"の値で条件分岐(if-else)し、デジタルピンTriggerをHIGH/LOWにしてランプ点灯/消灯。変数"value"をシリアル出力すれば、光強度とADC値を対応付け、望む光強度でランプ点灯可能。
void loop()内のコードはArduino通電中繰り返し実行されるため、24/7電源供給で常時動作可能。
void loop() {
int value = analogRead(analogIN);
Serial.println(value);
if (value < 692) {
digitalWrite(Trigger, HIGH);
Serial.println("lamp is ON");
} else {
digitalWrite(Trigger, LOW);
Serial.println("lamp is OFF");
}
}
コードのヘックスファイル場所取得方法
Arduino IDEで File → Preferences →「Show verbose output」の compilation と upload 両方にチェック。コードコンパイル後、下部ウィンドウに表示されるヘックスファイルパスをコピー。ProteusでArduinoをダブルクリックし、Program file にペーストしてOK。これでシミュレーション準備完了。
シミュレーション動画
近日公開予定
夜間照明回路の動作
5V DC電源(Arduinoの5V)で10kΩ抵抗とLDRを分圧回路接続。抵抗またはLDR両端電圧をArduinoアナログピンA3に入力。コードによりボードがアナログ入力を検知。この値はLDRが検知した光強度に対応。
シリアルモニタで値を確認し、光強度に合わせてキャリブレーション可能。コードの条件式を変更すれば、望む光強度でランプ「オン/オフ」の動的制御が可能。
条件式成立(光強度が設定閾値ADC値未満)でピン12から「HIGH」(5V)出力。ベース電圧が十分発生しトランジスタ導通。リレーコイルに電流流れリレー動作、NO端子がアクティブになりランプ回路完成でランプ「オン」。
光強度が閾値超過でelse分岐真になり、ピン12「LOW」→リレーOFF→ランプ「オフ」。
結論:
自動夜間照明で生活をより快適に。日中は消灯、暗くなれば自動点灯。基本電子部品で同等システムを自作可能。コード解説付きでArduino入門にも最適です。
産業技術
- Arduinoで作るモニター用Ambilightシステム:没入感アップの自作ガイド
- Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
- ArduinoとMAX30100で作るリアルタイムIoT心拍数モニター
- Arduino UNO WiFi Webサーバー:ブラウザからLEDをON/OFF制御
- Arduinoで自動化するChrome恐竜ゲーム – LDRとPythonで障害物を検知してジャンプ
- Arduino NanoとRDA5807Mで作るコンパクトFMラジオ
- ワイヤレスArduinoプログラミングシールド – HC-05 BluetoothでUSBケーブル不要に
- Arduino UNOで作る静電容量式タッチLEDスイッチ - 簡単DIY
- ArduinoとOpenCVで作るリアルタイム顔追跡システム
- 自動工具交換装置の仕組み:包括的ガイド
- メーカーがローコード自動化でEコマースフルフィルメントを拡張する方法