ESP8266開發之旅 基礎篇③ ESP8266與Arduino的開發說明

授人以魚不如授人以漁,目的不是爲了教會你具體項目開發,而是學會學習的能力。但願你們分享給你周邊須要的朋友或者同窗,說不定大神成長之路有博哥的奠定石。。。node

QQ技術互動交流羣:ESP8266&32 物聯網開發 羣號622368884,不喜勿噴git

1、你若是想學基於Arduino的ESP8266開發技術

1、基礎篇github

  1. ESP8266開發之旅 基礎篇① 走進ESP8266的世界
  2. ESP8266開發之旅 基礎篇② 如何安裝ESP8266的Arduino開發環境
  3. ESP8266開發之旅 基礎篇③ ESP8266與Arduino的開發說明
  4. ESP8266開發之旅 基礎篇④ ESP8266與EEPROM
  5. ESP8266開發之旅 基礎篇⑤ ESP8266 SPI通訊和I2C通訊
  6. ESP8266開發之旅 基礎篇⑥ Ticker——ESP8266定時庫

2、網絡篇web

  1. ESP8266開發之旅 網絡篇① 認識一下Arduino Core For ESP8266
  2. ESP8266開發之旅 網絡篇② ESP8266 工做模式與ESP8266WiFi庫
  3. ESP8266開發之旅 網絡篇③ Soft-AP——ESP8266WiFiAP庫的使用
  4. ESP8266開發之旅 網絡篇④ Station——ESP8266WiFiSTA庫的使用
  5. ESP8266開發之旅 網絡篇⑤ Scan WiFi——ESP8266WiFiScan庫的使用
  6. ESP8266開發之旅 網絡篇⑥ ESP8266WiFiGeneric——基礎庫
  7. ESP8266開發之旅 網絡篇⑦ TCP Server & TCP Client
  8. ESP8266開發之旅 網絡篇⑧ SmartConfig——一鍵配網
  9. ESP8266開發之旅 網絡篇⑨ HttpClient——ESP8266HTTPClient庫的使用
  10. ESP8266開發之旅 網絡篇⑩ UDP服務
  11. ESP8266開發之旅 網絡篇⑪ WebServer——ESP8266WebServer庫的使用
  12. ESP8266開發之旅 網絡篇⑫ 域名服務——ESP8266mDNS庫
  13. ESP8266開發之旅 網絡篇⑬ SPIFFS——ESP8266 Flash文件系統
  14. ESP8266開發之旅 網絡篇⑭ web配網
  15. ESP8266開發之旅 網絡篇⑮ 真正的域名服務——DNSServer
  16. ESP8266開發之旅 網絡篇⑯ 無線更新——OTA固件更新

3、應用篇編程

  1. ESP8266開發之旅 應用篇① 局域網應用 ——炫酷RGB彩燈
  2. ESP8266開發之旅 應用篇② OLED顯示天氣屏
  3. ESP8266開發之旅 應用篇③ 簡易版WiFi小車

4、高級篇緩存

  1. ESP8266開發之旅 進階篇① 代碼優化 —— ESP8266內存管理
  2. ESP8266開發之旅 進階篇② 閒聊Arduino IDE For ESP8266配置
  3. ESP8266開發之旅 進階篇③ 閒聊 ESP8266 Flash
  4. ESP8266開發之旅 進階篇④ 常見問題 —— 解決困擾
  5. ESP8266開發之旅 進階篇⑤ 代碼規範 —— 像寫文章同樣優美
  6. ESP8266開發之旅 進階篇⑥ ESP-specific APIs說明

    筆者本書的主題是基於Arduino平臺來開發ESP8266。那麼從另一個角度來看待這句話,能夠理解爲:把ESP8266看成一款相似於Arduino UNO型號(爲何不是Mega2560呢?能夠從硬件資源方向考慮)的Arduino開發板,用Arduino平臺的開發方式來開發項目,只不過ESP8266是在Arduino UNO的基礎上加了網絡功能
    本章將介紹ESP8266做爲Arduino UNO開發板的一些重要開發知識點。
    主要分爲8個部分:
    1.ESP8266 Arduino程序結構
    2.計時和延時(Timing and delays)
    3.NodeMcu 端口映射
    4.數字IO(Digital IO)
    5.中斷功能
    6.模擬輸入(ADC)
    7.模擬輸出(PWM)
    8.串口通訊(Serial)網絡

1. Arduino程序結構

    在第2章中,筆者提供了一個測試用例,讓咱們來回顧一下,代碼以下:ide

/**
 * Demo:
 *    測試ESP8266 demo
 *    打印ESP8266模塊信息
 *    1.打印Arduino Core For ESP8266 版本,筆者是2.4.2版本
 *    2.打印Flash的惟一性芯片id(讀者能夠思考一下是否能夠用來作點什麼惟一性參考)
 *    3.打印Flash實際大小
 *    4.打印IDE配置的使用Flash大小
 *    5.打印IDE配置的Flash鏈接通訊的頻率
 *    6.打印Flash鏈接模式:QIO QOUT DIO DOUT,能夠理解爲Flash傳輸速率
 * @author 單片機菜鳥
 * @date 2018/10/22
 */
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  //使能軟件看門狗的觸發間隔
  ESP.wdtEnable(5000);
}

void loop() {
  //喂狗
  ESP.wdtFeed();
  FlashMode_t ideMode = ESP.getFlashChipMode();
  String coreVersion = ESP.getCoreVersion();
  Serial.print(F("Arduino Core For ESP8266 Version: "));
  Serial.println(coreVersion);
  Serial.printf("Flash real id(惟一標識符):   %08X\n", ESP.getFlashChipId());
  Serial.printf("Flash 實際大小: %u KBytes\n", ESP.getFlashChipRealSize()/1024);
  Serial.printf("IDE配置Flash大小: %u KBytes,每每小於實際大小\n", ESP.getFlashChipSize()/1024);
  Serial.printf("IDE配置Flash頻率 : %u MHz\n", ESP.getFlashChipSpeed()/1000000);
  Serial.printf("Flash ide mode:  %s\n\n", (ideMode == FM_QIO ? "QIO" : ideMode == FM_QOUT ? "QOUT" : ideMode == FM_DIO ? "DIO" : ideMode == FM_DOUT ? "DOUT" : "UNKNOWN"));
  
  delay(1000);
}

    去掉代碼細節,會獲得相似於Arduino編程的代碼結構:函數

/**
 * ESP8266 Arduino程序結構
 * @author 單片機菜鳥
 * @date 2018/10/24
 */
void setup() {
  // 這裏開始寫初始化代碼,只會執行一次
  
}

void loop() {
  //這裏寫運行代碼,重複執行
}

    對於習慣c語言編程的讀者,以上代碼又能夠抽象成如下僞代碼結構:oop

/**
 * ESP8266 Arduino程序僞代碼結構
 * @author 單片機菜鳥
 * @date 2018/10/24
 */
void main(){
  watchdogEnable();//啓動看門狗
  setup();//初始化函數
  while(1){
    loop();//業務代碼函數
  }
}

代碼解析

1.在ESP8266 Arduino編程中,默認會開啓看門狗功能,也就是對應僞代碼的watchdogEnable(),意味着咱們須要適當喂狗,否則會觸發看門狗復位;
2.setup()方法:初始化函數,只會運行一次,因此通常狀況下,咱們都會在這裏配置好初始化參數,好比IO口模式、串口波特率設置等等;
3.loop()方法:不斷重複執行,這裏編寫咱們的業務代碼,同時要注意執行喂狗操做。

2. 計時和延時(Timing and delays)

    時間控制,基本上能夠說存在於每個項目代碼中。目前在Arduino中跟時間控制有關的方法包括如下幾個:
    delay(ms)
    暫停一個給定的毫秒數的時間間隔。
    delayMicroseconds(us)
    暫停一個給定的微秒數的時間間隔。
    millis()
    返回重啓(reset)後所通過的毫秒數。
    micros()
    返回重啓(reset)後所通過的微秒數

