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 myGLCD(3,4,5,6,7); extern uint8_t SmallFont ; extern uint8_t BigNumbers 常用函数 LCD5110(SCK,MOSI,DC,RST,CS);//设置引脚 Usage: LCD5110 myGLCD(8,9,10,11,12); InitLCD( );//初始化 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 ]);//清除行的一部分或者整行 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 ]);//显示整数 Usage:myGLCD.printNumI(num, CENTER, 0); printNumF(num,dec,x,y ]]);//显示小数 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 ; 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++) //信号采样 4); u8g.firstPage(); //清屏 do //显示 { for(x = 0;x < 83;x++) u8g.drawLine(x,Buffer ,x,Buffer ); //画相邻两点连线 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 = { { 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, 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, 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 ={ {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 , 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 ,1); } LCD_set_XY(row*8, page+1);// 列,页 for(i=12; i<24;i++) { LCD_write_byte(hanzi12x16 ,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实验场景图 实验开源图形编程 Arduino实验开源代码之四 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百一十三:蓝色诺基亚5110屏 LCD液晶屏模块 兼容3310 LCD 1、安装 "U8glib.h"库-工具-管理库-搜索-安装 2、项目测试 :简易数字示波器之二 3、模块接线 Nokia 5110 Arduino RST 6 CE 7 DC 5 DIN 4 CLK 3 VCC 5V BL 3V3 GND GND */ #include "U8glib.h" //U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8 U8GLIB_PCD8544 u8g(3, 4, 7, 5, 6); // SPI Com: clk = 3, din = 4, ce = 7, dc = 5, rst = 6 int x, y; int v0, v1; int Buffer ;//48*84的屏 void setup() { analogReference(INTERNAL); //ADC使用单片机内部1.1V基准 u8g.setContrast(100);//设置对比度0-255 u8g.firstPage(); do { u8g.setFont(u8g_font_helvB14); u8g.drawStr(0, 14, "V="); u8g.drawStr(26, 14, "12.34"); u8g.drawStr(0, 30, "A="); u8g.drawStr(26, 30, "56.789"); u8g.setFont(u8g_font_helvR08); u8g.drawStr( 0, 39, "T="); u8g.drawStr(10, 39, "12.34"); u8g.drawStr(37, 39, "\260C"); u8g.drawStr(52, 39, "fan on"); } while ( u8g.nextPage() ); delay(2000); } void loop( ) { do { v0 = analogRead(A0); } 10); for (x = 0; x < 84; x++) //信号采样 5); u8g.firstPage(); //清屏 do//显示 { for (x = 0; x < 83; x++) u8g.drawLine(x, Buffer , x, Buffer ); //画相邻两点连线 u8g.drawLine(42, 0, 42, 47); // 画坐标轴 u8g.drawLine(0, 24, 84, 24); for (x = 0; x < 84; x += 21) //画坐标轴刻度 u8g.drawLine(x, 23, x, 25); for (x = 0; x < 48; x += 8) u8g.drawLine(41, x, 43, x); u8g.drawFrame(0, 0, 84, 48); //画边框 } while (u8g.nextPage( )); } Arduino实验场景图