checkpoint
Dependencies: mbed Servo mbed-rtos 4DGL-uLCD-SE DHT PinDetect BME280
main.cpp@12:c7c1603ec7fe, 2021-05-01 (annotated)
- Committer:
- cx872
- Date:
- Sat May 01 21:25:40 2021 +0000
- Revision:
- 12:c7c1603ec7fe
- Parent:
- 11:0309bef74ba8
- Child:
- 13:6cb633e5010a
checkpoit 17:25
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cx872 | 12:c7c1603ec7fe | 1 | #include "mbed.h" |
cx872 | 12:c7c1603ec7fe | 2 | #include "DHT.h" |
cx872 | 12:c7c1603ec7fe | 3 | #include "uLCD_4DGL.h" |
cx872 | 12:c7c1603ec7fe | 4 | #include "rtos.h" |
cx872 | 12:c7c1603ec7fe | 5 | #include "PinDetect.h" |
cx872 | 12:c7c1603ec7fe | 6 | #include "Servo.h" |
cx872 | 12:c7c1603ec7fe | 7 | |
cx872 | 12:c7c1603ec7fe | 8 | uLCD_4DGL lcd(p13,p14,p19); // serial tx, serial rx, reset pin; |
cx872 | 12:c7c1603ec7fe | 9 | DHT dht(p18, DHT22); |
cx872 | 12:c7c1603ec7fe | 10 | PinDetect bt1(p8); |
cx872 | 12:c7c1603ec7fe | 11 | PinDetect bt2(p7); |
cx872 | 12:c7c1603ec7fe | 12 | PinDetect bt3(p6); |
cx872 | 12:c7c1603ec7fe | 13 | Servo servo(p21); |
cx872 | 12:c7c1603ec7fe | 14 | Mutex lcd_mutex; |
cx872 | 12:c7c1603ec7fe | 15 | Serial blue(p28, p27); //Bluetooth Module |
cx872 | 12:c7c1603ec7fe | 16 | |
cx872 | 12:c7c1603ec7fe | 17 | |
cx872 | 12:c7c1603ec7fe | 18 | float humidity; |
cx872 | 12:c7c1603ec7fe | 19 | volatile float set_temp, curr_temp; |
cx872 | 12:c7c1603ec7fe | 20 | volatile bool AC_on; |
cx872 | 12:c7c1603ec7fe | 21 | |
cx872 | 12:c7c1603ec7fe | 22 | // two interrupts for updating the set temperature |
cx872 | 12:c7c1603ec7fe | 23 | void increment_temp() { |
cx872 | 12:c7c1603ec7fe | 24 | if (set_temp <= 29.5) |
cx872 | 12:c7c1603ec7fe | 25 | set_temp += 0.5; |
cx872 | 12:c7c1603ec7fe | 26 | } |
cx872 | 12:c7c1603ec7fe | 27 | |
cx872 | 12:c7c1603ec7fe | 28 | void decrement_temp() { |
cx872 | 12:c7c1603ec7fe | 29 | if (set_temp >= 16.5) |
cx872 | 12:c7c1603ec7fe | 30 | set_temp -= 0.5; |
cx872 | 12:c7c1603ec7fe | 31 | } |
cx872 | 12:c7c1603ec7fe | 32 | |
cx872 | 12:c7c1603ec7fe | 33 | // thread 1, for updating the temperature printout on LCD |
cx872 | 12:c7c1603ec7fe | 34 | void temp_update() { |
cx872 | 12:c7c1603ec7fe | 35 | while (1) { |
cx872 | 12:c7c1603ec7fe | 36 | lcd_mutex.lock(); |
cx872 | 12:c7c1603ec7fe | 37 | lcd.color(WHITE); |
cx872 | 12:c7c1603ec7fe | 38 | lcd.set_font_size(2, 2); |
cx872 | 12:c7c1603ec7fe | 39 | lcd.locate(0, 2); |
cx872 | 12:c7c1603ec7fe | 40 | lcd.printf("%.1f ", set_temp); |
cx872 | 12:c7c1603ec7fe | 41 | lcd_mutex.unlock(); |
cx872 | 12:c7c1603ec7fe | 42 | |
cx872 | 12:c7c1603ec7fe | 43 | Thread::wait(500); |
cx872 | 12:c7c1603ec7fe | 44 | } |
cx872 | 12:c7c1603ec7fe | 45 | } |
cx872 | 12:c7c1603ec7fe | 46 | |
cx872 | 12:c7c1603ec7fe | 47 | // thread 2, for comparing temperature and controlling the servo |
cx872 | 12:c7c1603ec7fe | 48 | void servo_control() { |
cx872 | 12:c7c1603ec7fe | 49 | while (1) { |
cx872 | 12:c7c1603ec7fe | 50 | if (curr_temp >= set_temp + 1.0f) { |
cx872 | 12:c7c1603ec7fe | 51 | servo = 1; |
cx872 | 12:c7c1603ec7fe | 52 | lcd_mutex.lock(); |
cx872 | 12:c7c1603ec7fe | 53 | lcd.locate(5, 6); |
cx872 | 12:c7c1603ec7fe | 54 | lcd.color(RED); |
cx872 | 12:c7c1603ec7fe | 55 | lcd.printf("ON "); |
cx872 | 12:c7c1603ec7fe | 56 | lcd_mutex.unlock(); |
cx872 | 12:c7c1603ec7fe | 57 | // Thread::wait(60 * 1000); // lock the action for at least 1 minute |
cx872 | 12:c7c1603ec7fe | 58 | continue; |
cx872 | 12:c7c1603ec7fe | 59 | } |
cx872 | 12:c7c1603ec7fe | 60 | |
cx872 | 12:c7c1603ec7fe | 61 | if (curr_temp <= set_temp - 1.0f) { |
cx872 | 12:c7c1603ec7fe | 62 | servo = -1; |
cx872 | 12:c7c1603ec7fe | 63 | lcd_mutex.lock(); |
cx872 | 12:c7c1603ec7fe | 64 | lcd.locate(5, 6); |
cx872 | 12:c7c1603ec7fe | 65 | lcd.color(RED); |
cx872 | 12:c7c1603ec7fe | 66 | lcd.printf("OFF"); |
cx872 | 12:c7c1603ec7fe | 67 | lcd_mutex.unlock(); |
cx872 | 12:c7c1603ec7fe | 68 | } |
cx872 | 12:c7c1603ec7fe | 69 | |
cx872 | 12:c7c1603ec7fe | 70 | Thread::wait(1000); |
cx872 | 12:c7c1603ec7fe | 71 | } |
cx872 | 12:c7c1603ec7fe | 72 | } |
cx872 | 12:c7c1603ec7fe | 73 | |
cx872 | 12:c7c1603ec7fe | 74 | // thread 3, for monitoring bluetooth device and update temperature |
cx872 | 12:c7c1603ec7fe | 75 | void bluetooth_control() { |
cx872 | 12:c7c1603ec7fe | 76 | while (1) { |
cx872 | 12:c7c1603ec7fe | 77 | // printf("hey"); |
cx872 | 12:c7c1603ec7fe | 78 | if (blue.readable()) { |
cx872 | 12:c7c1603ec7fe | 79 | printf("blue is readable\n"); |
cx872 | 12:c7c1603ec7fe | 80 | if (blue.getc() == 's') { |
cx872 | 12:c7c1603ec7fe | 81 | if (blue.getc() == 'e') { |
cx872 | 12:c7c1603ec7fe | 82 | if (blue.getc() == 't') { |
cx872 | 12:c7c1603ec7fe | 83 | // if (blue.getc() == ' ') { |
cx872 | 12:c7c1603ec7fe | 84 | printf("here!\n"); |
cx872 | 12:c7c1603ec7fe | 85 | char msg[5]; |
cx872 | 12:c7c1603ec7fe | 86 | msg[0] = blue.getc(); |
cx872 | 12:c7c1603ec7fe | 87 | msg[1] = blue.getc(); |
cx872 | 12:c7c1603ec7fe | 88 | msg[2] = blue.getc(); |
cx872 | 12:c7c1603ec7fe | 89 | msg[3] = blue.getc(); |
cx872 | 12:c7c1603ec7fe | 90 | msg[4] = '\0'; |
cx872 | 12:c7c1603ec7fe | 91 | |
cx872 | 12:c7c1603ec7fe | 92 | sscanf(msg, "%f", &set_temp); |
cx872 | 12:c7c1603ec7fe | 93 | printf("%s", msg); |
cx872 | 12:c7c1603ec7fe | 94 | // } |
cx872 | 12:c7c1603ec7fe | 95 | } |
cx872 | 12:c7c1603ec7fe | 96 | } |
cx872 | 12:c7c1603ec7fe | 97 | } |
cx872 | 12:c7c1603ec7fe | 98 | } |
cx872 | 12:c7c1603ec7fe | 99 | Thread::yield(); |
cx872 | 12:c7c1603ec7fe | 100 | } |
cx872 | 12:c7c1603ec7fe | 101 | } |
cx872 | 12:c7c1603ec7fe | 102 | |
cx872 | 12:c7c1603ec7fe | 103 | int main() { |
cx872 | 12:c7c1603ec7fe | 104 | servo = 0; |
cx872 | 12:c7c1603ec7fe | 105 | blue.baud(9600); |
cx872 | 12:c7c1603ec7fe | 106 | |
cx872 | 12:c7c1603ec7fe | 107 | bt1.mode(PullUp); |
cx872 | 12:c7c1603ec7fe | 108 | bt2.mode(PullUp); |
cx872 | 12:c7c1603ec7fe | 109 | bt3.mode(PullUp); |
cx872 | 12:c7c1603ec7fe | 110 | bt1.attach_deasserted(&increment_temp); |
cx872 | 12:c7c1603ec7fe | 111 | bt2.attach_deasserted(&decrement_temp); |
cx872 | 12:c7c1603ec7fe | 112 | |
cx872 | 12:c7c1603ec7fe | 113 | bt1.setSampleFrequency(); |
cx872 | 12:c7c1603ec7fe | 114 | bt2.setSampleFrequency(); |
cx872 | 12:c7c1603ec7fe | 115 | bt3.setSampleFrequency(); |
cx872 | 12:c7c1603ec7fe | 116 | |
cx872 | 12:c7c1603ec7fe | 117 | set_temp = 25; |
cx872 | 12:c7c1603ec7fe | 118 | ///////////////////////// |
cx872 | 12:c7c1603ec7fe | 119 | lcd.filled_rectangle(5, 0, 60, 4, WHITE); |
cx872 | 12:c7c1603ec7fe | 120 | lcd.filled_rectangle(65, 0, 125, 4, GREEN); |
cx872 | 12:c7c1603ec7fe | 121 | lcd.filled_rectangle(5, 70, 60, 74, BLUE); |
cx872 | 12:c7c1603ec7fe | 122 | lcd.filled_rectangle(65, 70, 125, 74, RED); |
cx872 | 12:c7c1603ec7fe | 123 | ///////////////////////// |
cx872 | 12:c7c1603ec7fe | 124 | lcd.text_width(2); |
cx872 | 12:c7c1603ec7fe | 125 | lcd.text_height(2); |
cx872 | 12:c7c1603ec7fe | 126 | lcd.locate(0, 1); |
cx872 | 12:c7c1603ec7fe | 127 | lcd.color(WHITE); |
cx872 | 12:c7c1603ec7fe | 128 | lcd.printf(" SET "); |
cx872 | 12:c7c1603ec7fe | 129 | lcd.color(GREEN); |
cx872 | 12:c7c1603ec7fe | 130 | lcd.printf("CUR"); |
cx872 | 12:c7c1603ec7fe | 131 | lcd.locate(0, 5); |
cx872 | 12:c7c1603ec7fe | 132 | lcd.color(BLUE); |
cx872 | 12:c7c1603ec7fe | 133 | lcd.printf(" HUM "); |
cx872 | 12:c7c1603ec7fe | 134 | lcd.color(RED); |
cx872 | 12:c7c1603ec7fe | 135 | lcd.printf("ACT"); |
cx872 | 12:c7c1603ec7fe | 136 | |
cx872 | 12:c7c1603ec7fe | 137 | Thread t1; |
cx872 | 12:c7c1603ec7fe | 138 | Thread t2; |
cx872 | 12:c7c1603ec7fe | 139 | Thread t3; |
cx872 | 12:c7c1603ec7fe | 140 | |
cx872 | 12:c7c1603ec7fe | 141 | t1.start(&temp_update); |
cx872 | 12:c7c1603ec7fe | 142 | t2.start(&servo_control); |
cx872 | 12:c7c1603ec7fe | 143 | t3.start(&bluetooth_control); |
cx872 | 12:c7c1603ec7fe | 144 | |
cx872 | 12:c7c1603ec7fe | 145 | int code; |
cx872 | 12:c7c1603ec7fe | 146 | |
cx872 | 12:c7c1603ec7fe | 147 | // main thread, for updating temperature and humidity printouts on LCD |
cx872 | 12:c7c1603ec7fe | 148 | while (1) { |
cx872 | 12:c7c1603ec7fe | 149 | code = dht.readData(); // error detection code for DHT22 |
cx872 | 12:c7c1603ec7fe | 150 | // if (code != 0) |
cx872 | 12:c7c1603ec7fe | 151 | // continue; |
cx872 | 12:c7c1603ec7fe | 152 | |
cx872 | 12:c7c1603ec7fe | 153 | // printf("code=%d\n", code); |
cx872 | 12:c7c1603ec7fe | 154 | curr_temp = dht.ReadTemperature(CELCIUS); |
cx872 | 12:c7c1603ec7fe | 155 | humidity = dht.ReadHumidity(); |
cx872 | 12:c7c1603ec7fe | 156 | |
cx872 | 12:c7c1603ec7fe | 157 | lcd_mutex.lock(); |
cx872 | 12:c7c1603ec7fe | 158 | lcd.locate(5, 2); |
cx872 | 12:c7c1603ec7fe | 159 | lcd.color(GREEN); |
cx872 | 12:c7c1603ec7fe | 160 | lcd.printf("%.1f", curr_temp); |
cx872 | 12:c7c1603ec7fe | 161 | |
cx872 | 12:c7c1603ec7fe | 162 | lcd.locate(0, 6); |
cx872 | 12:c7c1603ec7fe | 163 | lcd.color(BLUE); |
cx872 | 12:c7c1603ec7fe | 164 | lcd.printf(" %.0f%%", humidity); |
cx872 | 12:c7c1603ec7fe | 165 | lcd_mutex.unlock(); |
cx872 | 12:c7c1603ec7fe | 166 | |
cx872 | 12:c7c1603ec7fe | 167 | Thread::wait(2000); |
cx872 | 12:c7c1603ec7fe | 168 | } |
cx872 | 12:c7c1603ec7fe | 169 | } |