天天看點

Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式

前幾天突然想搞一個流水燈,說幹就幹。 首先介 紹一下今天的主角: NodeMCU NodeMcu使用了ESP8266 (ESP-12E)模組,隻不過和ESP8266(ESP-12E)相比,多了一些封裝。(自帶USB轉Serial子產品)

Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式
Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式

主要參數

Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式

引腳圖

Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式
Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式

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驅動)

Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式

那麼看完了NodeMCU的介紹,現在開始搞起今天的項目。

最新版Arduino IDE下載下傳   https://yun.coupile.top/#/s/WBh6Arduino IDE是開發Arduino用的,但是如果你要寫非Arduino的控制闆(比如今天的主角,NodeMCU,就是一款基于esp8266的開發闆),請先在檔案 —> 首選項 —> 附加開發闆管理器位址裡,輸入http://arduino.esp8266.com/stable/package_esp8266com_index.json 網址

Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式
Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式

确認儲存之後,再次選中工具 —> 開發闆:“XXXXXX” —> 開發闆管理器,在搜尋框中輸入esp8266,選擇安裝即可(可能會很慢,如果提示

Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式

就需要魔法飛到qiang外。)

Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式

安裝完成之後,重新打開工具 —> 開發闆:“XXXXXX”,選擇NodeMCU 1.0(ESP-12E)

Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式

然後就可以愉快的程式設計啦。

當然,我們還需要了解一下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() 函數中完成程式的主要功能,如驅動各種子產品,采集資料等。

Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式

那麼了解了NodeMCU的硬體和軟體之後,就正式開始編寫程式了。 今天寫的流水燈程式,主要是使用6根線,控制9個LED燈的亮滅,要實作這個功能,咱們先來了解下LED點陣。我這裡是使用了自制的3*3點陣,某寶可以購買8*8的點陣,更加內建化。實物圖和原理圖如下:

Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式

原理圖:

Arduino版讀取程式的規則_第一次實踐:寫一個基于NodeMCU開發闆的流水燈程式

前面講到,在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行,如果無此語句,那麼外循環第二次的時候第一行也會亮。  }}
           

最後插上開發版燒錄就行啦。

效果:

繼續閱讀