舒適提示

    一般,咱們控制LED燈閃爍都會加上一個delay延時來達到切換亮滅時間長度。可是delay有個缺點就是:在給定的時間間隔內是不能作其餘操做,這樣對於一些須要響應按鍵操做的場景就不適用了。那麼有沒有什麼辦法既能延時又能不影響其餘操做呢?固然,這就是millis()的妙用,經過獲取兩個時間點的毫秒數,而後計算它們的差值,差值時間間隔內是能夠執行其餘操做的。代碼片斷以下:

long debouncdDelay = 60;//延時間隔
long lastDebounceTime = 0; //最近記錄的一次時間

// 判斷時間間隔是否大於設定的時間間隔。
if(millis()-lastDebounceTime>debouncdDelay){
    lastDebounceTime = millis();
}

3. NodeMcu 端口映射

    在前面,筆者有說到,本書的實驗案例是基於NodeMcu這塊ESP8266開發板來進行的,其中NodeMcu的核心芯片是ESP8266-12F。要想知道ESP8266-12F給咱們提供了什麼功能模塊,首先了解一下它有什麼引腳端口以及NodeMcu與它之間的引腳端口映射關係。

3.1 ESP8266-12F

    首先,認識一下ESP8266-12F的引腳定義,一般會隱藏pin6-pin11,以下圖:
image
    固然,筆者也會提供完整的引腳圖以便對比,以下圖:
image
    分析引腳圖,能夠得出幾個結論:
    1.ESP8266-12F總共有22個引腳,對應了第1章選型表的SMD-22封裝工藝,同時有GPIO0-GPIO16共17個通用IO口,可是得注意有些IO口還能夠完成其餘功能(也叫作引腳複用),諸如Serial、I2C、SPI,由相應的函數庫完成;
    2.ESP8266具備一個可用的單通道ADC;
    3.GPIO6-GPIO11(複用引腳CS、MISO、MOSI、SCK)用於鏈接外部flash,對用戶不可用,試圖使用這些引腳做爲IO將會致使程序奔潰;
    4.支持SPI總線通訊,對應引腳爲GPIO12-GPIO15;
    5.支持I2C總線,對應引腳爲GPIO4-GPIO5;
    6.支持串口通訊Serial、Serial1,默認對應引腳GPIO1-GPIO3;

3.2 NodeMcu

    接下來,先了解一下NoodeMcu的實物圖,以下圖:
image

    同時,讀者也須要知道ESP8266-12F與NodeMcu的端口映射關係,以下圖:
image

    能夠看出:
    1.中間的DEVKIT部分,就是NodeMcu提供給外界的端口,對應實物圖上標註的端口名稱;
    2.除開中間部分,其餘部分基本上對應ESP8266引腳,以不一樣顏色塊來區分不一樣功能;

舒適提示

    NodeMcu上的CLK、SD0、CMD、SD一、SD2引腳,是用於鏈接外接flash芯片,不該該用於鏈接其餘模塊,懸空便可,以防程序奔潰。

    或許筆者會以爲看圖有點複雜,因此筆者總結了下面的GPIO引腳映射表,以供參考:

NodeMCU的引腳名稱 ESP8266內部GPIO引腳號 可複用功能 備註
D0 GPIO16 可用,只能用做GPIO讀/寫,不支持特殊功能
D1 GPIO5 I2C總線的SCL 可用
D2 GPIO4 I2C總線的SDA 可用
D3 GPIO0 不可用,燒錄固件或者運行模式控制端口
D4 GPIO2 Serial1的TX Serial1沒有RX
D5 GPIO14 SPI總線的SCLK 可用
D6 GPIO12 SPI總線的MISO 可用
D7 GPIO13 SPI總線的MOSI、Serial的RX 可用
D8 GPIO15 SPI總線的CS、Serial的TX 可用
D9 GPIO3 Serial的RX 可用
D10 GPIO1 Serial的TX 可用
SD2 GPIO9 儘可能不用
SD3 GPIO10 儘可能不用

    從上面表格能夠看出,咱們大約11個GPIO引腳可用。而11箇中的2個引腳一般被保留用於RX和TX,以便進行串口通訊。所以最後,只剩下8個通用I / O引腳,即D0到D8(除開D3特殊用途)。

舒適提示

    請注意,D0 / GPIO16引腳只能用做GPIO讀/寫,不支持特殊功能。

