checkpoint

Dependencies:   mbed Servo mbed-rtos 4DGL-uLCD-SE DHT PinDetect BME280

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?

UserRevisionLine numberNew 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 }