BASIC4MCU | 질문게시판 | 답변 : Ph 블루투스로 앱인벤터 출력
페이지 정보
작성자 master 작성일2023-04-29 12:13 조회5,782회 댓글15건본문
#include <SoftwareSerial.h>
#define BT_RXD 3
#define BT_TXD 2
SoftwareSerial mySerial(BT_RXD,BT_TXD);
//
#define SensorPin A0
#define LED 13
//
#define Offset 0.33 // ph7.0 측정 시 오프셋
#define samplingInterval 20
#define printInterval 800
#define ArrayLenth 40
//
int pHArray[ArrayLenth],pHArrayIndex=0;
unsigned long samplingTime,long printTime;
float pHValue,voltage;
double avg
//
void setup(void){
pinMode(LED,OUTPUT);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("pH meter experiment!");
printTime=millis();
samplingTime=millis();
}
//
void loop(void){
if(millis()-samplingTime>samplingInterval){
pHArray[pHArrayIndex++]=analogRead(SensorPin);
if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
voltage=avergearray(pHArray,ArrayLenth)*5.0/1024;
pHValue=3.5*voltage+Offset;
samplingTime=millis();
}
if(millis()-printTime>printInterval){
Serial.print("Voltage:"); Serial.print(voltage,2);
Serial.print(" pH value: "); Serial.println(pHValue,2);
digitalWrite(LED,digitalRead(LED)^1);
printTime=millis();
}
}
//
double avergearray(int *arr,int number){
int i,max,min;
long amount=0;
if(number<=0){ Serial.println("Error number for the array to avraging!/n"); return 0; }
if(number< 5){
for(i=0;i<number;i++)amount+=arr[i];
avg=amount/number;
return avg;
}
else {
if(arr[0]<arr[1]){ min=arr[0]; max=arr[1]; }
else { min=arr[1]; max=arr[0]; }
for(i=2;i<number;i++){
if(arr[i]<min){ amount+=min; min=arr[i]; }
else{
if(arr[i]>max){ amount+=max; max=arr[i]; }
else { amount+=arr[i]; }
}
}
avg=(double)amount/(number-2);
}
return avg;
mySerial.println("Ph: "); mySerial.println(pHValue,2); mySerial.println("% ");
mySerial.println("Voltage "); mySerial.println(" V");
delay(1000);
}
//----------------------------------------------------------------------------
loop()함수에서 선언된 변수는 avergearray() 함수에서 사용하지 못합니다.
여러 함수에서 사용하려면 전역변수로 선언해야 합니다.
//
return avg; <-- 여기서 함수를 리턴하면 아래 코드는 실행되지 못합니다.
mySerial.println("Ph: "); mySerial.println(pHValue,2); mySerial.println("% ");
mySerial.println("Voltage "); mySerial.println(" V"); <-- 전압 변수 출력은 안보입니다.
delay(1000);
}
댓글 15
조회수 5,782안녕하세요13님의 댓글
안녕하세요13 작성일mySerial.println을 앞으로 땡겨야하나여?
master님의 댓글
master
mySerial.println("Ph: "); mySerial.println(pHValue,2); mySerial.println("% ");
mySerial.println("Voltage "); mySerial.println(" V"); //<-- 전압 변수 출력은 안보입니다.
delay(1000);
return avg; //<-- 리턴코드를 제일 아래로 내리면 됩니다.
}
안녕하세요13님의 댓글
안녕하세요13 작성일질문이 많아 죄송하지만 왜 'pHValue' 위에 static float pHValue, voltage; 로 선언한거 같은데 블루투스 시리얼로 보낼때 pHValue가 선언되지 않았다고 나오는데 무슨 문제일까여
master님의 댓글
master
// unsigned long samplingTime,long printTime; // printTime 앞의 long을 삭제할 것
unsigned long samplingTime,printTime;
//
double avg; // 마지막에 세미콜론 빠져있음
안녕하세요13님의 댓글
안녕하세요13 작성일센서값을 앱인벤터로 출력을 하고싶은데 블루투스연결은 되었는데 앱인벤터 받을수있는바이트크기가져오기를 해도 0이라고 출력되는데 혹시 블루투스쪽에는 문제가 뭐인지 알려주실수있으신가여
안녕하세요13님의 댓글
안녕하세요13 작성일
#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define SensorPin A0
#define Offset 0.33 // ph7.0 측정 시 오프셋
#define LED 13
#define samplingInterval 20
#define printInterval 800
#define ArrayLenth 40
#define BT_RXD 3
#define BT_TXD 2
#define ONE_WIRE_BUS 4
SoftwareSerial HC06(BT_RXD, BT_TXD);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int sensorValue;
int pHArray[ArrayLenth];
int pHArrayIndex = 0;
void setup(void) {
pinMode(LED, OUTPUT);
Serial.begin(9600);
HC06.begin(9600);
sensors.begin();
Serial.println("pH meter experiment!");
}
void loop(void) {
HC06.print("sensorValue:");
HC06.println(sensorValue);
if(HC06.available()){
Serial.write(HC06.read());
}
if(Serial.available()){
HC06.write(Serial.read());
}
static unsigned long samplingTime = millis();
static unsigned printTime = millis();
static float pHValue, voltage;
if (millis() - samplingTime > samplingInterval) {
pHArray[pHArrayIndex++] = analogRead(SensorPin);
if (pHArrayIndex == ArrayLenth) pHArrayIndex = 0;
voltage = avergearray(pHArray, ArrayLenth) * 5.0 / 1024;
pHValue = 3.5 * voltage + Offset;
samplingTime = millis();
}
sensors.requestTemperatures();
sensors.requestTemperatures();
// 섭씨온도를 뜻합니다.
Serial.print(sensors.getTempCByIndex(0));
delay(1000);
if (millis() - printTime > printInterval) {
Serial.print(" pH value: ");
Serial.println(pHValue, 2);
digitalWrite(LED, digitalRead(LED) ^ 1);
printTime = millis();
delay(1000);
}
}
double avergearray(int* arr, int number) {
int i;
int max, min;
double avg;
long amount = 0;
if (number <= 0) {
Serial.println("Error number for the array to avraging!/n");
return 0;
}
if (number < 5) {
for (i = 0; i < number; i++) {
amount += arr[i];
}
avg = amount / number;
return avg;
} else {
if (arr[0] < arr[1]) {
min = arr[0];
max = arr[1];
} else {
min = arr[1];
max = arr[0];
}
for (i = 2; i < number; i++) {
if (arr[i] < min) {
amount += min;
min = arr[i];
} else {
if (arr[i] > max) {
amount += max;
max = arr[i];
} else {
amount += arr[i];
}
}
}
avg = (double)amount / (number - 2);
}
return avg;
}
코드는 이렇게 바꾸었습니다.
master님의 댓글
master
int sensorValue;
void loop(void) {
HC06.print("sensorValue:"); HC06.println(sensorValue);
sensorValue 변수 값을 변경하지 않은 상태로 출력하고 있네요?
sensorValue 값은 0일테니 0만 출력되겠습니다.
안녕하세요13님의 댓글
안녕하세요13 작성일
void loop() {
int sensorValue;
HC06.print("sensorValue:"); HC06.println(sensorValue);
이렇게 해야하는건가여
master님의 댓글
master
변수 선언 위치를 말하는 것이 아니고
어디에서 sensorValue 변수에 값을 넣는지를 묻는 겁니다.
안녕하세요13님의 댓글
안녕하세요13 작성일Ds18b20센서값을 sensorValue ph값을 phValue로 해서 보내싶습니다. 아두이노 배운지가 얼마안돼서 찾아봐도 잘 모르겠어서 dht11센서로는 온습도가 잘 전송되어서 이를 활용해서 두개의 센서값을 앱인벤터로 보내는 것을 하기위해 연습중입니다.
안녕하세요13님의 댓글
안녕하세요13 작성일
센서모니터링은 ph값 온도값은 잘 출력이되는데 ph는 Serial.println(pHValue, 2); 을 통해 시리얼통신이 되고 온도값은
Serial.print(sensors.getTempCByIndex(0));로 하고있다고 생각하는데
안녕하세요13님의 댓글
안녕하세요13 작성일sensorValue = sensors.getTempCByIndex(0)을 통해 온도값을 int sensorValue로 선언을 하고 블루투스로 보내야 하는걸까여
master님의 댓글
master
int sensorValue로 선언을 하면 정수값만 출력됩니다.
float sensorValue로 선언을 하면 소숫점까지 출력됩니다.
안녕하세요13님의 댓글
안녕하세요13 작성일
여전히 0으로 출력되는데 HC06.available 쪽에서 시리얼통신 출력값을 보내는 과정에서의 문제일까여
아니면 그냥 아두이노에 출력되는 센서모니터링 텍스트 전체를 보내는 방법이라도 있을까여
master님의 댓글
master
시리얼모니터에 정상적으로 표시되도록 만들고 난 후에
같은 데이터를 블루투스로 출력하세요