checkpoint

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

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?

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