온도센서 초음파센서를 이용하여 측정값을 LCD와 블루투스 센서를 이용하여 어플리케이션에 출력하게끔 하려고하는데
값이 자꾸 깨진채 나옵니다.. 각각 센서는 hc sr04 (초음파) , DS18S20(온도) hc 06 (블루투스) , lcd를 사용하였습니다
어떻게 해결해야할까요?
#include <SoftwareSerial.h>
SoftwareSerial BTserial(6,7);
#include <Wire.h> // i2C 통신을 위한 라이브러리
#include <LiquidCrystal_I2C.h> // LCD 1602 I2C용 라이브러리
LiquidCrystal_I2C lcd(0x3F,16,2); // 접근주소: 0x3F or 0x27
#define TRIG 12
#define ECHO 13
#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() {
lcd.init(); // LCD 초기화
lcd.backlight(); // 백라이트 켜기
Serial.begin(9600); //시리얼모니터
BTserial.begin(9600);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
}
void loop() {
digitalWrite(TRIG,LOW);
delayMicroseconds(2);
digitalWrite(TRIG,HIGH);
delayMicroseconds(10);
digitalWrite(TRIG,LOW);
long distance = pulseIn(ECHO, HIGH) * 17 / 1000;
Serial.print(distance);
Serial.println("cm");
//if(BTserial.available()) {
//BTserial.print("Distance = ");
BTserial.print(distance);
//BTserial.print("cm");
//}
lcd.setCursor(0,0);
lcd.print("Distance = ");
if(distance >0 && distance <10)
{
lcd.print("00");
}
else if(distance >=10 && distance <100)
{
lcd.print("0");
}
lcd.print(distance);
lcd.print("cm");
delay(1000);
float temperature = getTemp();
Serial.println(temperature);
//if(BTserial.available()) {
//BTserial.print("Temp = ");
BTserial.print(temperature);
//BTserial.print(" C");
//}
lcd.setCursor(0,1);
lcd.print("Temp = ");
lcd.print(temperature);
lcd.print(" C");
delay(1000); //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;
}
아두이노 소스이고 이런식으로 꺠져서 출력됩니다.
해당 어플리케이션 블루투스 데이터값을 받아오는 앱인벤터 블록구현은 저렇게 구현했습니다.

