Becky Page / Mbed OS Assignment1081
Committer:
rebecca_page
Date:
Sun Jan 24 17:27:21 2021 +0000
Revision:
6:c6fa68fb56ea
Parent:
5:124172cff206
Revised

Who changed what in which revision?

UserRevisionLine numberNew contents of line
asreed 0:44f87c90421e 1 /* mbed Microcontroller Library
asreed 0:44f87c90421e 2 * Copyright (c) 2019 ARM Limited
asreed 0:44f87c90421e 3 * SPDX-License-Identifier: Apache-2.0
asreed 0:44f87c90421e 4 */
asreed 0:44f87c90421e 5
asreed 0:44f87c90421e 6 #include "mbed.h"
asreed 0:44f87c90421e 7 #include "platform/mbed_thread.h"
asreed 0:44f87c90421e 8 #include "stdio.h"
asreed 0:44f87c90421e 9
asreed 0:44f87c90421e 10 // Blinking rate in milliseconds
asreed 0:44f87c90421e 11 #define BLINKING_RATE_MS 500
asreed 0:44f87c90421e 12 #define SW2 P0_4
asreed 2:daceae26f5df 13 // Specify different pins to test printing on UART other than the console UART.
asreed 2:daceae26f5df 14 #define TARGET_TX_PIN USBTX
asreed 2:daceae26f5df 15 #define TARGET_RX_PIN USBRX
asreed 0:44f87c90421e 16
asreed 2:daceae26f5df 17 // Create a BufferedSerial object to be used by the system I/O retarget code.
asreed 2:daceae26f5df 18 static Serial serial_port(TARGET_TX_PIN, TARGET_RX_PIN, 115200);
asreed 2:daceae26f5df 19
asreed 2:daceae26f5df 20 // Global variables
asreed 1:aef8ec8d23d8 21 char buffer[80];
asreed 2:daceae26f5df 22 Thread thread;
asreed 2:daceae26f5df 23 bool allowUpdate = true;
asreed 2:daceae26f5df 24
asreed 2:daceae26f5df 25 FileHandle *mbed::mbed_override_console(int fd)
asreed 2:daceae26f5df 26 {
asreed 2:daceae26f5df 27 return &serial_port;
asreed 2:daceae26f5df 28 }
asreed 2:daceae26f5df 29
asreed 2:daceae26f5df 30 // Initialise the digital pin LED1 as an output
rebecca_page 5:124172cff206 31 DigitalOut led(LED1); // Status indicator LED flashes at 1Hz
asreed 2:daceae26f5df 32 DigitalIn pushButton(SW2, PullUp);
rebecca_page 5:124172cff206 33 AnalogIn vTherm(P10_1); // Thermistor temperature sensor
rebecca_page 5:124172cff206 34 AnalogIn lightLevel(P10_4); //LDR light level sensor
rebecca_page 5:124172cff206 35 DigitalOut boilerLed (P10_5); //indicator of boiler status
rebecca_page 5:124172cff206 36 DigitalOut lightingLed (P10_0); // indicator of light switch status on/off
rebecca_page 5:124172cff206 37 DigitalOut yellowLed (P0_5); // Todo
asreed 2:daceae26f5df 38
asreed 2:daceae26f5df 39 /* Data Structures */
asreed 2:daceae26f5df 40
asreed 2:daceae26f5df 41 struct dataSet {
asreed 2:daceae26f5df 42 float highTempThresh = 26.0;
asreed 2:daceae26f5df 43 float lowTempThresh = 23.0;
asreed 2:daceae26f5df 44 float ambientTemp;
asreed 2:daceae26f5df 45 float highLightThresh = 80.0;
asreed 2:daceae26f5df 46 float lowLightThresh = 20.0;
asreed 2:daceae26f5df 47 float ambientLight;
asreed 2:daceae26f5df 48 } myData;
asreed 2:daceae26f5df 49
asreed 1:aef8ec8d23d8 50 /* prototype of function */
asreed 1:aef8ec8d23d8 51 void displayAt( int x, int y, char *buffer );
asreed 2:daceae26f5df 52 void initialise();
asreed 2:daceae26f5df 53 void readSensors();
rebecca_page 5:124172cff206 54 void setActuators();
asreed 2:daceae26f5df 55 void displayData();
asreed 2:daceae26f5df 56
asreed 2:daceae26f5df 57 /* console thread */
asreed 2:daceae26f5df 58 void consoleThread()
asreed 2:daceae26f5df 59 {
asreed 2:daceae26f5df 60 char inputStr[80];
asreed 2:daceae26f5df 61 int index = 0; // character input index in inputStr
asreed 2:daceae26f5df 62
asreed 2:daceae26f5df 63 int selection = 0; //{tempLow==0, tempHigh==1, lightLow==2, lightHigh==3}
asreed 2:daceae26f5df 64 while(1) {
asreed 2:daceae26f5df 65 if (serial_port.readable()) {
asreed 2:daceae26f5df 66 allowUpdate = false;
asreed 2:daceae26f5df 67 switch ( selection ) {
asreed 2:daceae26f5df 68 case 0: //tempLow:
asreed 2:daceae26f5df 69 printf("\033[4;31H\033[1;30m\033[47m%2.1f\033[1;37m\033[40m\033[14;1H", myData.lowTempThresh);
asreed 2:daceae26f5df 70 break;
asreed 2:daceae26f5df 71 case 1: //tempHigh:
asreed 2:daceae26f5df 72 printf("\033[4;47H\033[1;30m\033[47m%2.1f\033[1;37m\033[40m\033[14;1H", myData.highTempThresh);
asreed 2:daceae26f5df 73 break;
asreed 2:daceae26f5df 74 case 2: //lightLow:
asreed 2:daceae26f5df 75 printf("\033[5;31H\033[1;30m\033[47m%2.1f\033[1;37m\033[40m\033[14;1H", myData.lowLightThresh);
asreed 2:daceae26f5df 76 break;
asreed 2:daceae26f5df 77 case 3: //lightHigh:
asreed 2:daceae26f5df 78 printf("\033[5;47H\033[1;30m\033[47m%2.1f\033[1;37m\033[40m\033[14;1H", myData.highLightThresh);
asreed 2:daceae26f5df 79 break;
asreed 2:daceae26f5df 80 }
asreed 2:daceae26f5df 81 char inputChar;
asreed 2:daceae26f5df 82 inputChar = serial_port.getc();
asreed 2:daceae26f5df 83 switch (inputChar) {
asreed 2:daceae26f5df 84 case 0x08: // backspace
asreed 2:daceae26f5df 85
asreed 2:daceae26f5df 86 if (index > 0) inputStr[--index] = NULL;;
asreed 2:daceae26f5df 87
asreed 2:daceae26f5df 88 printf("\033[14;1HChange to: %s %c", inputStr, 0x08);
asreed 2:daceae26f5df 89 printf("\033[25h");
asreed 2:daceae26f5df 90 break;
asreed 3:00878bd4ddb8 91 case 0x09: // tab key
rebecca_page 5:124172cff206 92 switch (selection) { // currently selected threshold{
asreed 2:daceae26f5df 93 case 0:
asreed 2:daceae26f5df 94 printf("\033[4;31H\033[0;37m\033[40m%2.1f\033[4;47H\033[1;30m\033[47m%2.1f\033[1;37m\033[40m\033[14;1H", myData.lowTempThresh, myData.highTempThresh);
asreed 2:daceae26f5df 95 break;
asreed 2:daceae26f5df 96 case 1:
asreed 2:daceae26f5df 97 printf("\033[4;47H\033[0;37m\033[40m%2.1f\033[5;31H\033[1;30m\033[47m%2.1f\033[1;37m\033[40m\033[14;1H", myData.highTempThresh, myData.lowLightThresh);
asreed 2:daceae26f5df 98 break;
asreed 2:daceae26f5df 99 case 2:
asreed 2:daceae26f5df 100 printf("\033[5;31H\033[0;37m\033[40m%2.1f\033[5;47H\033[1;30m\033[47m%2.1f\033[1;37m\033[40m\033[14;1H", myData.lowLightThresh, myData.lowLightThresh);
asreed 2:daceae26f5df 101 break;
asreed 2:daceae26f5df 102 case 3:
asreed 2:daceae26f5df 103 printf("\033[5;47H\033[0;37m\033[40m%2.1f\033[4;31H\033[1;30m\033[47m%2.1f\033[1;37m\033[40m\033[14;1H", myData.lowLightThresh, myData.lowTempThresh);
asreed 2:daceae26f5df 104 break;
asreed 2:daceae26f5df 105 }
asreed 2:daceae26f5df 106 selection = (selection + 1)%4; // keep it within bounds
asreed 2:daceae26f5df 107
asreed 2:daceae26f5df 108 break;
asreed 2:daceae26f5df 109 case 0x0d: // enter key, accept input
asreed 2:daceae26f5df 110 if (index > 0) {
asreed 2:daceae26f5df 111 switch (selection) {
asreed 2:daceae26f5df 112 case 0:
asreed 2:daceae26f5df 113 myData.lowTempThresh = atof(inputStr);
asreed 2:daceae26f5df 114 break;
asreed 2:daceae26f5df 115 case 1:
asreed 2:daceae26f5df 116 myData.highTempThresh = atof(inputStr);
asreed 2:daceae26f5df 117 break;
asreed 2:daceae26f5df 118 case 2:
asreed 2:daceae26f5df 119 myData.lowLightThresh = atof(inputStr);
asreed 2:daceae26f5df 120 break;
asreed 2:daceae26f5df 121 case 3:
asreed 2:daceae26f5df 122 myData.highLightThresh = atof(inputStr);
asreed 2:daceae26f5df 123 break;
asreed 2:daceae26f5df 124 }
asreed 2:daceae26f5df 125 }
asreed 2:daceae26f5df 126 inputStr[index] = NULL;
asreed 2:daceae26f5df 127 index = 0;
asreed 2:daceae26f5df 128
asreed 2:daceae26f5df 129 allowUpdate = true;
asreed 2:daceae26f5df 130 printf("\033[14;1H\033[2K");
asreed 2:daceae26f5df 131 printf("\033[?25l");
asreed 2:daceae26f5df 132 break;
asreed 2:daceae26f5df 133 case 0x20: // Space bar data coming...
asreed 2:daceae26f5df 134 printf("\033[14;1HChange to: ");
asreed 2:daceae26f5df 135 break;
asreed 2:daceae26f5df 136 default: // should be a digit or decimal point
asreed 2:daceae26f5df 137 inputStr[index++] = inputChar;
asreed 2:daceae26f5df 138 inputStr[index] = NULL;
asreed 2:daceae26f5df 139 printf("\033[14;1HChange to: %s", inputStr);
asreed 2:daceae26f5df 140 printf("\033[?25h");
asreed 2:daceae26f5df 141 break;
asreed 2:daceae26f5df 142 }
asreed 2:daceae26f5df 143 }
asreed 2:daceae26f5df 144 thread_sleep_for(5); // let other task do stuff for 5ms
asreed 2:daceae26f5df 145 }
asreed 2:daceae26f5df 146 }
asreed 2:daceae26f5df 147
asreed 1:aef8ec8d23d8 148
asreed 0:44f87c90421e 149 int main()
asreed 0:44f87c90421e 150 {
asreed 2:daceae26f5df 151 initialise(); // function to setup VT100 display
asreed 2:daceae26f5df 152 thread.start( consoleThread );
asreed 2:daceae26f5df 153 /****************************************************************************
asreed 2:daceae26f5df 154 *
asreed 2:daceae26f5df 155 * Main loop:-
asreed 2:daceae26f5df 156 *
asreed 2:daceae26f5df 157 * flash status led
asreed 2:daceae26f5df 158 * read sensors
asreed 2:daceae26f5df 159 * display data read from the sensors and threshold values
asreed 2:daceae26f5df 160 * sleep for 0.5seconds
asreed 2:daceae26f5df 161 *
asreed 2:daceae26f5df 162 ***************************************************************************/
asreed 2:daceae26f5df 163
asreed 0:44f87c90421e 164 while (true) {
asreed 2:daceae26f5df 165 led = !led; // flashing status signal
asreed 2:daceae26f5df 166 readSensors();
rebecca_page 5:124172cff206 167 setActuators();
asreed 2:daceae26f5df 168 displayData();
asreed 2:daceae26f5df 169 thread_sleep_for(BLINKING_RATE_MS);
asreed 2:daceae26f5df 170 }
asreed 2:daceae26f5df 171 }
rebecca_page 5:124172cff206 172 void setActuators() {
rebecca_page 6:c6fa68fb56ea 173 if (myData.ambientLight > myData.lowLightThresh) lightingLed = true; // Light on when light level beneath thresh
rebecca_page 6:c6fa68fb56ea 174 if (myData.ambientLight > myData.highLightThresh) lightingLed = false; // Light off when light level above thresh
rebecca_page 6:c6fa68fb56ea 175 if (myData.ambientTemp > myData.lowTempThresh) lightingLed = true; // boiler on when temp below thresh
rebecca_page 6:c6fa68fb56ea 176 if (myData.ambientTemp > myData.highTempThresh) lightingLed = false; // boiler off when above thresh
rebecca_page 5:124172cff206 177 }
asreed 2:daceae26f5df 178 void readSensors()
asreed 2:daceae26f5df 179 {
asreed 2:daceae26f5df 180 /* read thermistor Voltage */
asreed 0:44f87c90421e 181 float refVoltage = vTherm.read() * 2.4; // Range of ADC 0->2*Vref
asreed 0:44f87c90421e 182 float refCurrent = refVoltage / 10000.0; // 10k Reference Resistor
asreed 0:44f87c90421e 183 float thermVoltage = 3.3 - refVoltage; // Assume supply voltage is 3.3v
asreed 2:daceae26f5df 184 float thermResistance = thermVoltage / refCurrent;
asreed 0:44f87c90421e 185 float logrT = (float32_t)log((float64_t)thermResistance);
asreed 2:daceae26f5df 186
asreed 0:44f87c90421e 187 /* Calculate temperature from the resistance of thermistor using Steinhart-Hart Equation */
asreed 2:daceae26f5df 188 float stEqn = (float32_t)((0.0009032679) + ((0.000248772) * logrT) +
asreed 2:daceae26f5df 189 ((2.041094E-07) * pow((float64)logrT, (float32)3)));
asreed 0:44f87c90421e 190
asreed 2:daceae26f5df 191 myData.ambientTemp = (float32_t)(((1.0 / stEqn) - 273.15) + 0.5);
asreed 2:daceae26f5df 192 myData.ambientLight = ( 1 - lightLevel.read()) * 100;
asreed 2:daceae26f5df 193 }
asreed 2:daceae26f5df 194 void displayData()
asreed 2:daceae26f5df 195 {
asreed 2:daceae26f5df 196 int tCol, lCol;
asreed 2:daceae26f5df 197 if (myData.ambientTemp > myData.highTempThresh) {
asreed 2:daceae26f5df 198 tCol=41; //Red Text
asreed 2:daceae26f5df 199 printf("\033[1;31m");
asreed 2:daceae26f5df 200 } else if (myData.ambientTemp < myData.lowTempThresh) {
asreed 2:daceae26f5df 201 tCol=44; // Blue text
asreed 2:daceae26f5df 202 printf("\033[1;34m");
asreed 2:daceae26f5df 203 } else {
asreed 2:daceae26f5df 204 tCol=42; // Green Text
asreed 2:daceae26f5df 205 printf("\033[1;32m");
asreed 2:daceae26f5df 206 }
asreed 2:daceae26f5df 207 sprintf(buffer, "Temperature is: %2.1fC ", myData.ambientTemp);
asreed 2:daceae26f5df 208 displayAt(1, 4, buffer);
asreed 2:daceae26f5df 209 printf("\033[0;37m");
asreed 2:daceae26f5df 210 sprintf(buffer, "%2.1fC ", myData.lowTempThresh);
asreed 2:daceae26f5df 211 displayAt(31, 4, buffer);
asreed 2:daceae26f5df 212 sprintf(buffer, "%2.1fC ", myData.highTempThresh);
asreed 2:daceae26f5df 213 displayAt(47, 4, buffer);
asreed 2:daceae26f5df 214 sprintf(buffer,"\033[%dm \033[40m", tCol);
asreed 2:daceae26f5df 215 displayAt(26, 4, buffer);
rebecca_page 5:124172cff206 216 sprintf( buffer, "The boiler is %s", boilerLed?"On ":"Off" );
rebecca_page 5:124172cff206 217 displayAt(1, 6, buffer);
asreed 2:daceae26f5df 218
asreed 2:daceae26f5df 219 if (myData.ambientLight > myData.highLightThresh) {
asreed 2:daceae26f5df 220 lCol=41; //Red Text
asreed 2:daceae26f5df 221 printf("\033[1;31m");
asreed 2:daceae26f5df 222 } else if (myData.ambientLight < myData.lowLightThresh) {
asreed 2:daceae26f5df 223 lCol=44; // Blue text
asreed 2:daceae26f5df 224 printf("\033[1;34m");
asreed 2:daceae26f5df 225 } else {
asreed 2:daceae26f5df 226 lCol=42; // Green Text
asreed 2:daceae26f5df 227 printf("\033[1;32m");
asreed 2:daceae26f5df 228 }
asreed 2:daceae26f5df 229 sprintf( buffer, "Ambient Light is: %3.1f%c ", myData.ambientLight, '%' );
asreed 2:daceae26f5df 230 displayAt(1, 5, buffer);
asreed 2:daceae26f5df 231 sprintf(buffer,"\033[%dm \033[40m", lCol);
asreed 2:daceae26f5df 232 displayAt(26, 5, buffer);
asreed 2:daceae26f5df 233 printf("\033[0;37m");
asreed 2:daceae26f5df 234 sprintf(buffer, "%2.1f%c ", myData.lowLightThresh, 0x25);
asreed 2:daceae26f5df 235 displayAt(31, 5, buffer);
asreed 2:daceae26f5df 236 sprintf(buffer, "%2.1f%c ", myData.highLightThresh, 0x25);
asreed 2:daceae26f5df 237 displayAt(47, 5, buffer);
rebecca_page 5:124172cff206 238 sprintf( buffer, "The lights are %s", lightingLed?"On ":"Off" );
rebecca_page 6:c6fa68fb56ea 239 displayAt(1, 7, buffer);
asreed 2:daceae26f5df 240 }
asreed 2:daceae26f5df 241
asreed 2:daceae26f5df 242 void displayAt( int x, int y, char *buffer )
asreed 2:daceae26f5df 243 {
asreed 2:daceae26f5df 244 if (allowUpdate) {
asreed 2:daceae26f5df 245 printf( "\033[%d;%dH%s", y, x, buffer);
asreed 2:daceae26f5df 246 fflush(stdout);
asreed 0:44f87c90421e 247 }
asreed 0:44f87c90421e 248 }
asreed 1:aef8ec8d23d8 249
asreed 2:daceae26f5df 250 void initialise()
asreed 2:daceae26f5df 251 {
asreed 2:daceae26f5df 252 printf("\033[2J\033[H"); // clear screen and move the cursor to 0, 0
asreed 2:daceae26f5df 253 printf("\033[?25l"); // Turn off visible cursor[?25 lower case L
asreed 2:daceae26f5df 254
asreed 2:daceae26f5df 255
asreed 2:daceae26f5df 256 /* what is the character set?
asreed 2:daceae26f5df 257
asreed 2:daceae26f5df 258 for (int i = 32; i < 255; i ++) {
asreed 2:daceae26f5df 259 printf(" %c ", i);
asreed 2:daceae26f5df 260 }
asreed 2:daceae26f5df 261 thread_sleep_for(10000);
asreed 2:daceae26f5df 262 */
asreed 2:daceae26f5df 263 printf("Environmental Control System");
asreed 2:daceae26f5df 264 printf( "\033[1;37m" );
asreed 2:daceae26f5df 265 printf("\033[3;28H\033[1;34mLow Threshold \033[1;31mHigh Threshold");
asreed 2:daceae26f5df 266 printf("\033[2;37m\033[16;1H* Press \"Space key\" to set threshold values\r\n");
asreed 2:daceae26f5df 267 printf(" Use \"Tab key\" to select each threshold setting\r\n");
asreed 2:daceae26f5df 268 printf(" Hit \"Enter key\" to store new threshold value");
asreed 2:daceae26f5df 269 fflush(stdout); // send the codes to the terminal
asreed 2:daceae26f5df 270 }