IoTスマート街路灯:インテリジェントで省エネなLEDシステム
部品と材料
| Arduino UNO WiFi Rev.2 | ×1 |
| LED(汎用) | ×1 |
| LDR(光依存抵抗)1MΩ | ×1 |
| Digilent IR近接センサー | ×1 |
| Espressif ESP8266 ESP-12E | ×1 |
| 抵抗 1kΩ | ×1 |
必要な工具と機械
- ブレッドボード 170ピン
アプリとオンラインサービス
- Arduino IDE
- ThingSpeak API
プロジェクト概要
問題定義
前述の通り、多くの都市で街路灯は都市の巨大な支出の一つです。ナトリウム蒸気ランプは消費電力が大きく、莫大なコストがかかります。街路灯にかかる費用を国家の他の開発に回せます。現在は手動システムで、夕方に点灯、朝に消灯という運用です。このため点灯・消灯の間に大量のエネルギーが浪費されます。これが自動システムへの移行の主な原因の一つで、電力浪費が少なく、多くの金銭的コストを削減できます。既存システムのその他のデメリットは以下の通り。
既存システムのデメリット
- 街路灯の手動オン/オフ切り替え
- エネルギー消費が多い
- 高コスト
- 多くの人手が必要
提案システムのメリット
光センサーによる自動化で、エネルギー節約と安全確保だけでなく、さらなるメリットがあります。
- 街路灯の自動オン/オフ切り替え
- メンテナンスコスト削減
- CO₂排出量削減
- 光害削減
- ワイヤレス通信
- 省エネ
- 人手削減
A. LDR入力
光依存抵抗(LDR)はフォトレジスタとも呼ばれ、抵抗率が電磁放射の関数となるデバイスです。つまり人間の目と同様に光に敏感なデバイスです。フォトコンダクター、導電セル、単にフォトセルとも呼ばれます。高抵抗の半導体材料で作られています。LDRは光伝導の原理で動作します。光伝導とは、物質が光を吸収すると伝導率が低下する光学現象です。しかし、光がLDRに当たると抵抗が下がり、電流が最初のトランジスタのベース、次に2番目のトランジスタのベースへ流れます。プリセット抵抗で抵抗を上げ下げして、回路の感度を調整できます。LDRがArduinoに応答を送ります。
B. IRセンサー
赤外線センサーは、赤外線を放射および/または検出することで周囲の特定の特性を検知する電子機器です。物体の熱を測定し、動きを検知することもできます。赤外線は人間の目に見えません。電磁スペクトルでは、赤外線は可視光より波長が長く、マイクロ波より短い領域です。赤外線領域は約0.75〜1000µmです。IRセンサーは赤外線を検出し、電流に変換、電圧または電流検出器で検知します。IRセンサーがArduinoに応答を送ります。
C. LED
発光ダイオード(LED)は、活性化すると光を発する接合ダイオードです。両端に電圧をかけると、電子がLED内部の正孔と再結合し、光子の形でエネルギーを放出して光ります。つまり、2端子の半導体光源です。
LEDは照明システムを表し、発光量は環境光量と直接関係します。外部光が少なければLEDは最大強度で発光し、逆もまた然り。
D. ESP8266
ESP8266はEspressif Systemsが開発したWi-Fi搭載のSoC(System on Chip)モジュールです。主にIoT(モノのインターネット)組み込みアプリケーションの開発に使用されます。
ESP8266の機能:
- 2.4GHz Wi-Fi (802.11 b/g/n、WPA/WPA2対応)
- 汎用入出力(16 GPIO)
- I²Cシリアル通信プロトコル
- 10ビットADC(アナログ-デジタル変換)
- SPIシリアル通信プロトコル
- I²Sインターフェース(DMA対応、GPIOとピン共有)
- UART(専用ピン、GPIO2で送信専用UARTも有効化可能)
- PWM(パルス幅変調)
Tensilica Xtensa L106ベースの32ビットRISC CPUを採用、80MHz動作(オーバークロックで160MHz)。64KBブートROM、64KB命令RAM、96KBデータRAM。外部フラッシュメモリはSPIでアクセス可能。
ESP8266モジュールは低コストのスタンドアロン無線トランシーバーで、エンドポイントIoT開発に使用できます。
ESP8266モジュールと通信するには、マイクロコントローラーがATコマンドセットを使用する必要があります。マイクロコントローラーは指定ボーレートのUARTでESP8266-01モジュールと通信します。
多くのサードパーティ製造業者がこのチップベースの様々なモジュールを生産しているため、ピン構成も様々です:
- ESP-01:8ピン(2 GPIO)、PCBトレースアンテナ
- ESP-02:8ピン(3 GPIO)、U-FLアンテナコネクタ
- ESP-03:14ピン(7 GPIO)、セラミックアンテナ
- ESP-04:14ピン(7 GPIO)、アンテナなし
ESP8266-01モジュールピン説明
- 3V3:3.3V電源ピン
- GND:グラウンドピン
- RST:アクティブロー リセットピン
- EN:アクティブハイ イネーブルピン
- TX:UARTシリアル送信ピン
- RX:UARTシリアル受信ピン
コード
IOT smart light(メイン制御コード)
int smooth; int LDR; int threshold = 40; // 太陽光強度閾値
int brightness = 0; int ledState = 0;
int sensor1 = 11; int sensor2 = 8; int sensor3 = 9;
int led1=5; int led = 6; int led2=2;
int carPresent = 0; int carPresent1 = 0;
float beta = 0.65;
void setup() {
Serial.begin(115200);
pinMode(sensor1, INPUT); pinMode(sensor2, INPUT); pinMode(sensor3, INPUT);
pinMode(led,OUTPUT); pinMode(led1,OUTPUT); pinMode(led2,OUTPUT);
}
void loop() {
smooth = smooth - (beta * (smooth - analogRead(A0))); delay(1);
LDR = round(((float)smooth / 1023) * 100);
if (LDR <= 40) brightness=0;
else { brightness = map(LDR, 40, 100, 0, 255); }
checkSensors();
if (carPresent == 1) {
ledState = 1;
digitalWrite(led,HIGH); digitalWrite(led1,HIGH);
analogWrite(led,brightness); analogWrite(led1,brightness);
} else if (carPresent == 0) {
ledState = 0;
digitalWrite(led,HIGH);
analogWrite(led,ledState);
if(carPresent1 == 1) {
ledState = 1;
if(ledState == 1) {
analogWrite(led1,brightness); analogWrite(led2,brightness);
}
} else if (carPresent1 == 0) {
ledState = 0;
digitalWrite(led1,HIGH); digitalWrite(led2,HIGH);
analogWrite(led1,ledState); analogWrite(led2,ledState);
}
}
String data = (String)ledState+","+(String)brightness+";";
Serial.print(data);
delay(100);
}
void checkSensors() {
if (digitalRead(sensor1) == 0) { // 第1センサーで車検知
if (digitalRead(sensor2) == 1) carPresent = 1; // 第2センサー未到達
} else if (digitalRead(sensor2) == 0) { // 第2センサー到達
if (digitalRead(sensor1) == 1) { carPresent = 0; carPresent1 = 1; } // 後続車なし
else if (digitalRead(sensor1) == 0) { // 後続車あり
analogWrite(led,brightness); analogWrite(led1,brightness); analogWrite(led2,brightness);
digitalWrite(led,HIGH); digitalWrite(led1,HIGH); digitalWrite(led2,HIGH);
}
} else if(digitalRead(sensor3) == 0) { // 第3センサー到達
if (digitalRead(sensor2) == 1) { carPresent = 0; carPresent1 = 0; }
else if (digitalRead(sensor2) == 0) { carPresent = 0; carPresent1 = 1; }
}
}
Code part 2(ThingSpeak送信コード)
#include// ネットワーク情報 const char* ssid = "ardent"; const char* password = "12345678"; String ledState = ""; String brightness = ""; char thingSpeakAddress[] = "api.thingspeak.com"; String writeAPIKey = "NUEBLW9OA58DLL4N"; // ご自身のチャネルWrite APIキーに変更 WiFiClient client; void setup() { Serial.begin(115200); connectWifi(); } void loop() { filterData(); HTTPPost(); delay(15000); // ThingSpeakへの投稿頻度制御(削除する場合はさらに遅延を追加) } int connectWifi() { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(2500); } } void HTTPPost() { if (client.connect(thingSpeakAddress, 80)) { String PostData = "api_key=" + writeAPIKey; PostData += "&field1=" + ledState; PostData += "&field2=" + brightness; client.println("POST /update HTTP/1.1"); client.println("Host: api.thingspeak.com"); client.println("Connection: close"); client.println("Content-Type: application/x-www-form-urlencoded"); client.println("Content-Length: " + String(PostData.length())); client.println(); client.println(PostData); client.stop(); } } void filterData() { if (Serial.available()) { String buffer = ""; buffer = Serial.readStringUntil(';'); int i1 = buffer.indexOf(','); ledState = buffer[0]; buffer.remove(0, i1 + 1); brightness = buffer; } }
回路図
回路図画像を参照してください。
製造プロセス
- スマート信号機:IoTで実現する適応型街路灯
- スマートホーム連携向けマルチポジション温度センサーシステム
- MotionSense: ArduinoとESP8266で作るスマート侵入検知システム
- 3Dプリンター火災予防:スマートセンサーセーフティシステム
- Arduino Nanoで構築するスマートホーム植物自動水やりシステム
- Arduinoで作る斥力式磁気浮上装置: シンプル回路とDIYガイド
- 高度なリモートコントロールグリッパーロボット: 精密ハンドリング向け
- 高度なマイクロコントローラー実験:ESP32、Arduino、PIC、センサーモジュール
- DIY POVグローブ - Arduino Megaで作るLED球体ディスプレイ
- Arduino Yunとシャーププラズマクラスター連携 スマート空気清浄機システム
- CoroFenceサーマルディテクター:Grid-EYE & PIRセンサー搭載IoT体温監視