概述
在本課中,您將在第4課的基礎上,添加使用Arduino串行監視器控制計算機上的LED的功能。串行監視器是計算機和Arduino之間的“紐帶”-它使您可以發送和接收文本消息,方便調試以及通過鍵盤控制Arduino!
例如,您將能夠從計算機發送命令來打開LED 。
在本課程中,您將使用與第4課完全相同的部件和類似的面包板布局。因此,如果您尚未這樣做,請立即按照第4課進行。
串行監視器
將以下草圖上傳到Arduino。稍后,我們將確切了解其工作原理。
下載:文件
復制代碼
/*
Adafruit Arduino - Lesson 5. Serial Monitor
*/
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
byte leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
updateShiftRegister();
Serial.begin(9600);
while (! Serial); // Wait untilSerial is ready - Leonardo
Serial.println(“Enter LED Number 0 to 7 or ‘x’ to clear”);
}
void loop()
{
if (Serial.available())
{
char ch = Serial.read();
if (ch 》= ‘0’ && ch 《= ‘7’)
{
int led = ch - ‘0’;
bitSet(leds, led);
updateShiftRegister();
Serial.print(“Turned on LED ”);
Serial.println(led);
}
if (ch == ‘x’)
{
leds = 0;
updateShiftRegister();
Serial.println(“Cleared”);
}
}
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
} /*
Adafruit Arduino - Lesson 5. Serial Monitor
*/
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
byte leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
updateShiftRegister();
Serial.begin(9600);
while (! Serial); // Wait untilSerial is ready - Leonardo
Serial.println(“Enter LED Number 0 to 7 or ‘x’ to clear”);
}
void loop()
{
if (Serial.available())
{
char ch = Serial.read();
if (ch 》= ‘0’ && ch 《= ‘7’)
{
int led = ch - ‘0’;
bitSet(leds, led);
updateShiftRegister();
Serial.print(“Turned on LED ”);
Serial.println(led);
}
if (ch == ‘x’)
{
leds = 0;
updateShiftRegister();
Serial.println(“Cleared”);
}
}
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
將此草圖上傳到Arduino之后,單擊Arduino IDE工具欄上最右邊的按鈕。該按鈕在下方圈出。
將打開以下窗口。
該窗口稱為“串行監視器”,它是Arduino IDE軟件的一部分。它的工作是使您既可以從計算機向Arduino板發送消息(通過USB),也可以從Arduino接收消息。
消息“輸入LED編號0至9或‘x’清除”是由Arduino發送的,它告訴我們可以向Arduino發送哪些命令,這些命令要么發送“ x”(關閉所有LED),要么發送您想要打開的LED數量(其中0是底部的LED,1是下一個LED,頂部是LED,最多7個LED)。
嘗試在串行監視器的頂部區域中鍵入以下命令,并與“發送”按鈕對齊。鍵入以下每個字符后,按‘Send’:x 0 3 5
鍵入x無效,如果LED指示燈已全部熄滅,但是在輸入每個數字時,相應的LED指示燈應點亮,并且您將從Arduino板獲得確認消息,以便串行監視器如下所示。
您可以看到,在再次輸入“ x”后,我即將按發送。這樣做,所有的LED都將熄滅。
如您所料, Arduino代碼
該草圖基于第4課中使用的草圖。因此,我們將在此處介紹新內容。您會發現在Arduino IDE中引用完整的草圖很有用。
首先,在“設置”功能中,最后增加了三行:
下載:文件
復制代碼
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
updateShiftRegister();
Serial.begin(9600);
while (! Serial); // Wait until Serial is ready - Leonardo
Serial.println(“Enter LED Number 0 to 7 or ‘x’ to clear”);
} void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
updateShiftRegister();
Serial.begin(9600);
while (! Serial); // Wait until Serial is ready - Leonardo
Serial.println(“Enter LED Number 0 to 7 or ‘x’ to clear”);
}
首先,我們有命令‘Serial.begin(9600)’。這將開始串行通信,以便Arduino可以通過USB連接發送命令。值9600稱為連接的“波特率”。這是數據發送的速度。您可以將其更改為更高的值,但還必須將Arduio Serial監視器更改為相同的值。我們將在后面討論,但現在將其保留在9600。
以“ while”開頭的行可確保USB連接的另一端有一些東西供Arduino在開始發送消息之前與之交談。否則,可能會發送該消息,但不會顯示。僅當您使用Arduino Leonardo時,此行實際上才是必需的,因為當您打開串行監視器時,Arduino Uno會自動重置Arduino板,而Leonardo則不會。
‘設置”發出我們在串行監視器頂部看到的消息。
“循環”功能是發生所有操作的地方:
下載:文件
復制代碼
void loop()
{
if (Serial.available())
{
char ch = Serial.read();
if (ch 》= ’0‘ && ch 《= ’7‘)
{
int led = ch - ’0‘;
bitSet(leds, led);
updateShiftRegister();
Serial.print(“Turned on LED ”);
Serial.println(led);
}
if (ch == ’x‘)
{
leds = 0;
updateShiftRegister();
Serial.println(“Cleared”);
}
}
}
void loop()
{
if (Serial.available())
{
char ch = Serial.read();
if (ch 》= ’0‘ && ch 《= ’7‘)
{
int led = ch - ’0‘;
bitSet(leds, led);
updateShiftRegister();
Serial.print(“Turned on LED ”);
Serial.println(led);
}
if (ch == ’x‘)
{
leds = 0;
updateShiftRegister();
Serial.println(“Cleared”);
}
}
}
循環中發生的所有事情都包含在’if‘語句中。因此,除非對內置Arduino函數’Serial.available()‘的調用為’true‘,否則將不會發生其他任何事情。
Serial.available()如果數據已發送至Arduino和準備好要處理了嗎?傳入的消息保存在所謂的緩沖區中,如果該緩沖區不為空,則Serial.available()返回true。
如果已接收到消息,則將其轉到下一行代碼:
下載:文件
復制代碼
char ch = Serial.read(); char ch = Serial.read();
這將從緩沖區中讀取下一個字符,并將其從緩沖區中刪除。它還將其分配給變量“ ch”。變量“ ch”的類型為“ char”,代表“字符”,顧名思義,它包含一個字符。
如果您已按照串行監視器頂部提示中的說明進行操作,則此字符可以是0到7之間的一個數字或字母’x‘。
下一行的’if‘語句通過查看’ch‘是否大于或等于來檢查它是否是一個數字。等于字符“ 0”且小于或等于字符“ 7”。以這種方式比較字符看起來有些奇怪,但是完全可以接受。
每個字符都由一個唯一的數字表示,稱為ASCII值。這意味著當我們使用《=和》 =比較字符時,實際上是被比較的ASCII值。
如果測試通過,則進入下一行:
下載:文件
復制代碼
int led = ch – ’0‘; int led = ch – ’0‘;
現在,我們正在對字符進行算術運算!我們將從輸入的任何數字中減去數字“ 0”。因此,如果鍵入’0‘,則’0‘–’0‘將等于0。如果鍵入’7‘,則’7‘–’0‘將等于數字7,因為實際上是正在使用的ASCII值
由于我們知道要打開的LED的數量,因此只需要在變量“ leds”中設置該位并更新移位寄存器即可。
下載:文件
復制代碼
bitSet(leds, led);
updateShiftRegister(); bitSet(leds, led);
updateShiftRegister();
接下來的兩行將確認消息寫回到串行監視器。
下載:文件
復制代碼
Serial.print(“Turned on LED ”);
Serial.println(led); Serial.print(“Turned on LED ”);
Serial.println(led);
第一行使用Serial.print而不是Serial.println。兩者之間的區別在于,Serial.print在打印其參數中的任何內容后都不會開始新行。我們在第一行中使用它,因為我們將消息分為兩部分進行打印。首先是通用位:“打開LED”,然后是LED的編號。
LED的編號保存在“ int”變量中,而不是文本字符串。 Serial.print可以采用雙引號括起來的文本字符串,也可以采用’int‘或與此相關的幾乎任何類型的變量。
處理情況的’if‘語句之后,一位數字已被處理,還有第二個’if‘語句,用于檢查’ch‘是否為字母’x‘。
下載:文件
復制代碼
if (ch == ’x‘)
{
leds = 0;
updateShiftRegister();
Serial.println(“Cleared”);
} if (ch == ’x‘)
{
leds = 0;
updateShiftRegister();
Serial.println(“Cleared”);
}
如果是,則清除所有指示燈并發送確認消息。
其他要做的事情
我們通過在每個字符后單擊“發送”來發送字符來分別控制LED。但是,如果您在一行中發送所有字符命令,它將同樣有效。嘗試在串行監視器中輸入以下內容,然后單擊“發送”:
x0246
現在,讓我們看看Arduino可以通訊的速度。將草圖中的波特率從9600更改為115200,然后再次將其上載到板。然后,在打開串行監視器后,從下拉列表中選擇115200。
您應該發現一切仍然有效。高速通信通常不是必需的,因此經常使用9600的波特率,因為許多串行外圍設備(例如GPS模塊)會將其作為默認波特率,因此這是一個標準。
請嘗試不匹配波特率-例如,使用Serial.begin(9600)并在下拉菜單中選擇57600??吹娇雌饋硐袷裁磫??全部亂碼?錯了如果您在串行監視器中收到奇怪的數據,請三遍檢查波特率并確保它們匹配!
串行監視器也是調試行為異常的草圖的一種好方法。有時,當草圖不符合您的想法時,將Serial.println()語句放在關鍵位置將有助于您查看發生的情況。
責任編輯:wv
-
監視器
+關注
關注
1文章
780瀏覽量
33150 -
串行
+關注
關注
0文章
237瀏覽量
33883 -
Arduino
+關注
關注
188文章
6471瀏覽量
187244
發布評論請先 登錄
相關推薦
評論