Smart Farm Base on Core-1000
Dependencies: DHT11 HCSR04 LCDLib mbed
main.cpp@0:a977ba955188, 2017-01-26 (annotated)
- 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?
User | Revision | Line number | New 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 |