4. 數字IO(Digital IO)

    上面說到,ESP8266-12F(也能夠大膽說ESP8266-12系列)最終只剩下8個通用的I/O引腳以供咱們使用,便是NodeMcu上的D0-D8(除D3以外)。
    Arduino中的引腳號直接與ESP8266 GPIO的引腳號對應通訊。pinMode/digitalRead/digitalWrite函數不變,因此要讀取GPIO2,可調用digitalRead(2)。除了D0能夠設置爲INPUT(輸入)、OUTPUT(輸出)或者INPUT_PULLDOWN(輸入,默認下拉,也就是低電平),剩餘的數字IO引腳能夠設置爲INPUT(輸入)、OUTPUT(輸出)或者INPUT_PULLUP(輸入,默認上拉,也就是高電平)。
    下面,將在NodeMcu的D1引腳上寫一個LED Blink的Arduino草圖:

/**
 * LED燈閃爍實驗
 */
void setup() {
    pinMode(D1, OUTPUT);   // 初始化D1引腳爲輸出引腳
}
 
void loop() {
    digitalWrite(D1, LOW); // 亮燈
    delay(1000); // 延時1s
    digitalWrite(D1, HIGH);// 滅燈
    delay(1000); // 延時1s
}

注意

    某些開發板和模塊,仍將使用第9和第11引腳(若是閃存芯片工做於DIO模式,與默認的QIO模式相反),它們可用於IO。

5. 中斷功能

    中斷能夠理解爲在正常的運行流程中忽然插入的操做,這就像你在忙於工做的時候,領導忽然叫你去買個下午茶,而後你就去把下午茶買回來,再繼續工做。基於ESP8266的NodeMcu的數字IO的中斷功能是經過attachInterruptdetachInterrupt函數所支持的。除了D0/GPIO16,中斷能夠綁定到任意GPIO的引腳上。所支持的標準中斷類型有:CHANGE(改變沿,電平從低到高或者從高到低)、RISING(上升沿,電平從低到高)、FALLING(降低沿,電平從高到低)。
    首先,咱們來看看Arduino IDE中用於中斷的函數。
    1.attachInterrupt()
    該功能用於在將指定引腳設置爲響應中斷。
    函數: attachInterrupt(pin, function, mode);
    參數:
        pin:要設置中斷編號,注意,這裏不是引腳編號。
        function:中斷髮生時運行的函數, 這個函數不帶任何參數,不返回任何內容。
        Interrupt type/mode:它定義中斷被觸發的條件方式。
            CHANGE:改變沿,引腳電平從低變爲高或者從高變爲低時觸發中斷。
            RISING:上升沿,引腳電平從低變爲高時觸發中斷。
            FALLING:降低沿,引腳電平從高變爲低時觸發中斷。
    返回值: 無;

    2.detachInterrupt()
    該功能用於禁用指定GPIO引腳上的中斷。
    函數: detachInterrupt(pin)
    參數:
        pin:要禁用的中斷的GPIO引腳。
    返回值: 無;

    3.digitalPinToInterrupt()
    該功能用於獲取指定GPIO引腳的中斷號。
    函數: digitalPinToInterrupt(pin)
    參數:
        pin:要獲取中斷號的GPIO引腳。

例子
    將NodeMcu的D2引腳設置爲上升沿中斷。在D2上外接一個按鍵,按鍵經過電阻下拉到地。當發生中斷的時候,咱們在串口監視器上打印「Hello ESP8266」。

image

例子代碼

/**
 * 功能描述:ESP8266中斷演示
 */ 
void setup() {
 Serial.begin(115200);//設置串口波特率
 attachInterrupt(digitalPinToInterrupt(D2), InterruptFunc, RISING);//設置中斷號、響應函數、觸發方式
}
 
void loop() {
}

/**
 * 中斷響應函數
 */ 
void InterruptFunc(){
 Serial.println("Hello ESP8266");
}

6. 模擬輸入(ADC)

    學過模擬電路或者數字電路的人都會聽過ADC,它又叫作模數轉換器,用於將模擬信號轉換成可視化的數字形式。ESP8266具備內置的10位ADC,只有一個ADC通道,即只有一個ADC輸入引腳可讀取來自外部器件的模擬電壓。
    ESP8266上的ADC通道和芯片供電電壓複用,也就是說咱們能夠將其設置爲測量系統電壓或者外部電壓。

