ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Arduino에 연결한 Nokia 5110 LCD에 온도센서값(ds18b20) 출력해보기
    Arduino Uno/주변장치 연결(Peripheral) 2015. 11. 25. 19:01







    DS18B20 온도센서로 측정한 값을 Nokia 5110 LCD에 출력하는 것을 해보았습니다..... 왼쪽사진은  현재 27도를 출력한 것이며 ... 손가락으로 온도센서를 살짝 대고 있으면 온도가 상승하여 오른쪽 사진처럼 29.5도 까지 올라갔습니다... 







    우선 온도 센서를 아래 회로도처럼 연결해주었습니다.




    그리고 Nokia 5110 LCD는 아래 글에 나온 것 처럼 연결해주었습니다.

    [임베디드/Arduino Uno] - Nokia 5110 LCD를 arduino uno에 연결하기




    그리고 온도 센서때문에 필요한 라이브러리를 설치해줍니다. 아래에서 라이브러리를 다운로드 받아서 압축을 푼 후 폴더를 복사해서


    http://download.milesburton.com/Arduino/MaximTemperature/DallasTemperature_372Beta.zip

    http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip


    아래 위치에 각각 복사해 넣습니다.



    이제 아두이노 코드를 작성하면 됩니다..


    1. #include <OneWire.h>    
    2. #include <DallasTemperature.h>    
    3. #include<stdlib.h>  
    4.       
    5. //DS18B20 온도 센서의 데이터선인 가운데 핀을 아두이노 2번에 연결합니다.     
    6. #define ONE_WIRE_BUS 2  
    7.   
    8. //1-wire 디바이스와 통신하기 위한 준비    
    9. OneWire oneWire(ONE_WIRE_BUS);    
    10.       
    11. // oneWire선언한 것을 sensors 선언시 참조함.    
    12. DallasTemperature sensors(&oneWire);    
    13.       
    14. //다비아스 주소를 저장할 배열 선언    
    15. DeviceAddress insideThermometer;    
    16.   
    17.   
    18.   
    19. #define PIN_SCE   7 //Pin 3 on LCD  
    20. #define PIN_RESET 6 //Pin 4 on LCD  
    21. #define PIN_DC    5 //Pin 5 on LCD  
    22. #define PIN_SDIN  4 //Pin 6 on LCD  
    23. #define PIN_SCLK  3 //Pin 7 on LCD  
    24.   
    25. //The DC pin tells the LCD if we are sending a command or data  
    26. #define LCD_COMMAND 0   
    27. #define LCD_DATA  1  
    28.   
    29. //You may find a different size screen, but this one is 84 by 48 pixels  
    30. #define LCD_X     84  
    31. #define LCD_Y     48  
    32.   
    33. //This table contains the hex values that represent pixels  
    34. //for a font that is 5 pixels wide and 8 pixels high  
    35. static const byte ASCII[][5] = {  
    36.   {0x00, 0x00, 0x00, 0x00, 0x00} // 20    
    37.   ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !  
    38.   ,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "  
    39.   ,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #  
    40.   ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $  
    41.   ,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %  
    42.   ,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &  
    43.   ,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '  
    44.   ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (  
    45.   ,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )  
    46.   ,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *  
    47.   ,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +  
    48.   ,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,  
    49.   ,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -  
    50.   ,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .  
    51.   ,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /  
    52.   ,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0  
    53.   ,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1  
    54.   ,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2  
    55.   ,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3  
    56.   ,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4  
    57.   ,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5  
    58.   ,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6  
    59.   ,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7  
    60.   ,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8  
    61.   ,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9  
    62.   ,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :  
    63.   ,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;  
    64.   ,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <  
    65.   ,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =  
    66.   ,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >  
    67.   ,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?  
    68.   ,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @  
    69.   ,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A  
    70.   ,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B  
    71.   ,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C  
    72.   ,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D  
    73.   ,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E  
    74.   ,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F  
    75.   ,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G  
    76.   ,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H  
    77.   ,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I  
    78.   ,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J  
    79.   ,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K  
    80.   ,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L  
    81.   ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M  
    82.   ,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N  
    83.   ,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O  
    84.   ,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P  
    85.   ,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q  
    86.   ,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R  
    87.   ,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S  
    88.   ,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T  
    89.   ,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U  
    90.   ,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V  
    91.   ,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W  
    92.   ,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X  
    93.   ,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y  
    94.   ,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z  
    95.   ,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [  
    96.   ,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c   
    97.   ,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]  
    98.   ,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^  
    99.   ,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _  
    100.   ,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `  
    101.   ,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a  
    102.   ,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b  
    103.   ,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c  
    104.   ,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d  
    105.   ,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e  
    106.   ,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f  
    107.   ,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g  
    108.   ,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h  
    109.   ,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i  
    110.   ,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j   
    111.   ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k  
    112.   ,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l  
    113.   ,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m  
    114.   ,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n  
    115.   ,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o  
    116.   ,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p  
    117.   ,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q  
    118.   ,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r  
    119.   ,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s  
    120.   ,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t  
    121.   ,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u  
    122.   ,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v  
    123.   ,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w  
    124.   ,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x  
    125.   ,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y  
    126.   ,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z  
    127.   ,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {  
    128.   ,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |  
    129.   ,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d }  
    130.   ,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ~  
    131.   ,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f DEL  
    132. };  
    133.   
    134.   
    135.   
    136.   
    137.   
    138. void setup(void) {  
    139.   Serial.begin(9600);  
    140.   LCDInit(); //Init the LCD  
    141.   LCDClear();  
    142.   
    143.     
    144.   //1-wire 버스 초기화    
    145.   sensors.begin();    
    146.     
    147.   //버스에서 첫번째 장치의 주소를 가져온다.    
    148.   if (!sensors.getAddress(insideThermometer, 0)) LCDString("Unable to find address for Device 0\n");  
    149.   
    150.   //데이터시트에서 확인결과 9~12비트까지 설정 가능    
    151.   sensors.setResolution(insideThermometer, 10);    
    152.       
    153. }  
    154.   
    155.   
    156. // 온도를 출력하는 함수    
    157. void printTemperature(DeviceAddress deviceAddress)    
    158. {    
    159.   //섭씨 온도를 가져옴    
    160.   float  tempC = sensors.getTempC(deviceAddress);    
    161.   
    162.   char buffer[10]; //float를 string으로 변환하기 위해 필요한 배열 선언   
    163.   dtostrf(tempC, 4, 2, buffer); //float -> char로 변환   
    164.    
    165.   LCDString("Temp C:");    
    166.   LCDString(buffer);    
    167. }   
    168.   
    169.   
    170.   
    171. //200ms마다 온도를 읽어와 다시 출력해준다.   
    172. void loop(void) {  
    173.   
    174.    gotoXY(0,  0);  
    175.     
    176.   sensors.requestTemperaturesByIndex(0); //첫번째 센서의 온도값 읽어옴   
    177.     
    178.   //센서에서 읽어온 온도를 출력    
    179.   printTemperature(insideThermometer);    
    180.     
    181.   delay(200);  
    182. }  
    183.   
    184. void gotoXY(int x, int y) {  
    185.   LCDWrite(0, 0x80 | x);  // Column.  
    186.   LCDWrite(0, 0x40 | y);  // Row.  ?  
    187. }  
    188.   
    189. //This takes a large array of bits and sends them to the LCD  
    190. void LCDBitmap(char my_array[]){  
    191.   for (int index = 0 ; index < (LCD_X * LCD_Y / 8) ; index++)  
    192.     LCDWrite(LCD_DATA, my_array[index]);  
    193. }  
    194.   
    195. //This function takes in a character, looks it up in the font table/array  
    196. //And writes it to the screen  
    197. //Each character is 8 bits tall and 5 bits wide. We pad one blank column of  
    198. //pixels on each side of the character for readability.  
    199. void LCDCharacter(char character) {  
    200.   LCDWrite(LCD_DATA, 0x00); //Blank vertical line padding  
    201.   
    202.   for (int index = 0 ; index < 5 ; index++)  
    203.     LCDWrite(LCD_DATA, ASCII[character-0x20][index]);  
    204.     //0x20 is the ASCII character for Space (' '). The font table starts with this character  
    205.   
    206.   LCDWrite(LCD_DATA, 0x00); //Blank vertical line padding  
    207. }  
    208.   
    209. //Given a string of characters, one by one is passed to the LCD  
    210. void LCDString(char *characters) {  
    211.   while (*characters)  
    212.     LCDCharacter(*characters++);  
    213. }  
    214.   
    215. //Clears the LCD by writing zeros to the entire screen  
    216. void LCDClear(void) {  
    217.   for (int index = 0 ; index < (LCD_X * LCD_Y / 8) ; index++)  
    218.     LCDWrite(LCD_DATA, 0x00);  
    219.       
    220.   gotoXY(0, 0); //After we clear the display, return to the home position  
    221. }  
    222.   
    223. //This sends the magical commands to the PCD8544  
    224. void LCDInit(void) {  
    225.   
    226.   //Configure control pins  
    227.   pinMode(PIN_SCE, OUTPUT);  
    228.   pinMode(PIN_RESET, OUTPUT);  
    229.   pinMode(PIN_DC, OUTPUT);  
    230.   pinMode(PIN_SDIN, OUTPUT);  
    231.   pinMode(PIN_SCLK, OUTPUT);  
    232.   
    233.   //Reset the LCD to a known state  
    234.   digitalWrite(PIN_RESET, LOW);  
    235.   digitalWrite(PIN_RESET, HIGH);  
    236.   
    237.   LCDWrite(LCD_COMMAND, 0x21); //Tell LCD that extended commands follow  
    238.   LCDWrite(LCD_COMMAND, 0xB0); //Set LCD Vop (Contrast): Try 0xB1(good @ 3.3V) or 0xBF if your display is too dark  
    239.   LCDWrite(LCD_COMMAND, 0x04); //Set Temp coefficent  
    240.   LCDWrite(LCD_COMMAND, 0x14); //LCD bias mode 1:48: Try 0x13 or 0x14  
    241.   
    242.   LCDWrite(LCD_COMMAND, 0x20); //We must send 0x20 before modifying the display control mode  
    243.   LCDWrite(LCD_COMMAND, 0x0C); //Set display control, normal mode. 0x0D for inverse  
    244. }  
    245.   
    246. //There are two memory banks in the LCD, data/RAM and commands. This   
    247. //function sets the DC pin high or low depending, and then sends  
    248. //the data byte  
    249. void LCDWrite(byte data_or_command, byte data) {  
    250.   digitalWrite(PIN_DC, data_or_command); //Tell the LCD that we are writing either to data or a command  
    251.   
    252.   //Send the data  
    253.   digitalWrite(PIN_SCE, LOW);  
    254.   shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);  
    255.   digitalWrite(PIN_SCE, HIGH);  
    256. }  


    포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
    댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

    여러분의 응원으로 좋은 컨텐츠가 만들어집니다. 지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

    유튜브 구독하기


    댓글 0

Designed by Tistory.