37款傳感器與執行器的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止這37種的。鑒于本人手頭積累了一些傳感器和執行器模塊,依照實踐出真知(一定要動手做)的理念,以學習和交流為目的,這里準備逐一動手嘗試系列實驗,不管成功(程序走通)與否,都會記錄下來---小小的進步或是搞不掂的問題,希望能夠拋磚引玉。
【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗一百一十三:藍色諾基亞5110屏 LCD液晶屏模塊 兼容3310 LCD
PCD8544
是一塊低功耗的CMOS LCD 控制驅動器,設計為驅動48 行84 列的圖形顯示。所有必須的顯示功能集成在一塊芯片上,包括LCD 電壓及偏置電壓發生器,只須很少外部元件且功耗小。
PCD8544 特征
單芯片 LCD 控制/驅動
48 行,84 列輸出
顯示數據 RAM 48*84 位
芯片集成:
——LCD 電壓發生器(也可以使用外部電壓供應)
——LCD偏置電壓發生器
——振蕩器不需要外接元件(也可以使用外部時鐘)
外部 RES(復位)輸入引腳
串行界面最高 4.0Mbits/S
CMOS 兼容輸入
混合速率:48
邏輯電壓范圍 VDD 到 VSS:2.7V~3.3V
顯示電壓范圍 VLCD 到 VSS:
——6.0~8.5V LCD內部電壓發生器(充許電壓發生器)
——6.0~9.0V LCD 外部電壓供應(電壓發生器關閉)
低功耗,適用于電池供電系統
關于 VLCD的溫度補償
使用溫度范圍:-25~70℃
這塊屏原來是20多年前發布的諾基亞5110手機的屏幕
5110液晶屏模塊特點
●84x48 的點陣LCD,可以顯示4 行漢字,
●采用串行接口與主處理器進行通信,接口信號線數量大幅度減少,包括電源和地在內的信號線僅有8條。支持多種串行通信協議(如AVR 單片機的SPI、MCS51 的串口模式0等),傳輸速率高達4Mbps,可全速寫入顯示數據,無等待時間。
●可通過導電膠連接模塊與印制版,而不用連接電纜,用模塊上的金屬鉤可將模塊固定到印制板上,因而非常便于安裝和更換。
●LCD 控制器/驅動器芯片已綁定到LCD 晶片上,模塊的體積很小。
●采用低電壓供電,正常顯示時的工作電流在200μA 以下,且具有掉電模式。
5110液晶屏模塊底板為本站設計,四角有定位孔,同時提供上下兩排接線端口,排列如下:
RST ——復位
CE —— 片選
DC —— 數據/指令選擇
DIN —— 串行數據線
CLK —— 串行時鐘線
VCC —— 電源輸入(3.3v和5v均可,經過實驗驗證,沒有問題)
BL —— 背光控制端
GND —— 地線
接口為串行SPI接口
工作原理
利用PC上的16×16點陣漢字庫,提取后將點陣文件存入ROM,直接利用PC中漢字內碼作為單片機系統的編碼(不再形成新的漢字編碼)。在數字電路中,所有的數據都是以0和1保存的,對LCD控制器進行不同的數據操作,可以得到不同的結果。對于顯示英文操作,由于英文字母種類很少,只需要8位(一字節)即可。而對于中文,常用卻有6000以上,將ASCII表的高128個很少用到的數值以兩個為一組來表示漢字,即漢字的內碼。而剩下的低128位則留給英文字符使用,即英文的內碼。那么,得到了漢字的內碼后,還僅是一組數字,那又如何在屏幕上去顯示呢?這就涉及到文字的字模,字模雖然也是一組數字,但它的意義卻與數字的意義有了根本的變化,它是用數字的各位信息來記載英文或漢字的形狀,如英文的“A”在字模的記載方式如圖
Arduino接線示意圖
Arduino實驗開源代碼
/*
【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗一百一十三:藍色諾基亞5110屏 LCD液晶屏模塊 兼容3310 LCD
1、安裝“LCD5110_Basic”庫(下載鏈接 http://www.rinkydinkelectronics. ... e=LCD5110_Basic.zip)
2、項目測試 :點亮模塊
3、模塊接線
Nokia 5110 Arduino
RST 6
CE 7
DC 5
DIN 4
CLK 3
VCC 5V
BL 3V3
GND GND
*/
#include <LCD5110_Basic.h>
LCD5110 myGLCD(3,4,5,6,7);
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];
void setup(){
myGLCD.InitLCD(); //Intializing LCD
myGLCD.setContrast(69);//調整對比度0-127
}
void loop(){
myGLCD.setFont(SmallFont);
myGLCD.print("Hello World",CENTER,16);
delay(1000);
myGLCD.clrScr();
}
<LCD5110_Basic.h>常用函數
LCD5110(SCK,MOSI,DC,RST,CS);//設置引腳
Usage: LCD5110 myGLCD(8,9,10,11,12);
InitLCD([contrast]);//初始化
Usage:myGLCD.initLCD();
setContrast(contrast);//設置對比度(0-127)
Usage:myGLCD.setContrast(70);
enableSleep();//設置睡眠狀態
Usage:myGLCD.enableSleep();
disableSleep();//關閉睡眠狀態
Usage:myGLCD.disableSleep();
clrScr();//清屏
Usage:myGLCD.clrScr();
clrRow(row[,start_x[,end_x]]);//清除行的一部分或者整行
Usage:myGLCD.clrRow(5,42);
invert(mode);//倒置
Usage:myGLCD.invert(true);
print(st,x,y);//顯示字符串
Usage:myGLCD.print("Hello Wrold", CENTER, 0);
printNumI(num,x,y[,length[,filler]]);//顯示整數
Usage:myGLCD.printNumI(num, CENTER, 0);
printNumF(num,dec,x,y[,divider[,length[,filler]]]);//顯示小數
Usage:myGLCD.printNumF(num, 3,CENTER, 0);
setFont(fontname);//設置字體大小
Usage:myGLCD.setFont(SmallFont);
drawBitmap(x,y,data,sx,sy);//用于顯示自定義字符
Usage:myGLCD.drawBitmap(0,0,bitmap,32,32);
Arduino實驗場景圖
Arduino實驗開源代碼之二
/*
【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗一百一十三:藍色諾基亞5110屏 LCD液晶屏模塊 兼容3310 LCD
1、安裝 "U8glib.h"庫-工具-管理庫-搜索-安裝
2、項目測試 :簡易數字示波器(顯示X\Y坐標體系)
3、模塊接線
Nokia 5110 Arduino
RST 6
CE 7
DC 5
DIN 4
CLK 3
VCC 5V
BL 3V3
GND GND
*/
#include "U8glib.h"
int x,y; int Buffer[84];
U8GLIB_PCD8544 u8g(3, 4, 99, 5, 6);
// SPI Com: SCK = 3, MOSI = 4, CS = 接地, dc = 5, Reset = 6
void setup()
{
analogReference(INTERNAL); //ADC使用單片機內部1.1V基準
u8g.setContrast(100);//設置對比度0-255
}
void loop()
{
for(x = 0;x < 84;x++) //信號采樣
Buffer[x] = 47-(analogRead(A0)>>4);
u8g.firstPage(); //清屏
do //顯示
{
for(x = 0;x < 83;x++)
u8g.drawLine(x,Buffer[x],x,Buffer[x+1]); //畫相鄰兩點連線
u8g.drawLine(42,0,42,47); // 畫x坐標軸
u8g.drawLine(0,24,84,24); // 畫y坐標軸
for(x=2;x<84;x+=8) //畫x坐標軸刻度
u8g.drawLine(x,23,x,25);
for(x=0;x<48;x+=8) //畫y坐標軸刻度
u8g.drawLine(41,x,43,x);
u8g.drawFrame(0,0,84,48); //畫邊框
}
while(u8g.nextPage( ));
delay(1000);
}
Arduino實驗場景圖
Arduino實驗開源代碼之三
/*
【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗一百一十三:藍色諾基亞5110屏 LCD液晶屏模塊 兼容3310 LCD
1、安裝“LCD5110_Basic”庫(下載鏈接 http://www.rinkydinkelectronics. ... e=LCD5110_Basic.zip)
2、項目測試 :嘗試輸出漢字“國慶快樂”
3、模塊接線
Nokia 5110 Arduino
RST 6
CE 7
DC 5
DIN 4
CLK 3
VCC 5V
BL 3V3
GND GND
*/
int LCD_CE=7;
int LCD_RST=6;
int SCLK=3;
int SDIN=4;
int LCD_DC=5;
//****************************定義ASCII字符**********************//
/**********************************
6 x 8 font
1 pixel space at left and bottom
index = ASCII - 32
***********************************/
const unsigned char font6x8[][6] =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp
{ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
{ 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
{ 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
{ 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
{ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // %
{ 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
{ 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
{ 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
{ 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )
{ 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
{ 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
{ 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // ,
{ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // -
{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
{ 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
{ 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0
{ 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1
{ 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
{ 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3
{ 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4
{ 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
{ 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6
{ 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
{ 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
{ 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9
{ 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
{ 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;
{ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
{ 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
{ 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
{ 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
{ 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @
{ 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A
{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
{ 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
{ 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
{ 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
{ 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
{ 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
{ 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
{ 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
{ 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
{ 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P
{ 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
{ 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
{ 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
{ 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
{ 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
{ 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
{ 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W
{ 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
{ 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
{ 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
{ 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
{ 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55
{ 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
{ 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
{ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
{ 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
{ 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
{ 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b
{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
{ 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
{ 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
{ 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
{ 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g
{ 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
{ 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
{ 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j
{ 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
{ 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
{ 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
{ 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p
{ 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q
{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
{ 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
{ 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
{ 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
{ 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
{ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
{ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
{ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y
{ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z
{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines
};
static const byte hanzi12x16[][24]={
{0x00,0x00,0xFC,0x02,0x8A,0xF2,0x8A,0x8A,0x0A,0x02,0xFC,0x00,
0x00,0x00,0x3F,0x28,0x28,0x2F,0x28,0x2B,0x2C,0x20,0x1F,0x00}/*"國"0*/
,{0x00,0x00,0xF8,0x88,0x88,0x88,0xFC,0x88,0x88,0x88,0x88,0x00,
0xC0,0x38,0x87,0x40,0x20,0x18,0x07,0x06,0x18,0x20,0x40,0x00}/*"慶"1*/
,{0x00,0xE0,0xFE,0x20,0x40,0x10,0xFE,0x12,0x10,0xF0,0x00,0x00,
0x00,0x00,0x7F,0x80,0x40,0x31,0x0F,0x06,0x19,0x21,0x41,0x00}/*"快"2*/
,{0x00,0x00,0xF8,0x88,0x84,0x84,0xF4,0x84,0x84,0x80,0x80,0x00,
0x00,0x20,0x11,0x0C,0x00,0x40,0x7F,0x00,0x04,0x18,0x30,0x00}/*"樂"3*/
};
/************************LCD初始化函數********************************/
void LCD_init(void)
{
//先設置為輸出
pinMode(SCLK,OUTPUT);
pinMode(SDIN,OUTPUT);
pinMode(LCD_DC,OUTPUT);
pinMode(LCD_CE,OUTPUT);
pinMode(LCD_RST,OUTPUT);
// 產生一個讓LCD復位的低電平脈沖
digitalWrite( LCD_RST, LOW);
delayMicroseconds(1);
digitalWrite( LCD_RST, HIGH);
// 關閉LCD
digitalWrite( LCD_CE, LOW);
delayMicroseconds(1);
// 使能LCD
digitalWrite( LCD_CE, HIGH); //LCD_CE = 1;
delayMicroseconds(1);
LCD_write_byte(0x21, 0); // 使用擴展命令設置LCD模式
LCD_write_byte(0xc8, 0); // 設置偏置電壓
LCD_write_byte(0x06, 0); // 溫度校正
LCD_write_byte(0x13, 0); // 1:48
LCD_write_byte(0x20, 0); // 使用基本命令
LCD_clear(); // 清屏
LCD_write_byte(0x0c, 0); // 設定顯示模式,正常顯示
// 關閉LCD
digitalWrite( LCD_CE, LOW); //LCD_CE = 0;
}
/************************LCD清屏函數*******************************/
void LCD_clear(void)
{
unsigned int i;
LCD_write_byte(0x0c, 0);
LCD_write_byte(0x80, 0);
for (i=0; i<504; i++)
{
LCD_write_byte(0, 1);
}
}
/*************************設置字符位置函數**************************/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
LCD_write_byte(0x40 | Y, 0);// column
LCD_write_byte(0x80 | X, 0);// row
}
/*************************ASCII字符顯示函數*************************/
void LCD_write_char(unsigned char c)
{
unsigned char line;
c -= 32;
for (line=0; line<6; line++)
{
LCD_write_byte(font6x8[c][line], 1);
}
}
/*******************************************************************/
/*-------------------------------------------------
LCD_write_english_String : 英文字符串顯示函數
輸入參數:*s :英文字符串指針;
X、Y : 顯示字符串的位置,x 0-83 ,y 0-5
--------------------------------------------------*/
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
{
LCD_set_XY(X,Y);
while (*s)
{
LCD_write_char(*s);
s++;
}
}
/******************************************************************/
/*---------------------------------------------
LCD_write_byte : 寫數據到LCD
輸入參數:data :寫入的數據;
command :寫數據/命令選擇;
---------------------------------------------*/
void LCD_write_byte(unsigned char dat, unsigned char command)
{
unsigned char i;
digitalWrite( LCD_CE, LOW); // 使能LCD_CE = 0
if (command == 0)
{
digitalWrite( LCD_DC, LOW);// 傳送命令 LCD_DC = 0;
}
else
{
digitalWrite( LCD_DC, HIGH);// 傳送數據LCD_DC = 1;
}
for(i=0;i<8;i++)
{
if(dat&0x80)
{
digitalWrite( SDIN, HIGH);//SDIN = 1;
}
else
{
digitalWrite( SDIN, LOW);//SDIN = 0;
}
digitalWrite( SCLK, LOW);//SCLK = 0;
dat = dat << 1;
digitalWrite( SCLK, HIGH);//SCLK = 1;
}
digitalWrite( LCD_CE, HIGH);//LCD_CE = 1;
}
/******************************************************************/
/*---------------------------------------------
void LCD_write_hanzi : 漢字顯示子函數
輸入參數:row :寫入漢字列 page :寫入漢字行 row :寫入漢字 ;
---------------------------------------------*/
void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char dd) //row:列 page:頁 dd:字符
{
unsigned char i;
LCD_set_XY(row*8, page);// 列,頁
for(i=0; i<12;i++)
{
LCD_write_byte(hanzi12x16[dd],1);
}
LCD_set_XY(row*8, page+1);// 列,頁
for(i=12; i<24;i++)
{
LCD_write_byte(hanzi12x16[dd],1);
}
}
void setup()
{
LCD_init();//初始化液晶
LCD_clear();
delay(10) ;
}
void loop()
{
LCD_write_hanzi(2,0,0) ;
LCD_write_hanzi(4,0,1) ;
LCD_write_hanzi(6,0,2) ;
LCD_write_hanzi(8,0,3) ;
delay(1000) ;
}
Arduino實驗場景圖
實驗開源圖形編程