一般的七段LED顯示器必須使用到8隻IO接腳,而且可顯示的訊息也很有限(一般可顯示0~8及A~F),如果使用ESP8266去驅動單一的七段LED顯示器就會面臨只剩一隻IO腳位可用的窘境,因此假如有需要在系統上顯示文數字訊息的話,最好改用LCD顯示器,而且是只需要2隻接腳的I2C介面LCD顯示器。本範例就是結合前面【四.6 16 X 2 I2C介面LCD顯示實習】與【四.7 4 X 4 鍵盤實習】這兩個實習,把使用者在4 X 4 鍵盤上按下的數值顯示在LCD顯示器上。
◎功能與動作說明:
1、 使用ESP8266的A0類比輸入腳及7顆電阻設計一個16按鍵的4X4鍵盤輸入電路。
2、 當按鍵被按下時,ESP8266模組板上的Pin2內建LED會閃爍一下,而且對應的按鍵值會顯示在Arduino IDE的序列監控視窗中,與16 X 2 I2C介面LCD顯示器上。
3、LCD顯示器上第一行顯示的訊息為:[4X4 KeyPad test:],第二行為:[Key Number=?],其中的問號即為鍵盤被按下的按鍵值。
◎電路圖:
圖4-18 4X4鍵盤輸入與I2C介面LCD顯示器麵包板接線與電路圖
◎程式說明與列表:
本範例程式基本上也是以【四.7】節的範例程式”Key4X4_1.ino”為基礎,在此僅對新增對部分加以說明。程式的第1行宣告了使用I2C界面LCD顯示器所需引用的程式庫<LiquidCrystal_I2C.h>,並定義一個I2C介面的LCD顯示器物件變數”lcd” (第3行),由其中的參數可知它的I2C匯流排位址為”0x27”,而接著的8~14行變數宣告部分和前面4X4鍵盤範例相同。
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
在初始化程式區(16~31行)中,先設定指示用的LED腳(GPIO2)為輸出,然後初始化Arduino IDE的序列通訊埠的傳輸速率為115200bps(18~21行),接著再初始化LCD顯示器,並啟動LCD背光光源(22、23行),最後把前面設定的功能與動作中第3項的兩行訊息顯示在LCD的螢幕上(25~30行)。
至於主迴圈程式區(33~51行),則是整個複製【四.7】節的範例程式”Key4X4_1.ino”,並在中間加了下面這兩行程式,這樣就成功組合成本節的範例程式。這兩行程式的動作內容已經寫在指令後面的註解部分,請自行參閱。
46. lcd.setCursor(13, 1); // 將游標移動到LCD顯示器的第二行第14個位置
47. lcd.print(keyChar[keyNumber]); // 在此顯示鍵轉換對應值字元
以下是完整的程式列表:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
// 不同按鍵之類比輸入轉換值陣列:
// 按鍵對應值 : 1 E 7 2 0 8 3 F 9 A D C 4 5 6 B
const int keyValue[]={950,800,670,520,460,410,350,315,280,255,245,230,210,170,140,110};
// 類比輸入轉換值與實際鍵盤值對應轉換陣列
const byte keyNumbers[]={1,0x0e,7,2,0,8,3,0x0f,9,0x0a,0x0d,0x0c,4,5,6,0x0b};
// 數字與ASCII碼字元轉換陣列
const char keyChar[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
byte keyNumber;
int KeyIn;
void setup()
{
pinMode(2,OUTPUT); // 設定ESP8266模組版的第2腳為輸出
digitalWrite(2,0); // 設定第2腳的輸出值為0
Serial.begin(115200); // 初始化串列監控視窗,並設定傳輸速率為115200Bps
Serial.println("Start..."); // 在串列監控視窗中顯示開始提示訊息
lcd.init(); // 初始化LCD顯示器
lcd.backlight(); // 啟動LCD顯示器的背光
lcd.home(); // 游標歸位到LCD螢幕左上角第一行的一個位置
lcd.setCursor(0, 0); // 將游標移動到第一行的第1個位置
lcd.print("4X4 KeyPad test:"); //在第一行顯示"4X4 KeyPad test:"的訊息
lcd.setCursor(1, 1); // 將游標移動到第二行的第2個位置
lcd.print("Key Number= "); // 在第二行顯示"Key Number= "的提示訊息
}
void loop()
{
if(keyPress()) // 測試是否有任一鍵被被按下
{ // 有鍵被被按下將按鍵轉換結果顯示在串列監控視窗中
digitalWrite(2,0); // 將內建在ESP8266的第2腳的LED點亮
delay(50);
digitalWrite(2,1); // 將內建在ESP8266的第2腳的LED熄滅
keyNumber=findKeyNumber(); // 將按鍵輸入轉換結果再轉換成實際的按鍵對應值
Serial.println(keyNumber); // 將按鍵轉換對應值顯示在串列監控視窗
Serial.print("Key => ");
Serial.println(keyChar[keyNumber]);// 這次以字元的形式將按鍵轉換對應值顯示在串列監控視窗中
lcd.setCursor(13, 1); // 將游標移動到第二行的第14個位置
lcd.print(keyChar[keyNumber]); // 在此顯示鍵轉換對應值字元
while(keyPress()); // 等待使用者將按鍵放開
delay(30);
}
}
// 4 X 4鍵盤按鍵轉換副程式 : 依偵測到的輸入電壓判斷並轉換成實際對應的鍵盤按鍵值
byte findKeyNumber(){
delay(10);
KeyIn=analogRead(A0); // 讀取類比輸入腳A0的電壓轉換值
Serial.println(KeyIn); // 將類比輸入腳A0的電壓轉換值顯示在串列監控視窗中
for(byte i=0;i<16;i++) // 以預設的16個按鍵轉換範圍陣列去判斷可能的按鍵值
{
if(KeyIn>keyValue[i])
return(keyNumbers[i]) ; // 將測試的結果回傳給呼叫者
}
}
// 按鍵被按下偵測副程式 : 若有任一鍵被被按下會傳回true
boolean keyPress(){
delay(5); //
KeyIn=analogRead(A0); // 讀取類比輸入腳A0的電壓轉換值
if(KeyIn>40) // 測試電壓輸入值,若有任一鍵被按下其電壓轉換值必定會在40以上
{
delay(20); // 等待50mS好讓輸入腳狀態穩定
KeyIn=analogRead(A0); // 再次讀取電壓轉換值
return(true); // 若有任一鍵被被按下傳回true
}
else
return(false); // 若沒有鍵被被按下則傳回false
}
程式名稱:Key4X4_LCD1.ino
沒有留言:
張貼留言