Arduino에 연결한 Nokia 5110 LCD에 온도센서값(ds18b20) 출력해보기Arduino Uno2015. 11. 25. 19:01
Table of Contents
반응형
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
아래 위치에 각각 복사해 넣습니다.
이제 아두이노 코드를 작성하면 됩니다..
- #include <OneWire.h>
- #include <DallasTemperature.h>
- #include<stdlib.h>
- //DS18B20 온도 센서의 데이터선인 가운데 핀을 아두이노 2번에 연결합니다.
- #define ONE_WIRE_BUS 2
- //1-wire 디바이스와 통신하기 위한 준비
- OneWire oneWire(ONE_WIRE_BUS);
- // oneWire선언한 것을 sensors 선언시 참조함.
- DallasTemperature sensors(&oneWire);
- //다비아스 주소를 저장할 배열 선언
- DeviceAddress insideThermometer;
- #define PIN_SCE 7 //Pin 3 on LCD
- #define PIN_RESET 6 //Pin 4 on LCD
- #define PIN_DC 5 //Pin 5 on LCD
- #define PIN_SDIN 4 //Pin 6 on LCD
- #define PIN_SCLK 3 //Pin 7 on LCD
- //The DC pin tells the LCD if we are sending a command or data
- #define LCD_COMMAND 0
- #define LCD_DATA 1
- //You may find a different size screen, but this one is 84 by 48 pixels
- #define LCD_X 84
- #define LCD_Y 48
- //This table contains the hex values that represent pixels
- //for a font that is 5 pixels wide and 8 pixels high
- static const byte ASCII[][5] = {
- {0x00, 0x00, 0x00, 0x00, 0x00} // 20
- ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
- ,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
- ,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
- ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
- ,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
- ,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
- ,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
- ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
- ,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
- ,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
- ,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
- ,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
- ,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
- ,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
- ,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
- ,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
- ,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
- ,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
- ,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
- ,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
- ,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
- ,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
- ,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
- ,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
- ,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
- ,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
- ,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
- ,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <
- ,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
- ,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >
- ,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
- ,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
- ,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
- ,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
- ,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
- ,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
- ,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
- ,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
- ,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
- ,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
- ,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
- ,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
- ,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
- ,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
- ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
- ,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
- ,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
- ,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
- ,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
- ,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
- ,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
- ,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
- ,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
- ,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
- ,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
- ,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
- ,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
- ,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
- ,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
- ,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c
- ,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
- ,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
- ,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
- ,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
- ,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
- ,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
- ,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
- ,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
- ,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
- ,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
- ,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
- ,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
- ,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
- ,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j
- ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
- ,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
- ,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
- ,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
- ,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
- ,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
- ,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
- ,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
- ,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
- ,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
- ,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
- ,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
- ,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
- ,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
- ,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
- ,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
- ,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
- ,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
- ,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
- ,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ~
- ,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f DEL
- };
- void setup(void) {
- Serial.begin(9600);
- LCDInit(); //Init the LCD
- LCDClear();
- //1-wire 버스 초기화
- sensors.begin();
- //버스에서 첫번째 장치의 주소를 가져온다.
- if (!sensors.getAddress(insideThermometer, 0)) LCDString("Unable to find address for Device 0\n");
- //데이터시트에서 확인결과 9~12비트까지 설정 가능
- sensors.setResolution(insideThermometer, 10);
- }
- // 온도를 출력하는 함수
- void printTemperature(DeviceAddress deviceAddress)
- {
- //섭씨 온도를 가져옴
- float tempC = sensors.getTempC(deviceAddress);
- char buffer[10]; //float를 string으로 변환하기 위해 필요한 배열 선언
- dtostrf(tempC, 4, 2, buffer); //float -> char로 변환
- LCDString("Temp C:");
- LCDString(buffer);
- }
- //200ms마다 온도를 읽어와 다시 출력해준다.
- void loop(void) {
- gotoXY(0, 0);
- sensors.requestTemperaturesByIndex(0); //첫번째 센서의 온도값 읽어옴
- //센서에서 읽어온 온도를 출력
- printTemperature(insideThermometer);
- delay(200);
- }
- void gotoXY(int x, int y) {
- LCDWrite(0, 0x80 | x); // Column.
- LCDWrite(0, 0x40 | y); // Row. ?
- }
- //This takes a large array of bits and sends them to the LCD
- void LCDBitmap(char my_array[]){
- for (int index = 0 ; index < (LCD_X * LCD_Y / 8) ; index++)
- LCDWrite(LCD_DATA, my_array[index]);
- }
- //This function takes in a character, looks it up in the font table/array
- //And writes it to the screen
- //Each character is 8 bits tall and 5 bits wide. We pad one blank column of
- //pixels on each side of the character for readability.
- void LCDCharacter(char character) {
- LCDWrite(LCD_DATA, 0x00); //Blank vertical line padding
- for (int index = 0 ; index < 5 ; index++)
- LCDWrite(LCD_DATA, ASCII[character-0x20][index]);
- //0x20 is the ASCII character for Space (' '). The font table starts with this character
- LCDWrite(LCD_DATA, 0x00); //Blank vertical line padding
- }
- //Given a string of characters, one by one is passed to the LCD
- void LCDString(char *characters) {
- while (*characters)
- LCDCharacter(*characters++);
- }
- //Clears the LCD by writing zeros to the entire screen
- void LCDClear(void) {
- for (int index = 0 ; index < (LCD_X * LCD_Y / 8) ; index++)
- LCDWrite(LCD_DATA, 0x00);
- gotoXY(0, 0); //After we clear the display, return to the home position
- }
- //This sends the magical commands to the PCD8544
- void LCDInit(void) {
- //Configure control pins
- pinMode(PIN_SCE, OUTPUT);
- pinMode(PIN_RESET, OUTPUT);
- pinMode(PIN_DC, OUTPUT);
- pinMode(PIN_SDIN, OUTPUT);
- pinMode(PIN_SCLK, OUTPUT);
- //Reset the LCD to a known state
- digitalWrite(PIN_RESET, LOW);
- digitalWrite(PIN_RESET, HIGH);
- LCDWrite(LCD_COMMAND, 0x21); //Tell LCD that extended commands follow
- LCDWrite(LCD_COMMAND, 0xB0); //Set LCD Vop (Contrast): Try 0xB1(good @ 3.3V) or 0xBF if your display is too dark
- LCDWrite(LCD_COMMAND, 0x04); //Set Temp coefficent
- LCDWrite(LCD_COMMAND, 0x14); //LCD bias mode 1:48: Try 0x13 or 0x14
- LCDWrite(LCD_COMMAND, 0x20); //We must send 0x20 before modifying the display control mode
- LCDWrite(LCD_COMMAND, 0x0C); //Set display control, normal mode. 0x0D for inverse
- }
- //There are two memory banks in the LCD, data/RAM and commands. This
- //function sets the DC pin high or low depending, and then sends
- //the data byte
- void LCDWrite(byte data_or_command, byte data) {
- digitalWrite(PIN_DC, data_or_command); //Tell the LCD that we are writing either to data or a command
- //Send the data
- digitalWrite(PIN_SCE, LOW);
- shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
- digitalWrite(PIN_SCE, HIGH);
- }
반응형
'Arduino Uno' 카테고리의 다른 글
Johnny-Five를 이용하여 아두이노에 연결한 온도센서(DS18B20) 값 읽어오기 (0) | 2015.12.02 |
---|---|
Johnny-Five를 이용하여 아두이노에 연결한 LED 제어하기 (0) | 2015.12.01 |
Nokia 5110 LCD를 arduino uno에 연결하기 (0) | 2015.11.25 |
arduino에서 servo 모터 제어 (2) | 2015.11.10 |
가변저항으로 조정하여 LED의 밝기 조정하기 (2) | 2015.10.19 |