From b59896b7cd3a77c023ef7d44f2a38751fb669772 Mon Sep 17 00:00:00 2001 From: Lee wonchan <quwieo@ajou.ac.kr> Date: Wed, 14 Feb 2018 13:47:43 +0900 Subject: [PATCH] add Arduino --- arduino.ino | 308 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 308 insertions(+) create mode 100644 arduino.ino diff --git a/arduino.ino b/arduino.ino new file mode 100644 index 0000000..56fb943 --- /dev/null +++ b/arduino.ino @@ -0,0 +1,308 @@ +#include <Wire.h> +#include <LiquidCrystal_I2C.h> // 텍스트 LCD & IIC I2C 모듈을 사용하기 위한 헤더파일 +//#define IWS_HEAT 0 //pin 2 +//#define IWS_HUMI 1 //pin 3 +//#define IWS_AIR 4 //pin 19 +//#define IWS_ALL 5 //pin 18 +#define UMP1 14 //bit 1 +#define UMP2 15 //bit 2 +#define UMP3 16 //bit 3 +#define UMP4 17 //bit 4 +#define UMP5 18 //bit 5 + +LiquidCrystal_I2C lcd(0x27, 16, 2); // 가로 16, 세로 2 LCD에 대한 0x3F LCD 주소를 설정 +char HUMI_Sensor = A0; +int Sensor_val; +unsigned long pulse = 0; +float ugm3 = 0; +byte dht11_dat[5]; +byte dht11_in; // 센서 변수 +byte i; +String sending = ""; //온습도먼지 값을 보내려는 스트링 +String iot_stat = ""; //기기가 꺼진지 켜진지 보는 스트링 +char outstr[6]; + +const byte Relaypin1 = 5; //heater1, 2 +const byte Relaypin2 = 6; //cooler +const byte Relaypin3 = 7; //air clean +const byte Relaypin4 = 8; //humi +const byte Dustpin = 9; + +byte read_dht11_dat() // 온도 습도 센서 값 읽어오는 함수 +{ + byte i = 0; // for문 변수 + byte result = 0; // 리턴 변수 + for (i = 0; i < 8; i++) // for문 9번 반복 + { + while (!digitalRead(HUMI_Sensor)) + ; // 센서 값이 1이 될 때까지 무한루프 + delayMicroseconds(30); // 30마이크로세크 대기 + if (digitalRead(HUMI_Sensor) != 0) // 만약 센서 값이 0과 같지 않으면 + bitSet(result, 7 - i); // bitSet(n,x) n이라는 변수에 x번째의 비트를 on한다. + while (digitalRead(HUMI_Sensor)) + ; // 센서 값이 0이 될 때까지 무한루프 + } + return result; // result의 값을 리턴 한다. +} + +void setup() // 초기화 +{ + lcd_set(); + pinMode(HUMI_Sensor, OUTPUT); // 센서 핀(Pin)을 출력으로 설정한다. + digitalWrite(HUMI_Sensor, HIGH); // 센서에 출력을 넣는다 + pinMode(Relaypin1, OUTPUT); ////////////////// + pinMode(Relaypin2, OUTPUT); + pinMode(Relaypin3, OUTPUT); + pinMode(Relaypin4, OUTPUT); + pinMode(Dustpin, INPUT); + + pinMode(UMP1, INPUT_PULLUP); + pinMode(UMP2, INPUT_PULLUP); + pinMode(UMP3, INPUT_PULLUP); + pinMode(UMP4, INPUT_PULLUP); + pinMode(UMP5, INPUT_PULLUP); + + Serial.begin(115200); + /* + pinMode(2, INPUT_PULLUP); + pinMode(3, INPUT_PULLUP); + pinMode(18, INPUT_PULLUP); + pinMode(19, INPUT_PULLUP); + attachInterrupt(IWS_HEAT, inter_heater, HIGH); + attachInterrupt(IWS_HUMI, inter_humier, HIGH); + attachInterrupt(IWS_AIR, inter_airclean, HIGH); + attachInterrupt(IWS_ALL, inter_all, HIGH); */ +} + +void loop() // 무한루프 +{ + digitalWrite(HUMI_Sensor, LOW); // 센서 핀(Pin)을 off한다 + delay(18); // 18ms만큼 지연 + digitalWrite(HUMI_Sensor, HIGH); // 센서 핀(Pin)을 on한다 + delayMicroseconds(5); // 5us만큼 지연 + pinMode(HUMI_Sensor, INPUT); // 센서 핀(Pin)을 입력으로 설정한다 + delayMicroseconds(200); // 200us만큼 지연 + for (i = 0; i < 5; i++) + { + dht11_dat[i] = read_dht11_dat(); // 40bit의 데이터를 수신. 자세한 사항은 DHT11의 데이터시트를 참고 + } + pinMode(HUMI_Sensor, OUTPUT); // 센서 핀(Pin)을 출력으로 설정한다 + digitalWrite(HUMI_Sensor, HIGH); // 센서에 출력을 넣는다 + byte dht11_check_sum = dht11_dat[0] + dht11_dat[2]; // check check_sum + pulse = pulseIn(Dustpin, LOW, 20000); + ugm3 = pulse2ugm3(pulse); + lcd.setCursor(5, 0); + lcd.print(ugm3); + lcd.setCursor(11, 0); + lcd.print("ug/m3"); //dust sensor lcd print + + lcd.setCursor(5, 1); // 쓰기 좌표 1번줄에 4번칸 + lcd.print(dht11_dat[0], DEC); // LCD에 습도 값 출력 + lcd.print('%'); // LCD에 % 출력 + lcd.setCursor(13, 1); // 쓰기 좌표 1번줄에 4번칸 + lcd.print(dht11_dat[2], DEC); // LCD에 온도 값 출력 + lcd.print('C'); // LCD에 C 출력 + //delay(2000); // 2초간 지연 + delay(1000); + /* + if (digitalRead(UMP1) == LOW && digitalRead(UMP2) == LOW && digitalRead(UMP3) == LOW) + { + device_control(dht11_dat[2], dht11_dat[0], ugm3); //normal status + } + if (digitalRead(UMP1) == LOW && digitalRead(UMP2) == LOW && digitalRead(UMP3) == HIGH) + { + device_control(0, dht11_dat[0], ugm3); //heater only + } + if (digitalRead(UMP1) == LOW && digitalRead(UMP2) == HIGH && digitalRead(UMP3) == LOW) + { + device_control(dht11_dat[2], dht11_dat[0], 123.45); //air only + } + if (digitalRead(UMP1) == LOW && digitalRead(UMP2) == HIGH && digitalRead(UMP3) == HIGH) + { + device_control(dht11_dat[2], 0, ugm3); //humi only + } + if (digitalRead(UMP1) == HIGH && digitalRead(UMP2) == LOW && digitalRead(UMP3) == LOW) + { + device_control(0, 0, 123.45); //all on + } + */ + zzisu_dduckbaegi(); + if (digitalRead(UMP1) == HIGH) + { + device_control(dht11_dat[2], dht11_dat[0], ugm3); //auto mode! + iot_stat.concat("1aaaa"); + } + else + { + iot_stat.concat("0"); + if (digitalRead(UMP2) == HIGH) + { + in_heat_on(); + iot_stat.concat("1"); + } + else + { + in_heat_off(); + iot_stat.concat("0"); + } + + if (digitalRead(UMP3) == HIGH) + { + in_humi_on(); + iot_stat.concat("1"); + } + else + { + in_humi_off(); + iot_stat.concat("0"); + } + + if (digitalRead(UMP4) == HIGH) + { + in_air_on(); + iot_stat.concat("1"); + } + else + { + in_air_off(); + iot_stat.concat("0"); + } + + if (digitalRead(UMP5) == HIGH) + { + in_cool_on(); + iot_stat.concat("1"); + } + else + { + in_cool_off(); + iot_stat.concat("0"); + } + } + // SERIAL connection + sending.concat(String((int)dht11_dat[2])); //temp + sending.concat("?"); + sending.concat(String((int)dht11_dat[0])); //humi + sending.concat("?"); + //sending.concat(String(ugm3)); //dust + dtostrf(ugm3, 6, 2, outstr); + sending.concat(outstr); + sending.concat("?"); + sending.concat(iot_stat); + sending.concat("!"); + Serial.println(sending); + + delay(1000); +} + +void lcd_set() +{ + lcd.init(); // LCD 출력준비 + lcd.backlight(); // LCD 백라이트 ON + lcd.setCursor(0, 0); // 쓰기 좌표 1번줄에 4번칸 + lcd.print("DUST:"); // LCD에 LM35DZ 출력 + lcd.setCursor(0, 1); // 쓰기 좌표 2번줄에 0번칸 + lcd.print("HUMI: TEMP:"); // LCD에 TEMP: 출력 +} + +void zzisu_dduckbaegi() +{ + sending = ""; + //outstr = ""; + iot_stat = ""; +} + +void device_control(byte temp, byte humi, float ddd) +{ + if (temp < 22) + { + in_heat_on(); + } + else if (temp > 28) + { + in_cool_on(); + } + else + { + in_heat_off(); + in_cool_off(); + } + + if (humi < 45) + { + in_humi_on(); + } + else + { + in_humi_off(); + } + + if (ddd > 50) + { + in_air_on(); + } + else + { + in_air_off(); + } +} + +void RelayOn(int port) +{ + digitalWrite(port, HIGH); +} + +void RelayOff(int port) +{ + digitalWrite(port, LOW); +} + +void in_heat_on() +{ + RelayOn(Relaypin1); + RelayOn(Relaypin2); +} +void in_heat_off() +{ + RelayOff(Relaypin1); + RelayOff(Relaypin2); +} + +void in_humi_on() +{ + RelayOn(Relaypin4); + //RelayOn(Relaypin2); +} +void in_humi_off() +{ + RelayOff(Relaypin4); + //RelayOn(Relaypin2); +} + +void in_air_on() +{ + RelayOff(Relaypin3); +} //This is hentai relay.. +void in_air_off() +{ + RelayOn(Relaypin3); +} + +void in_cool_on() +{ + RelayOn(Relaypin2); +} +void in_cool_off() +{ + RelayOff(Relaypin2); +} + +float pulse2ugm3(unsigned long pulse) +{ + float value = (pulse - 1400) / 14.0; + if (value > 300) + { + value = 0; + } + return value; +} -- GitLab