Smart Farm Base on Core-1000

Dependencies:   DHT11 HCSR04 LCDLib mbed

Committer:
hypark
Date:
Thu Jan 26 07:24:25 2017 +0000
Revision:
0:a977ba955188
Smart Farm base on Core-1000 Kit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hypark 0:a977ba955188 1 // hypark@kopo.ac.kr
hypark 0:a977ba955188 2 // Core-1000 platform
hypark 0:a977ba955188 3 #include "mbed.h"
hypark 0:a977ba955188 4 #include "TextLCD.h"
hypark 0:a977ba955188 5 #include "HCSR04.h"
hypark 0:a977ba955188 6 #include "Dht11.h"
hypark 0:a977ba955188 7 Serial pc(USBTX, USBRX); // USART2 : PA2,PA3
hypark 0:a977ba955188 8 PwmOut servo(PB_13); // SERVO PWM : PB13
hypark 0:a977ba955188 9 PwmOut rled(PB_5); // RED LED PWM : PB5
hypark 0:a977ba955188 10 PwmOut dc_en(PB_1); // DC PWM : PB1
hypark 0:a977ba955188 11 DigitalOut dc_in1(PB_15); // DC IN1 : PB15
hypark 0:a977ba955188 12 DigitalOut dc_in2(PB_14); // DC IN2 : PB14
hypark 0:a977ba955188 13 DigitalOut buz(PC_4); // define buzzer port
hypark 0:a977ba955188 14 DigitalIn btn[4] = {PC_10,PC_11, PC_12, PA_13 };//스위치
hypark 0:a977ba955188 15 AnalogIn analog_value(PC_1); //ADC : PC1
hypark 0:a977ba955188 16 Dht11 d_sen(PB_10); //온습도 센서
hypark 0:a977ba955188 17 HCSR04 u_sen(PC_7, PA_9); // 초음파 센서
hypark 0:a977ba955188 18 TextLCD lcd(PC_6,PC_8,PC_5,PC_0,PA_12,PA_11,PB_12);
hypark 0:a977ba955188 19 void pc_send_data(uint8_t temp,uint8_t humi,float cds_value, float dist,uint8_t state)
hypark 0:a977ba955188 20 { static int count = 0;
hypark 0:a977ba955188 21 uint16_t test = 0;
hypark 0:a977ba955188 22 pc.putc(0xaa); //STX
hypark 0:a977ba955188 23 pc.putc(0x55);
hypark 0:a977ba955188 24 pc.putc(count++); //COUNT
hypark 0:a977ba955188 25 pc.putc(temp); //온도
hypark 0:a977ba955188 26 pc.putc(humi); //습도
hypark 0:a977ba955188 27 test = (uint16_t)(cds_value * 4096.0f);
hypark 0:a977ba955188 28 pc.putc((test >> 8) & 0x00ff); //CDS값 0 ~ 4095
hypark 0:a977ba955188 29 pc.putc((test) & 0x00ff);
hypark 0:a977ba955188 30 test = 0;
hypark 0:a977ba955188 31 test = btn[0] | (btn[1] << 1) | (btn[2] << 2) | (btn[3] << 3);
hypark 0:a977ba955188 32 pc.putc((test) & 0x00ff); //스위치
hypark 0:a977ba955188 33 pc.putc((uint8_t)(dist * 100.0f)); //초음파
hypark 0:a977ba955188 34 pc.putc(state); //상태값
hypark 0:a977ba955188 35 pc.putc(0xFE); //ETX
hypark 0:a977ba955188 36 }
hypark 0:a977ba955188 37
hypark 0:a977ba955188 38 int main()
hypark 0:a977ba955188 39 { float dist = 0, cds_value = 0;
hypark 0:a977ba955188 40 int curr_temp = 0, curr_humi = 0; //현재 온도 습도
hypark 0:a977ba955188 41 int goal_temp = 25, goal_humi = 30; //목표 온도 습도
hypark 0:a977ba955188 42 unsigned char state = 0; //상태 저장 변수
hypark 0:a977ba955188 43 dc_in1 = 10; dc_in2 = 0; //모터 회전 방향
hypark 0:a977ba955188 44 pc.baud(115200); //통신 속도
hypark 0:a977ba955188 45 dc_en.period_ms(10); //DC 모터 PWM 주기
hypark 0:a977ba955188 46 rled.period_ms(10); //GREEN ED PWM 주기
hypark 0:a977ba955188 47 servo.period_ms(20); //서보모터 PWM 주기
hypark 0:a977ba955188 48 while(1)
hypark 0:a977ba955188 49 { state = 0; //상태 변수 초기화
hypark 0:a977ba955188 50 //HC-SR04
hypark 0:a977ba955188 51 u_sen.startMeas();
hypark 0:a977ba955188 52 wait(0.1);
hypark 0:a977ba955188 53 u_sen.getMeas(dist);
hypark 0:a977ba955188 54 if( dist < 0.2f) //초음파 20CM 이내
hypark 0:a977ba955188 55 { buz = 1; //부저 울림
hypark 0:a977ba955188 56 state |= 0x01;
hypark 0:a977ba955188 57 }
hypark 0:a977ba955188 58 else buz = 0;
hypark 0:a977ba955188 59 //ADC
hypark 0:a977ba955188 60 cds_value = analog_value.read();
hypark 0:a977ba955188 61 rled.pulsewidth_ms((int)(cds_value *3.0f));//CDS값 LED 반영
hypark 0:a977ba955188 62 if(cds_value * 3.0f > 1.0f) state |= 0x40;
hypark 0:a977ba955188 63 else state |= 0x80;
hypark 0:a977ba955188 64 //DHT11
hypark 0:a977ba955188 65 d_sen.read(); //센서값 가져오기
hypark 0:a977ba955188 66 curr_temp = d_sen.getCelsius(); //섭씨 온도
hypark 0:a977ba955188 67 curr_humi = d_sen.getHumidity(); //습도
hypark 0:a977ba955188 68 lcd.gotoxy(1,2); //현재 온습도 출력
hypark 0:a977ba955188 69 lcd.printf("T%2dH%2d CDS%.3f", curr_temp,curr_humi,cds_value);
hypark 0:a977ba955188 70 //switch
hypark 0:a977ba955188 71 if(!btn[0]) goal_temp--; //목표 온도 조정
hypark 0:a977ba955188 72 if(!btn[1]) goal_temp++;
hypark 0:a977ba955188 73 if(!btn[2]) goal_humi--; //목표 습도 조정
hypark 0:a977ba955188 74 if(!btn[3]) goal_humi++;
hypark 0:a977ba955188 75 lcd.gotoxy(1,1); //목표 온습도 표시
hypark 0:a977ba955188 76 lcd.printf("SMARTFARM T%2dH%2d", goal_temp, goal_humi);
hypark 0:a977ba955188 77 //servo
hypark 0:a977ba955188 78 if( curr_humi < goal_humi) //현재습도가 목표보다 낮으면
hypark 0:a977ba955188 79 { servo.pulsewidth_us(700); //벨브(서보모터) -90도
hypark 0:a977ba955188 80 state |= 0x20;
hypark 0:a977ba955188 81 }else
hypark 0:a977ba955188 82 { servo.pulsewidth_us(1500); //벨브(서보모터) 0도
hypark 0:a977ba955188 83 state |= 0x10;
hypark 0:a977ba955188 84 }
hypark 0:a977ba955188 85 //dc motor
hypark 0:a977ba955188 86 if( curr_temp > goal_temp + 5) //목표온도보다 5도 높으면
hypark 0:a977ba955188 87 { dc_en.pulsewidth_ms(10); //팬(DC모터) 100% 구동
hypark 0:a977ba955188 88 state |= 0x02;
hypark 0:a977ba955188 89 }else if ( curr_temp > goal_temp) //50% 구동
hypark 0:a977ba955188 90 { dc_en.pulsewidth_ms(5);
hypark 0:a977ba955188 91 state |= 0x04;
hypark 0:a977ba955188 92 }else
hypark 0:a977ba955188 93 { dc_en.pulsewidth_ms(0); // 정지
hypark 0:a977ba955188 94 state |= 0x08;
hypark 0:a977ba955188 95 }
hypark 0:a977ba955188 96 wait(0.2);// delay 200 ms
hypark 0:a977ba955188 97 pc_send_data(curr_temp, curr_humi, cds_value,dist, state); // PC 데이터 전송
hypark 0:a977ba955188 98 }
hypark 0:a977ba955188 99 }
hypark 0:a977ba955188 100