6.1 測量外部電壓

    相關方法
        analogRead(A0),用於讀取施加在模塊的ADC引腳上的外部電壓;
    輸入電壓範圍
        0 - 1.0V之間;
    測量精度
        因爲ADC具備10位分辨率,所以會給出0-1023的值範圍;
    注意點
        爲了支持外部電壓範圍(0-3.3v),NodeMcu作了一個電阻分壓器,如圖所示:

image

    例程
    編寫一個讀取NodeMcu的ADC引腳上的模擬電壓。咱們這裏使用電位器在ADC引腳上提供0-3.3V的可變電壓。以下圖鏈接線:
image
    代碼以下:

/**
 * 功能描述:ESP8266 ADC 讀取外部電壓
 * 在串口調試器查看效果
 */
void setup() {
  Serial.begin(115200);//配置波特率
}
 
void loop() {
  Serial.print("ADC Value: ");
  Serial.println(analogRead(A0));//輸出0-1023 對應 外部輸入電壓 0-1.0v
  //延時1s
  delay(1000);
}

6.2 測量系統電壓

    相關方法
        ESP.getVcc(),讀取NodeMCU模塊的VCC電壓,單位是mV;
    注意點
        ADC引腳必須保持懸空;在讀取VCC電源電壓以前,應更改ADC模式以讀取系統電壓。
要ADC_MODE(mode)在#include行後面改變ADC模式。
模式是ADC_TOUT(對於外部電壓),ADC_VCC(對於系統電壓)。默認狀況下,它讀取外部電壓。
    例程
    編寫ESP8266讀取系統電壓,代碼以下:

/**
 * 功能描述:ESP8266 ADC 讀取系統電壓
 * 在串口調試器查看效果
 */
ADC_MODE(ADC_VCC);//設置ADC模式爲讀取系統電壓
 
void setup() {
  Serial.begin(115200);
}
 
void loop() {
  Serial.print("ESP8266當前系統電壓(mV): ");
  Serial.println(ESP.getVcc());
  delay(1000);
}

7. 模擬輸出(PWM)

    PWM(Pulse Width Modulation,脈寬調製),是在保持波的頻率不變的同時改變脈寬的技術。當咱們須要連續控制電壓變化,實現呼吸燈或者電機轉速的時候,就要用到PWM,以下圖。
image
    首先,咱們來理解一下佔空比。一個脈衝週期由一個ON週期(VCCC)和一個OFF週期(GND)組成。一段時間內ON週期佔據脈衝週期的比例就叫作佔空比。

DutyCycle(percentage)=Ton/TotalPeriodX100

    例如,一個10ms的脈衝保持ON 2ms,那麼根據公式,佔空比是20%。

注意點

    脈衝頻率通常都是固定的,跟佔空比沒有關係。

NodeMcu PWM引腳

    以下圖,標註PWM引腳。

image

    基本上數字IO均可以做爲PWM複用引腳,除了D0。不過須要注意的是,D3儘可能不用,它內部鏈接ESP8266 GPIO0。

NodeMcu PWM有關Arduino函數

    1.analogWrite()
    該功能用於在指定的引腳上啓用軟件PWM。
    函數: analogWrite(pin,val)
    參數:
        pin:要啓用軟件PWM的GPIO引腳。
        val:數值,通常在0到PWMRANGE範圍,默認PWMRANGE是1023。
    返回值: 無;
    注意點:
        analogWrite(pin, 0)用於禁用指定引腳上的PWM。
    2.analogWriteRange()
    該功能用於改變PWMRANGE數值。
    函數: analogWriteRange(new_range)
    參數:
        new_range:新的PWMRANGE數值。
    返回值: 無;
    注意點:
        能夠理解爲PWM精度範圍。一樣的PWM頻率下,默認佔空數值0-123。若是你改變PWMRANGE爲2047,那麼佔空數值就變成0-2047。精度高了一倍。
    3.analogWriteFreq()
    該功能用於改變PWM頻率。
    函數: analogWriteFreq(new_frequency)
    參數:
        new_frequency:新PWM頻率,默認是1kHZ。
    返回值: 無;
    注意點:
        百度上不少資料都說PWM頻率範圍爲1-1KHz。可是經過查看源碼,以下:

