반응형







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. }  


문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts