本文へ移動
AIとArduino。
コピペで動く20種類のコード集。
AIにArduinoのコードを書かせる方法を、超音波センサーの実例から丁寧に解説。さらに、LDR・PIR・DHT11・土壌水分・雨滴・MQ-2・炎・タッチ・ホール・NeoPixelなど、Arduino Uno/Nanoで試しやすい基本スケッチ20本を追加しました。

なぜAIでArduinoコードを書くのか
Arduinoの文法自体はシンプルですが、pinModeの設定漏れ、割り込みでのvolatile忘れ、センサー固有の換算式など、「知らないと詰まる」細部が多いのも事実です。AIはこうした定型知識の補完に強く、アイデアを電気信号に変換するまでの時間を短縮してくれます。基本関数の仕様は、最終的にArduino公式言語リファレンス ↗で確認してください。
ただし、AIの出力を無条件で書き込むのではなく、生成コードを読み、自分のボード・回路・センサー仕様とすり合わせることが前提です。
- 定型処理を高速化:初期化、読み取り、PWM出力の下書き
- 設計のたたき台:ピン配置、しきい値、状態遷移
- デバッグの壁打ち:エラーや異常値から原因候補を整理
良いプロンプトの設計図
Arduino向けの指示には、最低限「ボード」「部品とピン」「動作条件」「実装方針」を含めます。
| 要素 | 内容 | 例 |
|---|---|---|
| ボードと制約 | 機種、電源、メモリ | Arduino Uno / 5V |
| ハードウェア | センサー・出力・ピン | HC-SR04(Trig=9, Echo=10) |
| 動作条件 | しきい値、タイミング | 20cm未満で警告 |
| 非機能要件 | delay禁止、コメントなど | millis()で制御 |
「何を作るか」だけでなく、エラー時の扱い・タイムアウト・delay()の可否まで指定すると、実機向けのコードに近づきます。
生成されたスケッチ全文
既存記事の中心となるHC-SR04の接近警告コードです。後半の20選とは別に、AI生成コードを読む教材として残しています。
// 超音波距離センサーによる接近警告システム
const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
const int BUZZER_PIN = 8;
const int LED_PIN = 7;
const int THRESHOLD_CM = 20;
const unsigned long BLINK_INTERVAL = 200;
const unsigned long PRINT_INTERVAL = 500;
unsigned long lastBlinkTime = 0;
unsigned long lastPrintTime = 0;
bool ledState = false;
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
float measureDistanceCm() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
if (duration == 0) return -1;
return duration * 0.0343 / 2.0;
}
void loop() {
unsigned long now = millis();
float distance = measureDistanceCm();
bool isAlert = (distance > 0 && distance < THRESHOLD_CM);
if (isAlert) {
digitalWrite(BUZZER_PIN, HIGH);
if (now - lastBlinkTime >= BLINK_INTERVAL) {
lastBlinkTime = now;
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
} else {
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_PIN, LOW);
ledState = false;
}
if (now - lastPrintTime >= PRINT_INTERVAL) {
lastPrintTime = now;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
}
}
コード解説:ブロック単位で読む
delay()で全体を止めず、経過時間でLEDだけを切り替える定石です。-1を警告対象から外し、異常値を通常データと混同しません。AI生成コードにありがちな落とし穴
存在しないピン・関数・ライブラリ名が混ざることがあります。ボードと部品の公式資料を確認します。
delay()がなくても、長いpulseIn()、大量のシリアル出力、重いループで反応が遅くなる場合があります。
デジタルセンサーの検知時がHIGHかLOWか、アナログ値が増えるか減るかはモジュールにより異なります。
実機で検証し、対話で直す
書き込んだ後はシリアルモニタで生の値を確認します。動かない時は「鳴らない」だけでなく、配線、表示値、エラー全文、使用ボード、センサー型番をAIへ伝えます。
20本を書き込む前の共通チェック
- 各コードは1本ずつ別のスケッチとしてArduino IDEへ貼り付ける
- 「ツール → ボード」「ツール → ポート」を実機に合わせる
- Arduinoと外部電源・モジュールのGNDを共通化する
- LEDには原則として電流制限抵抗を入れる
- センサーのAO(アナログ)とDO(デジタル)を取り違えない
- 最初はシリアルモニタで実測し、しきい値を自分の環境へ合わせる
DHT11は「DHT sensor library by Adafruit」+「Adafruit Unified Sensor」、NeoPixelは「Adafruit NeoPixel」をライブラリマネージャーから追加します。それ以外の18本は標準機能のみです。
コピペですぐ試せるArduinoコード集20選
すべてArduino Uno/一般的なNano互換機を想定した独立スケッチです。検索欄に「温度」「LED」「雨」「磁石」などを入力すると対象コードだけに絞れます。
| No. | コード | ライブラリ | 難易度 |
|---|---|---|---|
| 01 | 照度センサー(LDR)で暗くなるとLEDを自動点灯 | 不要 | 入門 |
| 02 | 可変抵抗(ポテンショメータ)でLEDの明るさを調整 | 不要 | 入門 |
| 03 | RGB LEDを赤・緑・青・白へ順番に点灯 | 不要 | 入門 |
| 04 | NeoPixel(WS2812B)を虹色に流す | Adafruit NeoPixel | 入門+ |
| 05 | PIR人感センサーで人を検知してLEDを点灯 | 不要 | 入門 |
| 06 | DHT11で温度と湿度をシリアル表示 | DHT sensor library | 入門+ |
| 07 | TMP36アナログ温度センサーで室温を測る | 不要 | 入門 |
| 08 | 土壌水分センサーで乾燥を検知 | 不要 | 入門 |
| 09 | 雨滴センサーで濡れを検知してブザーを鳴らす | 不要 | 入門 |
| 10 | 水位センサーで低・中・高の3段階表示 | 不要 | 入門 |
| 11 | 音センサーで手拍子を検知しLEDをON/OFF | 不要 | 入門+ |
| 12 | MQ-2ガスセンサーで濃度上昇を警告 | 不要 | 入門+ |
| 13 | 炎センサーで火炎を検知して警報 | 不要 | 入門 |
| 14 | 赤外線障害物センサーで接近物を検知 | 不要 | 入門 |
| 15 | リードスイッチでドアの開閉を検知 | 不要 | 入門 |
| 16 | 傾斜センサーで転倒・傾きを検知 | 不要 | 入門 |
| 17 | TTP223タッチセンサーでLEDを切り替える | 不要 | 入門 |
| 18 | ホールセンサーA3144で回転数(RPM)を測定 | 不要 | 基礎+ |
| 19 | アナログジョイスティックで2個のLEDを調光 | 不要 | 入門 |
| 20 | ロータリーエンコーダでLEDの明るさを段階調整 | 不要 | 基礎+ |
照度センサー(LDR)で暗くなるとLEDを自動点灯
周囲が暗いほどLEDを明るくする、自動ナイトライトの基本です。
LDR(フォトレジスタ)、10kΩ抵抗、LED、220Ω抵抗
LDRを5V側、10kΩ抵抗をGND側にした分圧の中点→A0/LEDアノード→D9(220Ω経由)/LEDカソード→GND
コードを表示・コピー
// LDRで暗くなるほどLEDを明るくする
const int LDR_PIN = A0;
const int LED_PIN = 9; // PWM対応ピン
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
int lightValue = analogRead(LDR_PIN); // 0〜1023
int brightness = map(lightValue, 0, 1023, 255, 0);
brightness = constrain(brightness, 0, 255);
analogWrite(LED_PIN, brightness);
Serial.print("Light: ");
Serial.print(lightValue);
Serial.print(" / LED: ");
Serial.println(brightness);
delay(100);
}
可変抵抗(ポテンショメータ)でLEDの明るさを調整
つまみの位置を0〜255へ変換し、PWMでLEDを滑らかに調光します。
10kΩ可変抵抗、LED、220Ω抵抗
可変抵抗の両端→5V/GND、中央端子→A0/LEDアノード→D9(220Ω経由)/カソード→GND
コードを表示・コピー
// 可変抵抗でLEDを調光する
const int POT_PIN = A0;
const int LED_PIN = 9;
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int potValue = analogRead(POT_PIN); // 0〜1023
int brightness = map(potValue, 0, 1023, 0, 255);
analogWrite(LED_PIN, brightness);
delay(10);
}
RGB LEDを赤・緑・青・白へ順番に点灯
3色のPWM出力を組み合わせ、RGB LEDの混色を学べます。
4本足RGB LED(共通カソード)、220Ω抵抗×3
R→D9、G→D10、B→D11(各220Ω経由)/共通カソード→GND
コードを表示・コピー
// 共通カソードRGB LEDの基本点灯
const int RED_PIN = 9;
const int GREEN_PIN = 10;
const int BLUE_PIN = 11;
void setColor(int red, int green, int blue) {
analogWrite(RED_PIN, red);
analogWrite(GREEN_PIN, green);
analogWrite(BLUE_PIN, blue);
}
void setup() {
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
}
void loop() {
setColor(255, 0, 0); // 赤
delay(800);
setColor(0, 255, 0); // 緑
delay(800);
setColor(0, 0, 255); // 青
delay(800);
setColor(255, 255, 255); // 白
delay(800);
setColor(0, 0, 0); // 消灯
delay(400);
}
NeoPixel(WS2812B)を虹色に流す
1本の信号線で複数のフルカラーLEDを制御します。
NeoPixelリングまたはテープ(8灯想定)、330Ω抵抗、必要に応じて外部5V電源
DIN→D6(330Ω経由)/5V→5V/GND→GND。外部電源使用時もArduinoとGNDを共通化
コードを表示・コピー
#include <Adafruit_NeoPixel.h>
const int PIXEL_PIN = 6;
const int PIXEL_COUNT = 8;
Adafruit_NeoPixel pixels(
PIXEL_COUNT,
PIXEL_PIN,
NEO_GRB + NEO_KHZ800
);
uint16_t hue = 0;
void setup() {
pixels.begin();
pixels.setBrightness(40); // 0〜255
pixels.show();
}
void loop() {
for (int i = 0; i < PIXEL_COUNT; i++) {
uint16_t pixelHue = hue + (65536L / PIXEL_COUNT) * i;
pixels.setPixelColor(i, pixels.gamma32(pixels.ColorHSV(pixelHue)));
}
pixels.show();
hue += 256;
delay(30);
}
PIR人感センサーで人を検知してLEDを点灯
人の動きを検知するとLEDを点灯する、防犯灯の基本構成です。
HC-SR501などのPIR人感センサー、LED、220Ω抵抗
PIR OUT→D2、VCC→5V、GND→GND/LED→D8(220Ω経由)
コードを表示・コピー
// PIR人感センサーでLEDを点灯
const int PIR_PIN = 2;
const int LED_PIN = 8;
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
bool detected = digitalRead(PIR_PIN) == HIGH;
digitalWrite(LED_PIN, detected ? HIGH : LOW);
Serial.println(detected ? "Motion detected" : "No motion");
delay(200);
}
DHT11で温度と湿度をシリアル表示
室温と湿度を2秒ごとに測定し、シリアルモニタへ表示します。
DHT11モジュール
DATA→D4、VCC→5V、GND→GND。裸の4ピンDHT11ではDATAと5V間に10kΩプルアップ抵抗を追加
コードを表示・コピー
#include <DHT.h>
const int DHT_PIN = 4;
#define DHT_TYPE DHT11
DHT dht(DHT_PIN, DHT_TYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
Serial.println("DHT11 read error");
delay(2000);
return;
}
Serial.print("Temperature: ");
Serial.print(temperature, 1);
Serial.print(" C / Humidity: ");
Serial.print(humidity, 1);
Serial.println(" %");
delay(2000);
}
TMP36アナログ温度センサーで室温を測る
アナログ電圧を摂氏温度へ換算する、センサー計算の基本です。
TMP36
平らな面を手前にして左→5V、中央→A0、右→GND
コードを表示・コピー
// TMP36の出力電圧から摂氏温度を計算
const int TMP36_PIN = A0;
void setup() {
Serial.begin(9600);
}
void loop() {
int raw = analogRead(TMP36_PIN);
float voltage = raw * (5.0 / 1023.0);
float temperatureC = (voltage - 0.5) * 100.0;
Serial.print("Temperature: ");
Serial.print(temperatureC, 1);
Serial.println(" C");
delay(1000);
}
土壌水分センサーで乾燥を検知
土が乾いたらLEDとブザーで知らせる、鉢植えモニターの基本です。
土壌水分センサーモジュール、LED、ブザー
AO→A0、VCC→5V、GND→GND/LED→D7/アクティブブザー→D8
コードを表示・コピー
// 土が乾燥したらLEDとブザーで通知
const int SOIL_PIN = A0;
const int LED_PIN = 7;
const int BUZZER_PIN = 8;
const int DRY_THRESHOLD = 700;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
int soilValue = analogRead(SOIL_PIN);
bool isDry = soilValue >= DRY_THRESHOLD;
digitalWrite(LED_PIN, isDry ? HIGH : LOW);
digitalWrite(BUZZER_PIN, isDry ? HIGH : LOW);
Serial.print("Soil: ");
Serial.println(soilValue);
delay(500);
}
雨滴センサーで濡れを検知してブザーを鳴らす
センサープレートの濡れ具合をアナログ値で読み、雨を検知します。
雨滴センサーモジュール、アクティブブザー
AO→A0、VCC→5V、GND→GND/ブザー→D8
コードを表示・コピー
// 雨滴を検知するとブザーを鳴らす
const int RAIN_PIN = A0;
const int BUZZER_PIN = 8;
const int WET_THRESHOLD = 500;
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
int rainValue = analogRead(RAIN_PIN);
bool isWet = rainValue < WET_THRESHOLD;
digitalWrite(BUZZER_PIN, isWet ? HIGH : LOW);
Serial.print("Rain sensor: ");
Serial.println(rainValue);
delay(300);
}
水位センサーで低・中・高の3段階表示
水位に応じて3個のLEDを段階点灯します。
水位センサー、LED×3、220Ω抵抗×3
S→A0、+→5V、-→GND/緑LED→D5、黄LED→D6、赤LED→D7
コードを表示・コピー
// 水位を3段階のLEDで表示
const int WATER_PIN = A0;
const int LOW_LED = 5;
const int MID_LED = 6;
const int HIGH_LED = 7;
void setup() {
pinMode(LOW_LED, OUTPUT);
pinMode(MID_LED, OUTPUT);
pinMode(HIGH_LED, OUTPUT);
Serial.begin(9600);
}
void loop() {
int level = analogRead(WATER_PIN);
digitalWrite(LOW_LED, level >= 200);
digitalWrite(MID_LED, level >= 450);
digitalWrite(HIGH_LED, level >= 700);
Serial.print("Water level: ");
Serial.println(level);
delay(300);
}
音センサーで手拍子を検知しLEDをON/OFF
音の立ち上がりを1回だけ拾い、手拍子のたびにLEDを反転します。
デジタル出力付き音センサーモジュール、LED、220Ω抵抗
DO→D2、VCC→5V、GND→GND/LED→D9
コードを表示・コピー
// 手拍子でLEDをトグルする
const int SOUND_PIN = 2;
const int LED_PIN = 9;
const int SOUND_ACTIVE = LOW;
const unsigned long COOLDOWN_MS = 250;
bool ledState = false;
int lastSoundState = HIGH;
unsigned long lastTriggerTime = 0;
void setup() {
pinMode(SOUND_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int currentState = digitalRead(SOUND_PIN);
unsigned long now = millis();
bool newSound = (currentState == SOUND_ACTIVE &&
lastSoundState != SOUND_ACTIVE);
if (newSound && now - lastTriggerTime >= COOLDOWN_MS) {
lastTriggerTime = now;
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
lastSoundState = currentState;
}
MQ-2ガスセンサーで濃度上昇を警告
センサー値が設定値を超えた時に警告します。
MQ-2ガスセンサーモジュール、LED、アクティブブザー
AO→A0、VCC→5V、GND→GND/LED→D7/ブザー→D8
コードを表示・コピー
// MQ-2の値がしきい値を超えたら警告
const int MQ2_PIN = A0;
const int LED_PIN = 7;
const int BUZZER_PIN = 8;
const int GAS_THRESHOLD = 400;
const unsigned long WARMUP_MS = 20000;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
Serial.begin(9600);
Serial.println("MQ-2 warming up...");
}
void loop() {
int gasValue = analogRead(MQ2_PIN);
bool ready = millis() >= WARMUP_MS;
bool alert = ready && gasValue >= GAS_THRESHOLD;
digitalWrite(LED_PIN, alert ? HIGH : LOW);
digitalWrite(BUZZER_PIN, alert ? HIGH : LOW);
Serial.print("MQ-2: ");
Serial.println(gasValue);
delay(300);
}
炎センサーで火炎を検知して警報
デジタル出力の炎センサーを使った最小構成の警報です。
炎センサーモジュール、LED、アクティブブザー
DO→D2、VCC→5V、GND→GND/LED→D7/ブザー→D8
コードを表示・コピー
// 炎を検知するとLEDとブザーを作動
const int FLAME_PIN = 2;
const int LED_PIN = 7;
const int BUZZER_PIN = 8;
const int FLAME_ACTIVE = LOW;
void setup() {
pinMode(FLAME_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
bool flameDetected = digitalRead(FLAME_PIN) == FLAME_ACTIVE;
digitalWrite(LED_PIN, flameDetected ? HIGH : LOW);
digitalWrite(BUZZER_PIN, flameDetected ? HIGH : LOW);
delay(50);
}
赤外線障害物センサーで接近物を検知
物体が近づいた時だけLEDを点灯します。ロボットの衝突回避の入口になります。
赤外線障害物回避センサーモジュール、LED、220Ω抵抗
OUT→D3、VCC→5V、GND→GND/LED→D8
コードを表示・コピー
// 赤外線障害物センサーでLEDを点灯
const int IR_PIN = 3;
const int LED_PIN = 8;
const int DETECTED_STATE = LOW;
void setup() {
pinMode(IR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
bool obstacle = digitalRead(IR_PIN) == DETECTED_STATE;
digitalWrite(LED_PIN, obstacle ? HIGH : LOW);
Serial.println(obstacle ? "Obstacle" : "Clear");
delay(100);
}
リードスイッチでドアの開閉を検知
磁石が離れてドアが開くとLEDを点灯します。
リードスイッチ、磁石、LED、220Ω抵抗
リードスイッチの片側→D2、反対側→GND/LED→D8。INPUT_PULLUPを使用
コードを表示・コピー
// ドアが開いたらLEDを点灯
const int REED_PIN = 2;
const int LED_PIN = 8;
void setup() {
pinMode(REED_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
bool doorOpen = digitalRead(REED_PIN) == HIGH;
digitalWrite(LED_PIN, doorOpen ? HIGH : LOW);
Serial.println(doorOpen ? "Door open" : "Door closed");
delay(100);
}
傾斜センサーで転倒・傾きを検知
傾きを検知すると短い警告音を繰り返します。
ボール式傾斜スイッチ、パッシブブザー
傾斜スイッチの片側→D2、反対側→GND/パッシブブザー+→D9、−→GND
コードを表示・コピー
// 傾斜を検知すると断続音を鳴らす
const int TILT_PIN = 2;
const int BUZZER_PIN = 9;
const unsigned long BEEP_INTERVAL = 500;
unsigned long lastBeepTime = 0;
bool beepOn = false;
void setup() {
pinMode(TILT_PIN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
bool tilted = digitalRead(TILT_PIN) == LOW;
unsigned long now = millis();
if (tilted && now - lastBeepTime >= BEEP_INTERVAL) {
lastBeepTime = now;
beepOn = !beepOn;
if (beepOn) tone(BUZZER_PIN, 1200);
else noTone(BUZZER_PIN);
}
if (!tilted) {
noTone(BUZZER_PIN);
beepOn = false;
}
}
TTP223タッチセンサーでLEDを切り替える
タッチするたびにLEDのON/OFFを切り替えます。
TTP223静電容量タッチセンサーモジュール、LED、220Ω抵抗
SIG→D2、VCC→5V、GND→GND/LED→D9
コードを表示・コピー
// タッチするたびにLEDを反転
const int TOUCH_PIN = 2;
const int LED_PIN = 9;
const unsigned long DEBOUNCE_MS = 80;
bool ledState = false;
int lastTouchState = LOW;
unsigned long lastChangeTime = 0;
void setup() {
pinMode(TOUCH_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int currentState = digitalRead(TOUCH_PIN);
unsigned long now = millis();
if (currentState == HIGH && lastTouchState == LOW &&
now - lastChangeTime >= DEBOUNCE_MS) {
lastChangeTime = now;
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
lastTouchState = currentState;
}
ホールセンサーA3144で回転数(RPM)を測定
磁石が1回通過するたびに割り込みで数え、1秒ごとにRPMへ換算します。
A3144ホールセンサー、磁石、10kΩ抵抗(モジュール型では不要な場合あり)
OUT→D2、VCC→5V、GND→GND。裸のA3144ではOUTを10kΩで5Vへプルアップ
コードを表示・コピー
// A3144で1秒ごとに回転数を計算
const int HALL_PIN = 2; // Unoの外部割り込み対応ピン
const int MAGNETS_PER_REV = 1;
const unsigned long SAMPLE_MS = 1000;
volatile unsigned long pulseCount = 0;
unsigned long lastSampleTime = 0;
void countPulse() {
pulseCount++;
}
void setup() {
pinMode(HALL_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(HALL_PIN), countPulse, FALLING);
Serial.begin(9600);
}
void loop() {
unsigned long now = millis();
if (now - lastSampleTime >= SAMPLE_MS) {
noInterrupts();
unsigned long pulses = pulseCount;
pulseCount = 0;
interrupts();
float minutes = SAMPLE_MS / 60000.0;
float rpm = pulses / (float)MAGNETS_PER_REV / minutes;
Serial.print("RPM: ");
Serial.println(rpm, 1);
lastSampleTime = now;
}
}
アナログジョイスティックで2個のLEDを調光
X軸とY軸をそれぞれLEDの明るさへ割り当てます。押し込みで両方消灯します。
XYジョイスティックモジュール、LED×2、220Ω抵抗×2
VRx→A0、VRy→A1、SW→D2、VCC→5V、GND→GND/LED1→D5、LED2→D6
コードを表示・コピー
// ジョイスティックのX/YでLEDを調光
const int X_PIN = A0;
const int Y_PIN = A1;
const int SW_PIN = 2;
const int X_LED = 5;
const int Y_LED = 6;
void setup() {
pinMode(SW_PIN, INPUT_PULLUP);
pinMode(X_LED, OUTPUT);
pinMode(Y_LED, OUTPUT);
}
void loop() {
int xValue = analogRead(X_PIN);
int yValue = analogRead(Y_PIN);
bool pressed = digitalRead(SW_PIN) == LOW;
int xBrightness = map(xValue, 0, 1023, 0, 255);
int yBrightness = map(yValue, 0, 1023, 0, 255);
if (pressed) {
xBrightness = 0;
yBrightness = 0;
}
analogWrite(X_LED, xBrightness);
analogWrite(Y_LED, yBrightness);
delay(10);
}
ロータリーエンコーダでLEDの明るさを段階調整
つまみを左右に回すと明るさが増減し、押し込みで消灯します。
KY-040などのロータリーエンコーダ、LED、220Ω抵抗
CLK→D2、DT→D3、SW→D4、+→5V、GND→GND/LED→D9
コードを表示・コピー
// ロータリーエンコーダでLED調光
const int CLK_PIN = 2;
const int DT_PIN = 3;
const int SW_PIN = 4;
const int LED_PIN = 9;
int brightness = 128;
int lastClkState;
void setup() {
pinMode(CLK_PIN, INPUT_PULLUP);
pinMode(DT_PIN, INPUT_PULLUP);
pinMode(SW_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
lastClkState = digitalRead(CLK_PIN);
analogWrite(LED_PIN, brightness);
}
void loop() {
int clkState = digitalRead(CLK_PIN);
if (clkState != lastClkState && clkState == LOW) {
if (digitalRead(DT_PIN) != clkState) brightness += 16;
else brightness -= 16;
brightness = constrain(brightness, 0, 255);
analogWrite(LED_PIN, brightness);
}
if (digitalRead(SW_PIN) == LOW) {
brightness = 0;
analogWrite(LED_PIN, brightness);
delay(180); // ボタンの簡易デバウンス
}
lastClkState = clkState;
}
よくある質問とまとめ
このコードはArduino Nanoでも使えますか?
ATmega328P搭載の一般的なNano互換機なら、多くの例を同じピン番号で使用できます。ただし、互換機によってUSBドライバや電源仕様が異なるため、書き込み前にボード設定を確認してください。
コードをコピペしても動かない時は?
ボードとポート、GND、電源電圧、LEDの向き、ピン番号、AO/DO、しきい値、ライブラリの順に確認します。まずセンサー値だけをシリアル表示すると原因を切り分けやすくなります。
外部ライブラリが必要な例は?
DHT11とNeoPixelの2本です。ライブラリ導入後にIDEを再起動し、ヘッダーが見つからないエラーが消えるか確認してください。
MQ-2・炎センサーを防災用途へ使えますか?
本記事は学習・試作用です。人命や財産に関わる検知には、認証された製品と専門的な安全設計を使用してください。
まずは部品が少ない「LDR」「可変抵抗」「PIR」のどれか1本を動かし、シリアルモニタで値を見るところから始めると失敗しにくくなります。動いたコードに対して、AIへ「delayをmillisへ変更」「LEDをブザーへ変更」「しきい値を可変抵抗で調整」と追加依頼すれば、同じ回路から次の作品へ発展できます。
コメント