static uint16_t analogFreq = 1000;

extern void __analogWriteFreq(uint32_t freq) {
  if (freq < 100) {
    analogFreq = 100;
  } else if (freq > 40000) {
    analogFreq = 40000;
  } else {
    analogFreq = freq;
  }
}

    能夠看出,Arduino For ESP8266的PWM頻率範圍應該是100Hz-40KHz

PWM例程

    呼吸燈,LED燈明暗連續變化。代碼以下:

/**
 * 功能描述:ESP8266 PWM演示例程
 * @author 單片機菜鳥
 * @date 2018/10/25
 */
 
#define PIN_LED D6
 
void setup() {
  // 這裏開始寫初始化代碼,只會執行一次
  pinMode(PIN_LED,OUTPUT);
  analogWrite(PIN_LED,0);
}

void loop() {
  //這裏寫運行代碼,重複執行
  for(int val=0;val<1024;val++){
     //佔空比不斷增大  亮度漸亮
     analogWrite(PIN_LED,val);
     delay(2);
  }
  
  for(int val=1023;val>=0;val--){
     //佔空比不斷變小  亮度漸暗
     analogWrite(PIN_LED,1023);
     delay(2);
  }
}

8. 串口通訊(Serial)

    ESP8266的串口通訊與傳統的Arduino設備徹底同樣。除了硬件FIFO(128字節用於TX和RX)以外,硬件串口還有額外的256字節的TX和RX緩存。發送和接收全都由中斷驅動。當FIFO/緩存滿時,write函數會阻塞工程代碼的執行,等待空閒空間。當FIFO/緩存空時,read函數也會阻塞工程代碼的執行,等待串口數據進來。
    NodeMcu上有兩組串口,Serial和Serial1。
    Serial使用UART0,默認對應引腳是GPIO1(TX)和GPIO3(RX)。在Serial.begin執行以後,調用Serial.swap()能夠將Serial從新映射到GPIO15(TX)和GPIO13(RX)。再次調用Serial.swap()將Serial從新映射回GPIO1和GPIO3。不過,通常狀況下,默認就好。

串口映射例程

/**
 * 功能描述:ESP8266 Serial映射例程
 * @author 單片機菜鳥
 * @date 2018/10/25
 */
 
void setup() {
  // 這裏開始寫初始化代碼,只會執行一次
  Serial.begin(115200);
  Serial.println("GPIO1(TX),GPIO3(RX)");
  //調用映射方法
  Serial.swap();
  Serial.println("GPIO15(TX),GPIO13(RX)");
  //從新映射回來
  Serial.swap();
  Serial.println("GPIO1(TX),GPIO3(RX)");
}

void loop() {
  //這裏寫運行代碼,重複執行
}

    Serial1使用UART1,默認對應引腳是GPIO2(TX)。Serial1不能用於接收數據,由於它的RX引腳被用於flash芯片鏈接。要使用Serial1,請調用Serial.begin(baudrate)。代碼以下:

/**
 * 功能描述:ESP8266 串口例程
 * @author 單片機菜鳥
 * @date 2018/10/25
 */
 
void setup() {
  // 這裏開始寫初始化代碼,只會執行一次
  Serial.begin(115200);
  Serial.println("Hello Serial");
  Serial1.begin(115200);
  Serial1.println("Hello Serial1");
}

void loop() {
  //這裏寫運行代碼,重複執行
}

    若是不使用Serial1而且不映射串口,能夠將UART0的TX映射到GPIO2,具體操做是:在Serial.begin()以後調用Serial.set_tx(2)或者直接調用Serial.begin(baud,config,mode,2)。
    默認狀況下,當調用Serial.begin後,將禁用WiFi庫的診斷輸出。要想再次啓動調試輸出,請調用Serial.setDebugOutput(true)。要將調試輸出映射到Serial1時,須要調用Serial1.setDebugOutput(true)。
    調用Serial.setRxBufferSize(size_t size)容許定義接收緩衝區的大小,默認值是256(緩衝區也是使用內存,意味着不能一味地去增大這個值)。
    Serial和Serial1對象都支持5,6,7,8個數據位,奇數(O)、偶數(E)和無(N)奇偶校驗,以及1或者2箇中止位。要設置所需的模式,請調用Serial.begin(baudrate, SERIAL_8N1), Serial.begin(baudrate, SERIAL_6E2)等。
    Serial和Serial1都實現了一種新方法用來獲取當前的波特率設置。要獲取當前的波特率,請調用Serial.baudRate(),Serial1.baudRate()。代碼以下:

