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