Arduino 8:溫度量測,來個LCD顯示
DS18B20
需要引入函式庫
- #include <OneWire.h>
- int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2
- //Temperature chip i/o
- OneWire ds(DS18S20_Pin); // on digital pin 2
- void setup(void) {
- Serial.begin(9600); //從螢幕上監測
- }
- void loop(void) {
- float temperature = getTemp();
- Serial.println(temperature);
-
- delay(100); //just here to slow down the output so it is easier to read
- }
- float getTemp(){
- //returns the temperature from one DS18S20 in DEG Celsius
- byte data[12];
- byte addr[8];
- if ( !ds.search(addr)) {
- //no more sensors on chain, reset search
- ds.reset_search();
- return -1000;
- }
- if ( OneWire::crc8( addr, 7) != addr[7]) {
- Serial.println("CRC is not valid!");
- return -1000;
- }
- if ( addr[0] != 0x10 && addr[0] != 0x28) {
- Serial.print("Device is not recognized");
- return -1000;
- }
- ds.reset();
- ds.select(addr);
- ds.write(0x44,1); // start conversion, with parasite power on at the end
- byte present = ds.reset();
- ds.select(addr);
- ds.write(0xBE); // Read Scratchpad
-
- for (int i = 0; i < 9; i++) { // we need 9 bytes
- data[i] = ds.read();
- }
-
- ds.reset_search();
-
- byte MSB = data[1];
- byte LSB = data[0];
- float tempRead = ((MSB << 8) | LSB); //using two's compliment
- float TemperatureSum = tempRead / 16;
- return TemperatureSum;
- }
改成將結果輸出到LCD
- //------------------------- LCD
- //Library version:1.1
- #include <OneWire.h> // DS18S20 waterproof溫度模組
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- #if defined(ARDUINO) && ARDUINO >= 100
- #define printByte(args) write(args);
- #else
- #define printByte(args) print(args,BYTE);
- #endif
- LiquidCrystal_I2C lcd(0x20,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line
- //-------------------------
- int DS18S20_Pin = 2; //DS18S20 溫度Signal pin on digital 2
- //Temperature chip i/o
- OneWire ds(DS18S20_Pin); // on digital pin 2
-
- void setup() {
- //------------------------- LCD
- lcd.init(); // initialize the lcd
- lcd.backlight();
- lcd.setCursor(0, 0);
- lcd.print ("Temp.=");
- //------------------------- LCD
- }
- void loop(){
- float temperature = getTemp();
- //Serial.println(temperature);
- //------------------------- LCD
- lcd.setCursor(6, 0);
- lcd.print(temperature, 3 );
- lcd.print((char)223); //度
- lcd.print("C");
- //------------------------- LCD
-
- delay(100); //just here to slow down the output so it is easier to read
- // delay(1000); // 等待一秒鐘(每隔一秒測量一次)
- }
- float getTemp(){
- //returns the temperature from one DS18S20 in DEG Celsius
- byte data[12];
- byte addr[8];
- if ( !ds.search(addr)) {
- //no more sensors on chain, reset search
- ds.reset_search();
- return -1000;
- }
- if ( OneWire::crc8( addr, 7) != addr[7]) {
- Serial.println("CRC is not valid!");
- return -1000;
- }
- if ( addr[0] != 0x10 && addr[0] != 0x28) {
- Serial.print("Device is not recognized");
- return -1000;
- }
- ds.reset();
- ds.select(addr);
- ds.write(0x44,1); // start conversion, with parasite power on at the end
- byte present = ds.reset();
- ds.select(addr);
- ds.write(0xBE); // Read Scratchpad
-
- for (int i = 0; i < 9; i++) { // we need 9 bytes
- data[i] = ds.read();
- }
-
- ds.reset_search();
-
- byte MSB = data[1];
- byte LSB = data[0];
- float tempRead = ((MSB << 8) | LSB); //using two's compliment
- float TemperatureSum = tempRead / 16;
- return TemperatureSum;
- }
沒有留言:
張貼留言