
Automatic Cooling system using K64F board featuring: Set desired temperature from phone app using Bluetooth DC motor based fan at three speeds to choose from: slow, medium and fast (to be selected on app) Ambient temperature measured constantly using DHT11 sensor Amibent temperature displayed on LCD LEDs to show status of the system: On or Off
Dependencies: DHT TextLCD mbed
main.cpp@0:ea560af47ab9, 2018-03-19 (annotated)
- Committer:
- urvishpatel12
- Date:
- Mon Mar 19 05:23:48 2018 +0000
- Revision:
- 0:ea560af47ab9
- Child:
- 1:eb4b08eb62d6
LCD_added
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
urvishpatel12 | 0:ea560af47ab9 | 1 | #include "mbed.h" |
urvishpatel12 | 0:ea560af47ab9 | 2 | #include "DHT.h" |
urvishpatel12 | 0:ea560af47ab9 | 3 | #include "TextLCD.h" |
urvishpatel12 | 0:ea560af47ab9 | 4 | |
urvishpatel12 | 0:ea560af47ab9 | 5 | #define BUFFER_SIZE 3 |
urvishpatel12 | 0:ea560af47ab9 | 6 | #define ON "on" |
urvishpatel12 | 0:ea560af47ab9 | 7 | #define OFF "of" |
urvishpatel12 | 0:ea560af47ab9 | 8 | #define LOW "lo" |
urvishpatel12 | 0:ea560af47ab9 | 9 | #define MEDIUM "me" |
urvishpatel12 | 0:ea560af47ab9 | 10 | #define HIGH "hi" |
urvishpatel12 | 0:ea560af47ab9 | 11 | |
urvishpatel12 | 0:ea560af47ab9 | 12 | TextLCD lcd(PTC2,PTA2,PTB23,PTA1,PTB9,PTC17); |
urvishpatel12 | 0:ea560af47ab9 | 13 | UARTSerial bluetooth(PTC15, PTC14, 38400); |
urvishpatel12 | 0:ea560af47ab9 | 14 | Serial pc(USBTX, USBRX); |
urvishpatel12 | 0:ea560af47ab9 | 15 | DHT temperature(D0, DHT11); |
urvishpatel12 | 0:ea560af47ab9 | 16 | PwmOut motor(PTC3); // PWM pin |
urvishpatel12 | 0:ea560af47ab9 | 17 | DigitalOut ON_led(D15); |
urvishpatel12 | 0:ea560af47ab9 | 18 | DigitalOut OFF_led(D14); |
urvishpatel12 | 0:ea560af47ab9 | 19 | |
urvishpatel12 | 0:ea560af47ab9 | 20 | int dutycycle = 15; |
urvishpatel12 | 0:ea560af47ab9 | 21 | int desired_temp = 76; |
urvishpatel12 | 0:ea560af47ab9 | 22 | |
urvishpatel12 | 0:ea560af47ab9 | 23 | int main(){ |
urvishpatel12 | 0:ea560af47ab9 | 24 | |
urvishpatel12 | 0:ea560af47ab9 | 25 | //switch ON green LED and off red LED |
urvishpatel12 | 0:ea560af47ab9 | 26 | OFF_led = 1; |
urvishpatel12 | 0:ea560af47ab9 | 27 | ON_led = 0; |
urvishpatel12 | 0:ea560af47ab9 | 28 | |
urvishpatel12 | 0:ea560af47ab9 | 29 | //character array to receive BT commands |
urvishpatel12 | 0:ea560af47ab9 | 30 | char command[BUFFER_SIZE]; |
urvishpatel12 | 0:ea560af47ab9 | 31 | |
urvishpatel12 | 0:ea560af47ab9 | 32 | //initialize temperature variable |
urvishpatel12 | 0:ea560af47ab9 | 33 | float temp = 0.0f; |
urvishpatel12 | 0:ea560af47ab9 | 34 | |
urvishpatel12 | 0:ea560af47ab9 | 35 | //temperature sensor error indicator |
urvishpatel12 | 0:ea560af47ab9 | 36 | int sensor_input_error = 0 ; |
urvishpatel12 | 0:ea560af47ab9 | 37 | |
urvishpatel12 | 0:ea560af47ab9 | 38 | //system status flag: ON or OFF |
urvishpatel12 | 0:ea560af47ab9 | 39 | int on_flag = 0; |
urvishpatel12 | 0:ea560af47ab9 | 40 | |
urvishpatel12 | 0:ea560af47ab9 | 41 | //set the PWM period for the motor |
urvishpatel12 | 0:ea560af47ab9 | 42 | motor.period(0.01); |
urvishpatel12 | 0:ea560af47ab9 | 43 | |
urvishpatel12 | 0:ea560af47ab9 | 44 | //make bt reading non blocking |
urvishpatel12 | 0:ea560af47ab9 | 45 | bluetooth.set_blocking(false); |
urvishpatel12 | 0:ea560af47ab9 | 46 | |
urvishpatel12 | 0:ea560af47ab9 | 47 | while(true){ |
urvishpatel12 | 0:ea560af47ab9 | 48 | |
urvishpatel12 | 0:ea560af47ab9 | 49 | //Read the temperature sensor data |
urvishpatel12 | 0:ea560af47ab9 | 50 | sensor_input_error = temperature.readData(); |
urvishpatel12 | 0:ea560af47ab9 | 51 | |
urvishpatel12 | 0:ea560af47ab9 | 52 | //if no error, read temperature in Farenheit |
urvishpatel12 | 0:ea560af47ab9 | 53 | if(sensor_input_error == 0){ |
urvishpatel12 | 0:ea560af47ab9 | 54 | temp = temperature.ReadTemperature(FARENHEIT); |
urvishpatel12 | 0:ea560af47ab9 | 55 | } |
urvishpatel12 | 0:ea560af47ab9 | 56 | |
urvishpatel12 | 0:ea560af47ab9 | 57 | //print the serial the currently measured temperature |
urvishpatel12 | 0:ea560af47ab9 | 58 | pc.printf("temperature is %2d F\n",int(temp)); |
urvishpatel12 | 0:ea560af47ab9 | 59 | |
urvishpatel12 | 0:ea560af47ab9 | 60 | //print the temperature on the LCD |
urvishpatel12 | 0:ea560af47ab9 | 61 | lcd.cls(); |
urvishpatel12 | 0:ea560af47ab9 | 62 | lcd.printf("Temperature is:"); |
urvishpatel12 | 0:ea560af47ab9 | 63 | lcd.locate(6,1); |
urvishpatel12 | 0:ea560af47ab9 | 64 | lcd.printf("%2.0f F", temp); |
urvishpatel12 | 0:ea560af47ab9 | 65 | |
urvishpatel12 | 0:ea560af47ab9 | 66 | //compare the ambian temperature to the desired temperature |
urvishpatel12 | 0:ea560af47ab9 | 67 | //when flag is on |
urvishpatel12 | 0:ea560af47ab9 | 68 | if(on_flag == 1 ){ |
urvishpatel12 | 0:ea560af47ab9 | 69 | ON_led = 1; |
urvishpatel12 | 0:ea560af47ab9 | 70 | OFF_led = 0; |
urvishpatel12 | 0:ea560af47ab9 | 71 | if(temp > desired_temp){ |
urvishpatel12 | 0:ea560af47ab9 | 72 | motor = (float)dutycycle/100.0; |
urvishpatel12 | 0:ea560af47ab9 | 73 | }else{ |
urvishpatel12 | 0:ea560af47ab9 | 74 | motor = 0; |
urvishpatel12 | 0:ea560af47ab9 | 75 | } |
urvishpatel12 | 0:ea560af47ab9 | 76 | //when flag is off |
urvishpatel12 | 0:ea560af47ab9 | 77 | }else{ |
urvishpatel12 | 0:ea560af47ab9 | 78 | motor = 0; |
urvishpatel12 | 0:ea560af47ab9 | 79 | ON_led = 0; |
urvishpatel12 | 0:ea560af47ab9 | 80 | OFF_led = 1; |
urvishpatel12 | 0:ea560af47ab9 | 81 | } |
urvishpatel12 | 0:ea560af47ab9 | 82 | wait(1); |
urvishpatel12 | 0:ea560af47ab9 | 83 | |
urvishpatel12 | 0:ea560af47ab9 | 84 | //Poll command from bluetooth |
urvishpatel12 | 0:ea560af47ab9 | 85 | bluetooth.read(command, BUFFER_SIZE); |
urvishpatel12 | 0:ea560af47ab9 | 86 | |
urvishpatel12 | 0:ea560af47ab9 | 87 | //compare incoming data with NULL |
urvishpatel12 | 0:ea560af47ab9 | 88 | //then parse each one as a specific command |
urvishpatel12 | 0:ea560af47ab9 | 89 | if(strncmp(command,"\0",3) != 0){ |
urvishpatel12 | 0:ea560af47ab9 | 90 | if(strncmp(command,ON,3) == 0){ |
urvishpatel12 | 0:ea560af47ab9 | 91 | on_flag = 1; |
urvishpatel12 | 0:ea560af47ab9 | 92 | }else if(strncmp(command,OFF,3) == 0){ |
urvishpatel12 | 0:ea560af47ab9 | 93 | on_flag = 0; |
urvishpatel12 | 0:ea560af47ab9 | 94 | }else if(strncmp(command,LOW,3) == 0){ |
urvishpatel12 | 0:ea560af47ab9 | 95 | dutycycle = 12; |
urvishpatel12 | 0:ea560af47ab9 | 96 | }else if(strncmp(command,MEDIUM,3) == 0){ |
urvishpatel12 | 0:ea560af47ab9 | 97 | dutycycle = 15; |
urvishpatel12 | 0:ea560af47ab9 | 98 | }else if(strncmp(command,HIGH,3) == 0){ |
urvishpatel12 | 0:ea560af47ab9 | 99 | dutycycle = 20; |
urvishpatel12 | 0:ea560af47ab9 | 100 | }else { |
urvishpatel12 | 0:ea560af47ab9 | 101 | sscanf(command, "%d", &desired_temp); |
urvishpatel12 | 0:ea560af47ab9 | 102 | } |
urvishpatel12 | 0:ea560af47ab9 | 103 | }//end of command null compare |
urvishpatel12 | 0:ea560af47ab9 | 104 | //print the command received |
urvishpatel12 | 0:ea560af47ab9 | 105 | //wait(1); |
urvishpatel12 | 0:ea560af47ab9 | 106 | //pc.printf("Command was : %2s \n",command); |
urvishpatel12 | 0:ea560af47ab9 | 107 | //pc.printf("Duty Cycle is : %d \n",dutycycle); |
urvishpatel12 | 0:ea560af47ab9 | 108 | //pc.printf("Motor flag is : %d \n", on_flag); |
urvishpatel12 | 0:ea560af47ab9 | 109 | //pc.printf("Desired Temp is : %d \n", desired_temp); |
urvishpatel12 | 0:ea560af47ab9 | 110 | //reset the command back to NULL |
urvishpatel12 | 0:ea560af47ab9 | 111 | strcpy(command, "\0"); |
urvishpatel12 | 0:ea560af47ab9 | 112 | } |
urvishpatel12 | 0:ea560af47ab9 | 113 | } |