BASIC4MCU | 질문게시판 | 릴레이설정값 소수점으로입력
페이지 정보
작성자 왕왕초a 작성일2021-02-16 22:15 조회105,859회 댓글14건본문
안녕하셔요
질문입니다
lcd에 출력되는 센서습도값이 소수점이하 60.5%일 때
릴레이가 작동하는 셋팅값을 소수점이하 60.5%로
여기에 (lcd.setCursor(11,1);// numLength, 0); setting)
입력하여 릴레이를 작동시미려면 어떻게 하는건가요
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include <DHT.h>
#define DHTPIN A0
#define DHTTYPE DHT22
#define relay 12
DHT dht(DHTPIN, DHTTYPE);
float hum;
float temp;
const byte ROWS = 4;
const byte COLS = 4;
char keys [ROWS] [COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', '.'}
};
byte rowPins[ROWS] = {11,10,9,8};
byte colPins[COLS] = {7,6,5,4};
Keypad myKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
boolean presentValue = false;
boolean next = false;
boolean final = false;
String num;
int cnt = 0;
int tp;
int relayIN = 12;
void setup()
{
lcd.init();
lcd.backlight();
Serial.begin(9600);
dht.begin();
lcd.begin(16,2);
pinMode(A0,INPUT);
pinMode(12,OUTPUT);
}
void loop(){
hum = dht.readHumidity();
temp= dht.readTemperature();
int dehumidify = analogRead(A0);
lcd.setCursor(0,0);
lcd.print("T:");
lcd.setCursor(2,0);
lcd.print( temp);
lcd.setCursor(6,0);
lcd.print("'C");
lcd.setCursor(9,0);
lcd.print("H:");
lcd.setCursor(11,0);
lcd.print( hum);
lcd.setCursor(15,0);
lcd.print("%");
lcd.setCursor(2,1);// numLength, 0); setting
lcd.print( "setting:");
lcd.setCursor(11,1);// numLength, 0); setting
lcd.print( num);
lcd.setCursor(15,1);// numLength, 0);
lcd.print("%");
delay(100);
char key = myKeypad.getKey();
if (key != NO_KEY && (key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'||key=='0'||key=='.'))
{
if (presentValue != true)
{
num = num + key;
int numLength = num.length();
delay(10);
}
}
else if (key != NO_KEY && key == 'C'){
lcd.clear();
num = "";}
if((key>='0')&&(key<='9')){
tp%=1000;
tp*=10; // 일의자리 및 십의자리를 한자리 올림
tp+=key&0x0F; // key를 일의자리에 넣음
}
else if(key=='*'){ // 엔터키
hum=tp; // 습도 변수에 저장
tp=0; // 임시변수 초기화
}
if(hum<tp)//temp
{
digitalWrite(relayIN, HIGH);
cnt = 100;
}
if(cnt != 0){
cnt--;
}else{
digitalWrite(relayIN, LOW);
delay(100);
}
}
댓글 14
조회수 105,859master님의 댓글
master 작성일
lcd.setCursor(11,1); lcd.print(num); lcd.setCursor(15,1); lcd.print("%");
이 문장 근처에서 릴레이를 구동하고 싶은 건가요?
lcd.setCursor(11,1); lcd.print(num); lcd.setCursor(15,1); lcd.print("%");
if(num<60.5)digitalWrite(relayIN,1); // 60.5% 미만에서 릴레이 ON
else digitalWrite(relayIN,0); // 아니면 릴레이 OFF
왕왕초a님의 댓글
왕왕초a 작성일
네
현제는 센서출력값이 60.5%로디스플레이되구요(소수점이하로출력됨)
키페드로 릴레이 설정을 소수점이하로 하려할때 60.%까지는 입력이되는데 60.5%로입력을하면은 릴레이가 가동을 해야하는데 정지가됩니다
(예;실내습도 70.5% 설정습도60.%까지는 키페드로 설정이 되는데 60.5% 설정시 릴레이가 정지됩니다)
master님의 댓글
master
if(num<60.5) // 60.5 미만 (60.5는 포함되지 않음)
if(num<=60.5) // 60.5 이하 (60.5 포함)
왕왕초a님의 댓글
왕왕초a 작성일
제가 이해가 부족합니다
키페드로 입력을할때 어찌하는건가요
master님의 댓글
master
https://cafe.naver.com/circuitsmanual/116122
이런 예제가 필요하신가요?
왕왕초a님의 댓글
왕왕초a 작성일
네~ 감사합니다
열공해 보겟습니다
왕왕초a님의 댓글
왕왕초a 작성일
재 질문입니다
lcd.setCursor(2,1);// numLength, 0); setting
lcd.print( "setting:");
lcd.setCursor(11,1);// numLength, 0); setting
lcd.print( num);
실내습도 50.5%일때
셋팅값이49.5% 에서는 릴레이on 되고
셋팅값이51.5% 에서는 릴레이off 되고
해야되는데
"현재상태는 소수점이후로숫자입력시 릴레이가 off 됩니다"
master님의 댓글
master
String num;
num은 문자열이라서 실수형의 값을 저장하지 못하므로 float 형의 변수를 추가로 선언해서 키입력을 저장해야 합니다.
왕왕초a님의 댓글
왕왕초a 작성일
답변 감사드리구요
해결이 되지안아
자세한설명 부탁드립니다
master님의 댓글
master
키패드를 눌렀을 때 입력받아서 num에 저장된 값은 LCD를 통해서 제대로 저장된 것을 확인 했겠죠?
이 값을 실수형으로 어떻게 저장할 것인지를 고민해보세요
master님의 댓글
master
if((key>='0')&&(key<='9')){
tp%=1000;
tp*=10; // 일의자리 및 십의자리를 한자리 올림
tp+=key&0x0F; // key를 일의자리에 넣음
이 처리는 정수형 입력일 때에 유효할 것으로 생각되고요
반드시 소숫점 이하 1자리를 입력한다고 하면 실수형의 변수에 저장한 후 10을 나눠주면 됩니다.
코드를 작성할 때는 규칙성을 파악해야 합니다.
알고리즘이 명확하지 않으면 코드를 작성하지 못하거나 불필요하게 여러번 삽질해야 합니다.
왕왕초a님의 댓글
왕왕초a 작성일
고민하다가 어려워서 글올립니다
(키패드를 눌렀을 때 입력받아서 num에 저장된 값은 LCD를 통해서 제대로 저장된 것을 확인 했겠죠? )
이부분은 잘돼구요
변수선언 그리고 저장부분을 연결좀 해주셔요
master님의 댓글
master
문자열을 공부하시고요
num을 문자열이 제대로 저장되었는지 확인한 후에
atof() 함수를 사용해서 실수형으로 받아오세요
왕왕초a님의 댓글
왕왕초a 작성일
네~
가르침 감사 드림니다
좋은하루 되셔요