前幾天突然想搞一個流水燈,說幹就幹。 首先介 紹一下今天的主角: NodeMCU NodeMcu使用了ESP8266 (ESP-12E)模組,隻不過和ESP8266(ESP-12E)相比,多了一些封裝。(自帶USB轉Serial子產品)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iMzcjM4ITOmJGMxI2N2MmMhRWN1ADZjlTZhFDOmBTZj9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
主要參數
引腳圖
ESP8266晶片有17個GPIO引腳(GPIO0~GPIO16)。這些引腳中的GPIO6~GPIO 11被用于連接配接開發闆的閃存(Flash Memory)是以建議不要使用GPIO6~GPIO 11。 在這剩下的11個針腳中,又有2個針腳預留給序列槽RX和TX。 一些GPIO引腳同時兼備了其他功能,如RX,TX, SD2, SD3,這些引腳大多不作為GPIO使用,因為它們可用于其他程序。
是以,最後隻剩下9個通用I/O引腳,即D0到D8。
需要注意的是,D0|GPIO16引腳隻能作為GPIO讀/寫使用,不支援任何特殊功能
電壓電流限制
NodeMCU開發闆引腳的輸入輸出電壓限制是3.3 V。如果向引腳施加3.6V以上的電壓就有可能對晶片電路造成損壞。同時請注意,這些引腳的最大輸出電流是12mA。
特殊引腳
GPIO2引腳 在NodeMCU開發闆啟動時是不能連接配接低電平的。 GPIO15引腳在開發闆運作中一直保持低電平狀态。 GPIO0引腳在開發闆運作中需要一直保持高電平狀态。否則ESP8266将進入程式上傳工作模式也就無法正常工作了
模拟輸入
AD轉換 将模拟量轉換為數字量 隻有一個引腳 A0,nodemcu上可以讀取模拟輸入0-3.3v的電壓
通訊
串行端口(UART)TX(GPIO1)和RX(GPIO3) 以及 TX(GPIO2)和RX(GPIO8)
I2C
ESP8266隻有軟體模拟的I²C端口,沒有硬體I²C端口。可以使用任意的兩個GPIO引腳通過軟體模拟來實作I²C通訊。ESP8266的資料表(datasheet)中,GPIO4(D2)标注為SDA,GPIO5(D1)标注為SCL。
SPI
ESP8266的SPI端口情況如下: GPIO14 — CLK GPIO12 — MISO GPIO13 — MOSI GPIO 15 — CS(SS)
安裝驅動
需要安裝驅動 才能通過usb連接配接NodeMcu電腦才能識别到端口 Windows驅動請通路:https://yun.coupile.top/#/s/WBh6 (v1使用ch341驅動 V2 與V3 大部分使用cp210x驅動)
那麼看完了NodeMCU的介紹,現在開始搞起今天的項目。
最新版Arduino IDE下載下傳 https://yun.coupile.top/#/s/WBh6Arduino IDE是開發Arduino用的,但是如果你要寫非Arduino的控制闆(比如今天的主角,NodeMCU,就是一款基于esp8266的開發闆),請先在檔案 —> 首選項 —> 附加開發闆管理器位址裡,輸入http://arduino.esp8266.com/stable/package_esp8266com_index.json 網址
确認儲存之後,再次選中工具 —> 開發闆:“XXXXXX” —> 開發闆管理器,在搜尋框中輸入esp8266,選擇安裝即可(可能會很慢,如果提示
就需要魔法飛到qiang外。)
安裝完成之後,重新打開工具 —> 開發闆:“XXXXXX”,選擇NodeMCU 1.0(ESP-12E)
然後就可以愉快的程式設計啦。
當然,我們還需要了解一下ArduinoIDE使用語言的文法。
Arduino使用C/C++編寫程式,雖然C++相容C語言,但這是兩種語言,C語言是一種面向過程的程式設計語言,C++是一種面向對象的程式設計語言。早期的Arduino核心庫使用C語言編寫,後來引進了面向對象的思想,目前最新的Arduino核心庫采用C與C++混合編寫而成。 通常我們說的Arduino語言,是指Arduino核心庫檔案提供的各種應用程式程式設計接口(Application Programming Interface,簡稱API)的集合。這些API是對更底層的單片機支援庫進行二次封裝所形成的。
在Arduino中,使用了清楚明了的API替代繁雜的寄存器配置過程,如以下代碼:
pinMode(13,OUTPUT);digitalWrite(13,HIGH);
pinMode(13,OUTPUT)即是設定引腳的模式,這裡設定了13腳為輸出模式;而digitalWrite(13,HIGH) 是讓13腳輸出高電平數字信号,digitalWrite(13,LOW) 是讓13腳輸出低電平數字信号。
這些封裝好的API,使得程式中的語句更容易被了解,我們不用理會單片機中繁雜的寄存器配置,就能直覺的控制Arduino,增強程式的可讀性的同時,也提高了開發效率。
我們建立一個項目,你會發現,在Arduino程式中是沒有main函數的。其實并不是Arduino沒有main函數,而是main函數的定義隐藏在了Arduino的核心庫檔案中。Arduino開發一般不直接操作main函數,而是使用Setup和loop這個兩個函數。 Arduino程式基本結構由setup() 和loop() 兩個函數組成:
void setup(){// 在這裡加入setup代碼,它隻會運作一次:}void loop(){// 在這裡加入loop代碼,它會不斷重複運作:}
Arduino控制器(NodeMCU)通電或複位後,即會開始執行setup() 函數中的程式,該部分隻會執行一次。 通常我們會在setup() 函數中完成Arduino(NodeMCU)的初始化設定,如配置I/O口狀态,初始化序列槽等操作。
在setup() 函數中的程式執行完後,Arduino(NodeMCU)會接着執行loop() 函數中的程式。而loop()函數是一個死循環,其中的程式會不斷的重複運作。
通常我們會在loop() 函數中完成程式的主要功能,如驅動各種子產品,采集資料等。
那麼了解了NodeMCU的硬體和軟體之後,就正式開始編寫程式了。 今天寫的流水燈程式,主要是使用6根線,控制9個LED燈的亮滅,要實作這個功能,咱們先來了解下LED點陣。我這裡是使用了自制的3*3點陣,某寶可以購買8*8的點陣,更加內建化。實物圖和原理圖如下:
原理圖:
前面講到,在NodeMCU中,可以使用10個腳作為數字輸入輸出腳,那麼使用其中的6隻作為輸出腳,對應關系如下表:
GPIO | 13 | 12 | 14 | 4 | 5 | 16 |
燈珠矩陣 | 1 | 2 | 3 | 4 | 5 | 6 |
那麼也就是說,把GPIO13拉高,(digitalWrite(13,HIGH);),再把GPIO4拉低(digitalWrite(4,LOW);),即可使燈珠1亮起。 接線完畢之後,開始寫程式。 首先初始化引腳模式以 及設定初始電平:
int pin[6]={13,12,14,4,5,16};void setup() { for(int i=0;i<6;i++) { pinMode(pin[i],OUTPUT); if(i<3) digitalWrite(pin[i],LOW); else digitalWrite(pin[i],HIGH); }}
接下來編寫主程式。為了讓大家明白流水燈是個怎麼“流”法,我畫了一張表格:
燈珠|GPIO | 13 | 12 | 14 | 4 | 5 | 16 |
1 | 1 | 1 | 1 | |||
2 | 1 | 1 | 1 | |||
3 | 1 | 1 | 1 | |||
4 | 1 | 1 | 1 | |||
5 | 1 | 1 | 1 | |||
6 | 1 | 1 | 1 | |||
7 | 1 | 1 | 1 | |||
8 | 1 | 1 | 1 | |||
9 | 1 | 1 | 1 |
其中表格正文的0和1代表着電平的高低,1是高電平,也就是HIGH。0是低,也就是LOW。 也就是先把燈珠矩陣引腳1拉高,再分别拉低4,5,6,也就是燈珠1,2,3分别亮。 可以發現,引腳電平變化是有種周期性。外循環每循環一次,内循環循環三次。 那麼可以根據這種周期性來寫loop()
void loop() { for(int i=0;i<3;i++) { digitalWrite(pin[i],HIGH);//拉高第i行 for(int j=3;j<6;j++) { digitalWrite(pin[j],LOW);//拉低第j列 delay(500);//延時0.5s digitalWrite(pin[j],HIGH);//拉高第j列(拉高拉低相當于亮了一次) delay(500);//延時0.5s } digitalWrite(pin[i],LOW);//拉低第i行,如果無此語句,那麼外循環第二次的時候第一行也會亮。 }}
最後插上開發版燒錄就行啦。
效果: