ESP8266/ESP-wroom-02 Advent Calendar 2016 の枠が空いているので調子こいて小ネタを投稿しています。。。
ESP8266でLチカする場合、モード設定用の IO0,IO2,IO15 は避けがちです。
しかし、起動後は普通のGPIOとして使えるので、使わないのは勿体ないです。
IO2 に LED
IO2 に LED をつなぐと、IO2への出力でLチカすることができます。(IO2 → LED → 抵抗 → 3.3V とつなぎます。)
IO2にLEDをつなぐと、副作用(?)として、書き込み中に点滅してくれます。これは、IO2が2番目のUART出力ピンにもなっており、書き込み中に何か出力しているからのようです。
IO0 のボタン
書き込みモードと、普通のブートモードの切り替えのために、IO0 にはタクトスイッチなどをつなぐことが多いと思います。
これも、ユーザープログラムから普通に入力として扱うことができるので、有効活用してみましょう。
IO15 は?
IO15 は GND に落とさなければなりません。ここにLEDを(と抵抗を経由してGNDに)つないでみたのですが、GNDに引っ張り切れないのか、うまく動きませんでした。。。
(回路を工夫すれば使えないことはないのですが、ピンの空きがなくなった場合に考えましょう。。。)
サンプルプログラム
サンプルとして、「ボタンを押してた時間が、点滅の間隔となる」というプログラムを作ってみました。
当然、IO2 に LED、IO0 にボタンをつないでいる前提です。
int interval = 100;
long prevMillis;
boolean prevButton = false;
boolean bLed = true;
#define PORT_LED 2
#define PORT_SW 0
void setup() {
Serial.begin(74880); // 起動時に合わせて74880bpsにする
delay(10);
pinMode(PORT_LED, OUTPUT);
pinMode(PORT_SW, INPUT_PULLUP);
}
void loop() {
boolean sw = (digitalRead(PORT_SW)==LOW); // 押されてる:true 離されている:false
long t = millis();
if ( sw ) {
if ( !prevButton) {
// 押された
Serial.println("BUTTON_DOWN");
digitalWrite(PORT_LED, LOW);
prevMillis = t;
prevButton = sw;
}
// else 押され中→なにもしない
}
else {
if ( prevButton ) {
// 離された
Serial.println("BUTTON_UP");
digitalWrite(PORT_LED, HIGH);
interval = t - prevMillis;
prevMillis = t;
prevButton = sw;
boolean bLed = false;
}
else {
// 通常時
if ( prevMillis + interval < t ) {
bLed = !bLed;
Serial.println(bLed ? "LOW" : "HIGH");
digitalWrite(PORT_LED, bLed ? LOW : HIGH);
prevMillis = t;
}
}
}
delay(10); // チャタリング対策とか
}