BASIC4MCU | 질문게시판 | while문 문제와 센서값 전송 문제
페이지 정보
작성자 오이 작성일2020-06-04 15:30 조회2,318회 댓글0건본문
안녕하세요 아두이노 코딩을 하던중 문제를 해결하지 못하여 여기저기 헤매다가 지식인에 올리신 글을 읽고 링크를 통해 들어오게되었습니다.
생각해보니 가입하자마자 질문만 덜컥 올려 죄송합니다...
질문을 올릴수 있게 이런 공간을 만들어 주셔서 감사하다는 말을 잊은것 같아 다시 글을 수정하게되었습니다
조금의 도움이라도 받을 수만 있다면 정말 좋을것 같습니다 읽어주셔서 감사합니다
집에서 식물을 키우기 위해 스마트팜을 만드는 중입니다. PWM 핀이 부족하여 아두이노 우도 두개에 코딩을 나눈상태입니다.
우노1: LED 수동으로 밝기조절 & 조도센서(cds) 값에 따라 자동으로 밝기 조절
우노2: 워터펌프와 환기팬을 수동으로 on/off & 온습도센서(DHT22)와 토양수분센서(옥토퍼스)의 값에 따라 자동으로 on/off
현재 발생하는 문제점 2가지
1. 두 아두이노의 수동모드 코딩은 if문으로 작성하였고 자동모드는 while문 속에 넣었습니다. 문제는 앱을 통해 자동모드를 들어가게 되면 while문에서 빠져나오지 못합니다. 간편하게 if문으로만 짜봤으나 if문 속에서 센서가 작동하지 않는(센서값을 못받는건지 잘모르겟습니다) 현상이 발생하여 여러 시도를 해보다가 결국 while문 속에 넣게 되었습니다. 지금 코딩으로는 수동모드에서 LED밝기조절, 펌프&팬 on/off 모두 작동되고 자동모드로 넘어가서 센서값에 따라 3가지 모터 모두 정상적인 작동은 되나 다시 수동모드로 빠져나오지 않습니다.
-----> 수동모드와 자동모드를 계속 왔다갔다 할수 있게 만들고 싶습니다.
2.센서값이 앱 화면에 나오도록 코딩을 했다고 생각했으나 화면에 전혀 나오질 않습니다. 센서별로 작동이 안돼는지 따로 확인을 해보았으나 정상적으로 작동이 되며 시리얼모니터를 통해 컴퓨터에서도 확인이 되었지만 블루투스를 통해 잘못 보내고있는건지 앱 화면에는 아무것도 안뜹니다. 자동모드에서 센서값에 따라 모터들이 정상적으로 작동하는 것을 보면 센서값 자체는 잘 읽는 중인것 같습니다만 사실 한번도 수치가 어플에 나온적이 없어 무슨 문제인지 전혀 모르겠어서 답답합니다
----->앱 화면에 수치값이 나왔으면 좋겠습니다
[우노1]
#include <SoftwareSerial.h>
// LED1 PWM이 11 나머지가 9 10
// LED2 PWM이 6 나머지가 7 8
// 조도센서 A5
#define BTtx 2
#define BTrx 3
#define LED1 11
#define LED2 6int final_data = 0;
SoftwareSerial BT(BTtx, BTrx);
void setup() {
BT.begin(9600);
Serial.begin(9600);
pinMode(A5,INPUT);
pinMode(6, OUTPUT); // PWM LED우
pinMode(7, OUTPUT); // LED우
pinMode(8, OUTPUT); // LED우
pinMode(9, OUTPUT); // LED좌
pinMode(10, OUTPUT); // LED좌
pinMode(11, OUTPUT); // PWM LED좌
}
void loop() {
if(BT.available()>=2)
aaa:
{ unsigned int data1 = BT.read();
unsigned int data2 = BT.read();
unsigned int final_data = data1 + (data2 * 256);
Serial.write(final_data);if(final_data>=1000 && final_data<= 1255)
{ digitalWrite(10, HIGH); //LED좌 on
digitalWrite(9, LOW);
digitalWrite(8, HIGH); //LED우 on
digitalWrite(7, LOW);
analogWrite(LED1, final_data - 1000 ); // LED 조도 바 설정
analogWrite(LED2, final_data - 1000 ); // LED 조도 바 설정
}
if(final_data == 4000)
{ while(final_data == 4000)
{ int cds = analogRead(A5);
digitalWrite(10, HIGH); //LED좌 on
digitalWrite(9, LOW);
digitalWrite(8, HIGH); //LED우 on
digitalWrite(7, LOW);
analogWrite(LED1, 255 - cds); //LED좌 밝기조절
analogWrite(LED2, 255 - cds); //LED우 밝기조절
if(final_data!=4000)goto aaa;}}}}
[우노2]
#include <DHT.h>
#include <SoftwareSerial.h>
// 13,12 fan
// 7,8 워터펌프
// 5 온습도센서
// 4 조도센서
#define soil A4 // 토양수분센서
#define BTtx 2
#define BTrx 3
#define FAN A2
#define WP A3
#define light A5 // 조도센서#define DHTPIN 5 // 온습도센서
#define DHTTYPE DHT22 //온습도센서DHT dht(DHTPIN, DHTTYPE);
int final_data = 0;int value = 0; // 빛의 밝기
int neg_value = 0; // 빛의 밝기를 뒤집기
unsigned long previousTime = 0;
byte t = 0;
byte h = 0;
byte j = 0;
float LL;int ss= 0;
int cds = analogRead(light);
float a = dht.readTemperature();
float b = dht.readHumidity();
float th = a + b/2;SoftwareSerial BT(BTtx, BTrx);
void setup() {
BT.begin(9600);
dht.begin();
Serial.begin(9600);
pinMode(light, INPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, INPUT); // 토양수분센서
pinMode(5, INPUT); // 온습도
pinMode(7, OUTPUT); //펌프
pinMode(8, OUTPUT); // 펌프
pinMode(12, OUTPUT); //환기팬
pinMode(13, OUTPUT); //환기팬}
void loop() { aaa:
if(BT.available()>=0){
if(final_data == 100){
unsigned long currentTime = millis();
if((unsigned long)(currentTime - previousTime) >=2000){
previousTime = currentTime;
byte t = dht.readTemperature();
byte h = dht.readHumidity();
byte j = analogRead(light);
byte s = analogRead(soil) / 10; // 수분값을 측정하여 10으로 나눈 값
if(!(isnan(h) || isnan(t)||isnan(j))){
BT.print(t);
BT.print(" , ");
BT.println(h);
BT.print(" , ");
BT.print(j);
BT.print(" , ");
BT.print(s);
}}}}if(BT.available()>=2){
unsigned int data1 = BT.read();
unsigned int data2 = BT.read();
unsigned int final_data = data1 + (data2 * 256);
Serial.write(final_data);
if(final_data == 2500){
digitalWrite(8, HIGH); //펌프 on
digitalWrite(7, LOW);
analogWrite(WP, 150); }
if(final_data == 2600){
digitalWrite(8, HIGH);
digitalWrite(7, LOW);
analogWrite(WP, 0); } //펌프 off
if(final_data == 2700){
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
analogWrite(FAN, 255); //환기 on
}
if(final_data == 2800){
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
analogWrite(FAN, 0); //환기 off
}if(final_data == 4000)
{ while(final_data == 4000)
{
float ss= analogRead(soil);
if(ss<=30)
{ digitalWrite(8, HIGH); // 펌프 on
digitalWrite(7, LOW);
analogWrite(WP, 200);
}
if(ss>30)
{ digitalWrite(8, HIGH); // 펌프 on
digitalWrite(7, LOW);
analogWrite(WP, 0); }
float a = dht.readTemperature();
float b = dht.readHumidity();
float th = a + b/2;
if(th>=0)
{ digitalWrite(12, HIGH); // 환기 on
digitalWrite(13, LOW);
analogWrite(FAN, 255); }
delay(100);
if(th<50)
{ digitalWrite(12, HIGH); // 환기 on
digitalWrite(13, LOW);
analogWrite(FAN, 0); }
delay(100);
if(final_data!=4000)
goto aaa;}}}}
댓글 0
조회수 2,318등록된 댓글이 없습니다.