iT邦幫忙

2022 iThome 鐵人賽

DAY 6
2
自我挑戰組

PixelBit 可以這樣玩!系列 第 6

(Day 6)ESP32 與 ATmega328P 的 UART 通訊(Part 2)

  • 分享至 

  • xImage
  •  

這篇文章將會接續上一篇「ESP32 與 ATmega328P 的 UART 通訊(Part 1)」。

教學原文參考:ESP32 與 ATmega328P 的 UART 通訊

程式撰寫

4. ATmega328P 發送訊息的程式

接下來讓我們來看 ATmega328P 發送訊息的程式,請開啟第三個程式「03.UART_Send_ATmega328p」。

https://www.circuspi.com/wp-content/uploads/2022/04/29.jpg

完整程式碼如下所示:

int text = 1;

void setup() {
  Serial.begin(57600);

}

void loop() {
  Serial.println(text);
  text++;
  if (text > 100) text = 1;
  delay(1000);
}

作為訊息發送者的 ATmega328P,程式較為簡單,只要單純的發送即可。

首先新增一個整數類型的變數「text」,並設定初始值為 1。並於 setup 區塊同樣啟用 UART 功能 Serial,並賦予傳輸速率同樣為「57600」。兩塊控制器速率需要相同,這樣才能正常收發訊息。

int text = 1;

void setup() {
  Serial.begin(57600);
}

在 loop 區塊,我們透過「Serial.println」這個程式發送一行訊息,訊息內容為變數 text 儲存的數字。發送完後將變數 text 儲存的數字累加 1,接著檢查數字是否超過 100,如果超過會將 text 儲存的數字強制更改成 1。

void loop() {
  Serial.println(text);
  if (++text > 100) 
		text = 1;
  delay(1000);
}

經由暫停毫秒程式「delay(1000)」,會讓程式以每隔 1 秒的時間發送訊息,訊息內容為 1~100。

5. 上傳程式到 ATmega328P 的方法

首先將 Pixel:Bit 上面的 UART 切換開關,切至「PRO MINI」模式。

https://www.circuspi.com/wp-content/uploads/2022/04/33.jpg

於「工具」>「開發板」的欄位選擇「Arduino Pro or Pro Mini」這塊開發板,並於處理器選項選擇「ATmega328P(3.3V, 8 MHz)」。一樣選擇正確的「序列埠」,序列埠的編號會依照您自己的電腦設定而與下圖有所不同。

https://www.circuspi.com/wp-content/uploads/2022/04/34-1.jpg

最後按下燒錄按鈕,將程式燒錄到 ATmega328P。

https://www.circuspi.com/wp-content/uploads/2022/04/35-1.jpg

6. 切換互連模式

當兩邊的程式都燒錄完成後,就能將 UART 模式切換開關切至互連模式「GO」,這個模式會讓 ESP32 與 ATmega328P 連接在一起。

https://www.circuspi.com/wp-content/uploads/2022/04/36-1.jpg

切換過去後重新拔插 Micro USB,此時 ATmega328P 就會開始發送資料,ESP32 接收到資料後就會顯示在螢幕上。

https://lh6.googleusercontent.com/ZixymDgC-JSvlT2tsTE-sRs0LOXNYsVRW6udkWLnUzRjXb_m5m-kDCdk95bC6V84g9tQOLkn1rHqDsHC7JQ7DChHjt-wmXrb0nSMLgjgXCGMR-e97EN87F0rb5_CHsx8Ho8gKcs4

六、進階程式撰寫

經過前面的教學,相信大家對於兩顆控制器燒錄程式的方法、收發程式的方式與互連的部份,已有了些許的概念。

接下來讓我們提高一點程式難度,改發送有意義的文字,並讓接收端除了接收訊息外,增加比對文字的步驟。依照收到的訊息,顯示對應的文字顏色。

讓我們這次先從發送者開始,請先開啟第五個程式「05.UART_Send2_ATmega328p」。

https://www.circuspi.com/wp-content/uploads/2022/04/38.jpg

完整程式碼如下所示:

void setup() {
  Serial.begin(57600);
}

void loop() {
  Serial.println("Red");
  delay(1000);
  Serial.println("Green");
  delay(1000);
  Serial.println("Blue");
  delay(1000);
  Serial.println("Gray");
  delay(1000);
}

可以看到程式碼內 loop 的區塊,以每秒的頻率發送表示顏色的文字訊息,分別是「Red」、「Green」、「Blue」與「Gray」。

小知識

「Serial.println(“Red”)」實際上發送的訊息是「Red\r\n」,而不是單純的「Red」,\r 表示的是確認鍵或輸入鍵(鍵盤上的 Enter),\n 則是換行的意思。因為 \r\n 是表示訊息的呈現方式,所以透過序列埠監控視窗或是顯示螢幕的程式將「Red\r\n」印出來時,並不會真的顯示\r\n出來,只會顯示「Red」,但不代表它們不存在。

接著讓我們來看接收端的程式,這個程式包含接收後比對,與顯示的部份,請開啟第四個程式「04.UART_Read_and_Show2_ESP32」。

https://www.circuspi.com/wp-content/uploads/2022/04/40-1.jpg

讓我們直接來看比對與顯示的程式,比對的部分需要將「\r\n」一併做比對,雖然顯示時看不到,但確實有傳送過來,若是忽略這兩個東西,比對是會失敗的喔。

if (inChar == '\n') {
	tft.fillScreen(TFT_BLACK);
	tft.setCursor(0, 0);
  tft.setTextSize(7);
	if (inputString == "Red\r\n") {
	  tft.setTextColor(TFT_RED, TFT_BLACK);
	}
	else if (inputString == "Green\r\n") {
	  tft.setTextColor(TFT_GREEN, TFT_BLACK);
	}
	else if (inputString == "Blue\r\n") {
	  tft.setTextColor(TFT_BLUE, TFT_BLACK);
	}
	else {
	  tft.setTextColor(TFT_DARKGREY, TFT_BLACK);
	}
	tft.println("Color");
	inputString = "";
}

在顯示的地方我們依照比對到的訊息,在設定顯示文字顏色的地方一併更改對應的顏色。例如收到「Red\r\n」,文字就呈現紅色

看完了兩邊的程式,就讓我們依照之前教過的步驟,分別燒錄程式到 ESP32 與 ATmega328P 裡。

燒錄完成後請將 UART 模式開關切換至「GO」,成功的話就能看到如下方的畫面(綠色的部分錄影顯示不是很清楚)。

https://lh5.googleusercontent.com/xHDAzmqOKDTiOy70BKaizjyAJEaOvI4kP10HQkqd7ZScjOwNTjEsZ2ErPZB_n6jSavwwj3dqf8EMp64rm0Eui1F9OGcwXP6f9ij_U1eMUEgv2z2Tt0rIAqqztIDFK31I9hS1PMxT

小結

在這個單元,我們學習了如何透過顯示螢幕顯示資訊,並且分別在兩顆控制器燒錄對應的程式,讓它們能進行通訊。在接下來的單元,我們時常會用到互連的功能,將我們要執行的任務拆分給 ESP32 與 ATmega328P。若是之後不熟悉的話,可以再回到這個單元複習。

更多有趣系列教學文章


上一篇
(Day 5)ESP32 與 ATmega328P 的 UART 通訊(Part 1)
下一篇
(Day 7)Camera Web Server 相機應用(Part 1)
系列文
PixelBit 可以這樣玩!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言