官方文檔 http://esp8266.github.io/Arduino/versions/2.1.0/doc/libraries.html
引腳口說明 http://yfrobot.com/thread-11798-1-1.html
數字I/O口 Digital IO
Arduino 引腳號直接對應ESP8266 GPIO 引腳。pinMode,digitalRead,和 digitalWrite 函數照常使用,所以讀取GPIO2引腳,這樣寫:digitalRead(2) 。
數字引腳 0~15可以設置為 INPUT,OUTPUT 或者 INPUT_PULLUP 模式。引腳 16可以設置為INPUT,OUTPUT 或者 INPUT_PULLDOWN_16 模式。在啟動時,引腳被配置為INPUT。
引腳同樣可以提供其他功能,像串行,I2C,SPI。這些函數通常需要使用相應的庫。下圖為ESP-12模塊的引腳圖:

注意:有些電路板和模塊(ESP-12ED NodeMCU 1.0)也釋放了引腳9和11,如果Flash芯片工作在DIO模式下(默認QIO模式),它們可以被當做IO口使用。
引腳中斷可以使用 attachInterrupt,detachInterrupt函數。除了GPIO16引腳,其他引腳都可以使用中斷功能。標准的Arduino 中斷類型都是支持的:CHANGE,RISING,FALLING。

模擬輸入 Analog input
ESP8266只有一個ADC通道提供給用戶。它可以使用於讀取ADC引腳電壓,也可使用於讀取模塊電源電壓(VCC)。
讀取ADC引腳值電壓,使用analogRead(A0)。輸入電壓范圍:0~1.0V。
讀取模塊電源電壓,使用ESP.getVcc() 且ADC引腳不能連接。另外,下面的代碼必須添加至程序中:
ADC_MODE(ADC_VCC);
這條代碼不能包含在任何函數中,放在程序中 #include 之后即可。
模擬輸出 Analog output
analogWrite(pin, value) 在已有的引腳上使能軟件PWM功能。PWM可以用在引腳0~16。調用analogWrite(pin, 0) 可以關閉引腳PWM。取值范圍:0~ PWMRANGE,默認為1023。 PWM 范圍可以使用analogWriteRange(new_range)語句來更改。
PWM 默認頻率:1KHz。使用analogWriteFreq(new_frequency) 可以更改頻率。
時間與延時 Timing and delays
millis() 和 micros() 分別返回單位為毫秒和微秒的值,復位后值重置。
delay(ms) 暫時程序給定毫秒時間並允許WiFi和TCP/IP任務的運行。delayMicroseconds(us) 暫時程序給定微秒時間。
記住wifi連接后除了素描程序外還有許多代碼需要再芯片上運行。每次loop()函數完成時或當delay被調用時,Wifi和TCP/IP庫都有機會處理任何等待事件。如果你程序中某處有循環,消耗事件大於50ms且沒有調用delay,你可以考慮添加一個調用延時函數以保持Wifi堆棧的平穩運行。
有個 yield()函數和delay(0)功能相同。delayMicroseconds函數,在另一方面,不會為其他任務讓步,所以當延時超過20ms時不推薦使用它。
串行 Serial
Serial 功能幾乎和普通arduino一樣,除了硬件FIFO (128 bytes for TX and RX)有額外256byte TX and RX緩沖區。傳輸和接收都是中斷驅動。當FIFO和緩沖區分別為滿和空時,讀寫功能將阻止程序的運行。
Serial 使用UART0,即引腳映射GPIO1(TX)和GPIO3(RX)。Serial.begin 之后調用Serial.swap()時,Serial引腳將映射到GPIO15(TX)和GPIO13(RX)。再次調用 swap時 引腳映射將回到GPIO1(TX)和GPIO3(RX)。
Serial1 使用UART1,TX引腳為GPIO2。UART1不能用來接收數據因為通常情況RX引腳被用到flash芯片連接了。使用Serail1,調用 Serial1.begin(baudrate)。
如果Serial1沒有使用且Serial沒有被調換 - 通過在Serial.begin之后調用Serial.set_tx(2)或者直接調用Serial.begin(baud,config,mode,2) 可以將UART0的TX映射到GPIO2。
默認情況下當你調用Serial.begin,Wifi庫診斷輸出是禁用的。再次啟動調試輸出,調用Serial.setDebugOutput(true)。調用Serial1.setDebugOutput(true),Serial1重定向調試輸出。
你也需要使用Serial.setDebugOutput(true)去使能printf()函數的輸出。
Serial和Serial1都支持 5,6,7,8數據位;奇 (O), 偶 (E),無(N) 校驗位;1或2停止位。設置所需模式,調用Serial.begin(baudrate,SRIAL_8N1),Serial.begin(baudrate, SERIAL_6E2), etc.
Progmem
|
1
2
3
4
5
|
String response1;
response1 += F(
"http:"
);
...
String response2;
response2 += F(
"http:"
);
|
1點亮LED
//總共可用 0-15 16皆可IO pwm 輸出 但是 6-11被系統時鍾占用
//實際可用 0 1(TX) 2 3(RX) 4 5 12 13 14 15 16
// 一般RX TX留出
void setup() {
pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level
digitalWrite(0, LOW); // but actually the LED is on; this is because
digitalWrite(1, LOW); // it is acive low on the ESP-01)
digitalWrite(2, LOW);
delay(1000); // Wait for a second
digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH
digitalWrite(0, HIGH); // but actually the LED is on; this is because
digitalWrite(1, HIGH); // it is acive low on the ESP-01)
digitalWrite(2, HIGH);
delay(2000); // Wait for two seconds (to demonstrate the active low LED)
}
2按鍵點亮LED
#define PIN_LED 16 //定義LED燈:PIN_LED所對應的引腳為16號
#define KEY_FLASH 0 //定義KEY_FLASH 對應0號引腳,其實就是FLASH按鍵位置
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
pinMode(PIN_LED, OUTPUT); //初始化PIN_LED引腳模式為輸出
pinMode(KEY_FLASH, INPUT);//初始化Flash按鍵模式為輸入
digitalWrite(PIN_LED,HIGH);//初始LED燈置為低電平,表示點亮
delay(1000); //延時1秒
}
//自定義按鍵函數
void keydo(){
//讀出當前按鍵狀態,0表示抬起斷開,1為按下接通
int k;
k=digitalRead(KEY_FLASH);
Serial.println("\r\n keydo:");
Serial.write(k);
Serial.println();
if(k==0)
digitalWrite(PIN_LED,HIGH); //高電平表示燈滅
else
digitalWrite(PIN_LED,LOW);
}
void loop() {
//digitalWrite(PIN_LED, LOW);
delay(500);
keydo();
//digitalWrite(PIN_LED, HIGH);
delay(500);
}
3生成PWM
#define PIN_LED 16
void setup() {
pinMode(PIN_LED, OUTPUT);
analogWrite(PIN_LED, 0);//模擬信號輸出
}
void loop() {
for (int i = 0; i < 1024; i++)
{//電平升高,從明到暗
analogWrite(PIN_LED, i);
delay(2);
}
for (int i = 1024; i >= 0; i--)
{//電平降低,從暗到明
analogWrite(PIN_LED, i);
delay(2);
}
}
4控制舵機
/* Sweep
by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain.
modified 28 May 2015
by Michael C. Miller
modified 8 Nov 2013
by Scott Fitzgerald
http://arduino.cc/en/Tutorial/Sweep
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
void setup()
{
myservo.attach(2); // attaches the servo on GIO2 to the servo object
}
void loop()
{
int pos;
for(pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for(pos = 180; pos>=0; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
5 中斷函數 需要上拉電阻 10k
//connect a jumper from GPIO 14 to ground to start test
#define GPIO_PIN 14
uint8_t led = LOW;
void setup(){
pinMode(GPIO_PIN, INPUT);
pinMode(BUILTIN_LED, OUTPUT);
setLED();
attachInterrupt(GPIO_PIN, highInterrupt, RISING);
}
void highInterrupt(){
led = HIGH;
detachInterrupt(GPIO_PIN);
attachInterrupt(GPIO_PIN, lowInterrupt, FALLING);
}
void lowInterrupt(){
led = LOW;
detachInterrupt(GPIO_PIN);
attachInterrupt(GPIO_PIN, highInterrupt, RISING);
}
void setLED(){
digitalWrite(BUILTIN_LED, led);
}
void loop(){
setLED();
}
示例2 不可用
引腳作為輸入的聲明是通過pinMode函數完成的,pinMode函數接收引腳作為第一個參數,並將第二個參數作為模式接收。
pinMode(interruptPin, INPUT_PULLUP);
最后,我們使用attachInterrupt函數將中斷附加到引腳。它接收中斷號碼作為第一個參數,作為第二個參數的中斷服務程序,以及第三個中斷模式。
在第一個參數中,我們將使用 digitalPinToInterrupt函數,該函數接收中斷引腳作為輸入,將實際的數字引腳轉換為特定的中斷號[6]。
作為第二個參數,我們將通過我們將定義后者的處理函數。這個函數不能使用任何參數,也不會返回任何結果[6]。
作為第三個參數,我們可以通過3種支持的中斷類型之一:CHANGE,RISING和FALLING [7]。在我們的情況下,我們不會檢測到信號的下降沿,所以我們通過下降。
const byte interruptPin = 13; // 13 對應板載LED 2 對應433中斷0
volatile byte interruptCounter = 0;
int numberOfInterrupts = 0;
void setup() {
Serial.begin(115200);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, FALLING);
}
void handleInterrupt() {
interruptCounter++;
}
void loop() {
if(interruptCounter>0){
interruptCounter--;
numberOfInterrupts++;
Serial.print("An interrupt has occurred. Total: ");
Serial.println(numberOfInterrupts);
}
}
6 通信433接收
//connect a jumper from GPIO 14 to ground to start test
#define GPIO_PIN 14 // 14--D5 不要上拉電阻
uint8_t led = LOW;
void setup(){
pinMode(GPIO_PIN, INPUT);
pinMode(BUILTIN_LED, OUTPUT);
setLED();
attachInterrupt(GPIO_PIN, highInterrupt, RISING);
}
void highInterrupt(){
led = HIGH;
detachInterrupt(GPIO_PIN);
attachInterrupt(GPIO_PIN, lowInterrupt, FALLING);
}
void lowInterrupt(){
led = LOW;
detachInterrupt(GPIO_PIN);
attachInterrupt(GPIO_PIN, highInterrupt, RISING);
}
void setLED(){
digitalWrite(BUILTIN_LED, led);
}
void loop(){
setLED();
}