/**
 * 功能描述:ESP8266 串口波特率例程
 * @author 單片機菜鳥
 * @date 2018/10/25
 */
 
void setup() {
  // 這裏開始寫初始化代碼,只會執行一次
  // 設置當前波特率爲57600
  Serial.begin(57600);
  // 獲取當前波特率
  int br = Serial.baudRate();
  // 將打印 "Serial is 57600 bps"
  Serial.printf("Serial is %d bps", br);
}

void loop() {
  //這裏寫運行代碼,重複執行
}

    Serial和Serial1都屬於硬件串口(HardwareSerial)的實例,若是讀者須要使用ESP8266 軟件串口的功能,請參考如下庫:https://github.com/plerup/espsoftwareserial。
    爲了檢測進入Serial的未知波特率的數據,能夠調用Serial.detectBaudrate(time_t timeoutMillis)。這個方法嘗試在timeoutMillis ms的時間內檢測波特率,檢測成功返回波特率,檢測失敗返回0。detectBaudrate()方法在Serial.begin()被調用以前調用(由於它不須要用到接收緩衝區或者串口配置),而且它不能檢測數據位位數或者中止位。這個檢測過程不會去改變數據的波特率,因此能夠在檢測成功以後,調用Serial.begin(detectedBaudrate)。

串口用處

    通常來講,串口通訊用在兩個方面:
    1.與外圍串口設備傳輸數據,好比藍牙模塊、Arduino等等;
    2.開發過程當中用來調試代碼,經過串口輸出Debug信息瞭解程序運行信息。例程以下:

/**
 * Demo1:
 *    statin模式下,建立一個鏈接到可接入點(wifi熱點),而且打印IP地址
 * @author 單片機菜鳥
 * @date 2019/09/02
 */
#include <ESP8266WiFi.h>
 
#define AP_SSID "xxxxx" //這裏改爲你的wifi名字
#define AP_PSW  "xxxxx"//這裏改爲你的wifi密碼
//如下三個定義爲調試定義
#define DebugBegin(baud_rate)    Serial.begin(baud_rate)
#define DebugPrintln(message)    Serial.println(message)
#define DebugPrint(message)    Serial.print(message)
 
void setup(){
  //設置串口波特率,以便打印信息
  DebugBegin(115200);
  //延時2s 爲了演示效果
  delay(2000);
  DebugPrintln("Setup start");
  //啓動STA模式,並鏈接到wifi網絡
  WiFi.begin(AP_SSID, AP_PSW);
 
  DebugPrint(String("Connecting to ")+AP_SSID);
  //判斷網絡狀態是否鏈接上,沒鏈接上就延時500ms,而且打出一個點,模擬鏈接過程
  //筆者擴展:加入網絡一直都連不上 是否能夠作個判斷,由大家本身實現
  while (WiFi.status() != WL_CONNECTED){
    delay(500);
    DebugPrint(".");
  }
  DebugPrintln("");
 
  DebugPrint("Connected, IP address: ");
  //輸出station IP地址,這裏的IP地址由DHCP分配
  DebugPrintln(WiFi.localIP());
  DebugPrintln("Setup End");
}
 
void loop() {
}

9. 總結

    整體上講,本章基礎內容比較多,筆者介紹ESP8266在Arduino平臺上的一些基礎知識點,包括程序結構、NodeMcu端口映射、ESP8266 數字IO、PWM、ADC、串口通訊等等。 本章目的很簡單,就是爲了告訴讀者,ESP8266到底給咱們提供了什麼可利用硬件資源,以方便咱們項目開發。

相關文章
相關標籤/搜索