Becky Page / Mbed OS Assignment1081
Committer:
asreed
Date:
Fri Jan 08 11:05:19 2021 +0000
Revision:
4:7677c7a54d19
Parent:
3:00878bd4ddb8
Output signalling operational

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
asreed 4:7677c7a54d19 31 DigitalOut led(LED1); //status led on main pcb
asreed 2:daceae26f5df 32 DigitalIn pushButton(SW2, PullUp);
asreed 4:7677c7a54d19 33 AnalogIn vTherm(P10_1); // thermistor input could be 10_2
asreed 4:7677c7a54d19 34 AnalogIn lightLevel(P10_4); // LDR input
asreed 4:7677c7a54d19 35 DigitalOut boilerLed(P10_0);
asreed 4:7677c7a54d19 36 DigitalOut lightingLed(P10_5);
asreed 4:7677c7a54d19 37 DigitalOut yellowLed(P0_5);
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();
asreed 4:7677c7a54d19 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
asreed 4:7677c7a54d19 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();
asreed 4:7677c7a54d19 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 }
asreed 4:7677c7a54d19 172 void setActuators() {
asreed 4:7677c7a54d19 173 if (myData.ambientLight < myData.lowLightThresh) lightingLed = true;
asreed 4:7677c7a54d19 174 if (myData.ambientLight > myData.highLightThresh) lightingLed = false;
asreed 4:7677c7a54d19 175 if (myData.ambientTemp < myData.lowTempThresh) boilerLed = true;
asreed 4:7677c7a54d19 176 if (myData.ambientTemp > myData.highTempThresh) boilerLed = false;
asreed 4:7677c7a54d19 177 }
asreed 4:7677c7a54d19 178
asreed 2:daceae26f5df 179 void readSensors()
asreed 2:daceae26f5df 180 {
asreed 2:daceae26f5df 181 /* read thermistor Voltage */
asreed 0:44f87c90421e 182 float refVoltage = vTherm.read() * 2.4; // Range of ADC 0->2*Vref
asreed 0:44f87c90421e 183 float refCurrent = refVoltage / 10000.0; // 10k Reference Resistor
asreed 0:44f87c90421e 184 float thermVoltage = 3.3 - refVoltage; // Assume supply voltage is 3.3v
asreed 2:daceae26f5df 185 float thermResistance = thermVoltage / refCurrent;
asreed 0:44f87c90421e 186 float logrT = (float32_t)log((float64_t)thermResistance);
asreed 2:daceae26f5df 187
asreed 0:44f87c90421e 188 /* Calculate temperature from the resistance of thermistor using Steinhart-Hart Equation */
asreed 2:daceae26f5df 189 float stEqn = (float32_t)((0.0009032679) + ((0.000248772) * logrT) +
asreed 2:daceae26f5df 190 ((2.041094E-07) * pow((float64)logrT, (float32)3)));
asreed 0:44f87c90421e 191
asreed 2:daceae26f5df 192 myData.ambientTemp = (float32_t)(((1.0 / stEqn) - 273.15) + 0.5);
asreed 2:daceae26f5df 193 myData.ambientLight = ( 1 - lightLevel.read()) * 100;
asreed 2:daceae26f5df 194 }
asreed 2:daceae26f5df 195 void displayData()
asreed 2:daceae26f5df 196 {
asreed 2:daceae26f5df 197 int tCol, lCol;
asreed 2:daceae26f5df 198 if (myData.ambientTemp > myData.highTempThresh) {
asreed 2:daceae26f5df 199 tCol=41; //Red Text
asreed 2:daceae26f5df 200 printf("\033[1;31m");
asreed 2:daceae26f5df 201 } else if (myData.ambientTemp < myData.lowTempThresh) {
asreed 2:daceae26f5df 202 tCol=44; // Blue text
asreed 2:daceae26f5df 203 printf("\033[1;34m");
asreed 2:daceae26f5df 204 } else {
asreed 2:daceae26f5df 205 tCol=42; // Green Text
asreed 2:daceae26f5df 206 printf("\033[1;32m");
asreed 2:daceae26f5df 207 }
asreed 2:daceae26f5df 208 sprintf(buffer, "Temperature is: %2.1fC ", myData.ambientTemp);
asreed 2:daceae26f5df 209 displayAt(1, 4, buffer);
asreed 2:daceae26f5df 210 printf("\033[0;37m");
asreed 2:daceae26f5df 211 sprintf(buffer, "%2.1fC ", myData.lowTempThresh);
asreed 2:daceae26f5df 212 displayAt(31, 4, buffer);
asreed 2:daceae26f5df 213 sprintf(buffer, "%2.1fC ", myData.highTempThresh);
asreed 2:daceae26f5df 214 displayAt(47, 4, buffer);
asreed 2:daceae26f5df 215 sprintf(buffer,"\033[%dm \033[40m", tCol);
asreed 2:daceae26f5df 216 displayAt(26, 4, buffer);
asreed 4:7677c7a54d19 217 sprintf(buffer, "Boiler is %s", boilerLed?"On ":"Off");
asreed 4:7677c7a54d19 218 displayAt(1, 6, buffer);
asreed 2:daceae26f5df 219
asreed 2:daceae26f5df 220 if (myData.ambientLight > myData.highLightThresh) {
asreed 2:daceae26f5df 221 lCol=41; //Red Text
asreed 2:daceae26f5df 222 printf("\033[1;31m");
asreed 2:daceae26f5df 223 } else if (myData.ambientLight < myData.lowLightThresh) {
asreed 2:daceae26f5df 224 lCol=44; // Blue text
asreed 2:daceae26f5df 225 printf("\033[1;34m");
asreed 2:daceae26f5df 226 } else {
asreed 2:daceae26f5df 227 lCol=42; // Green Text
asreed 2:daceae26f5df 228 printf("\033[1;32m");
asreed 2:daceae26f5df 229 }
asreed 2:daceae26f5df 230 sprintf( buffer, "Ambient Light is: %3.1f%c ", myData.ambientLight, '%' );
asreed 2:daceae26f5df 231 displayAt(1, 5, buffer);
asreed 2:daceae26f5df 232 sprintf(buffer,"\033[%dm \033[40m", lCol);
asreed 2:daceae26f5df 233 displayAt(26, 5, buffer);
asreed 2:daceae26f5df 234 printf("\033[0;37m");
asreed 2:daceae26f5df 235 sprintf(buffer, "%2.1f%c ", myData.lowLightThresh, 0x25);
asreed 2:daceae26f5df 236 displayAt(31, 5, buffer);
asreed 2:daceae26f5df 237 sprintf(buffer, "%2.1f%c ", myData.highLightThresh, 0x25);
asreed 2:daceae26f5df 238 displayAt(47, 5, buffer);
asreed 4:7677c7a54d19 239 sprintf(buffer, "Lights are %s", lightingLed?"On ":"Off");
asreed 4:7677c7a54d19 240 displayAt(1, 7, buffer);
asreed 4:7677c7a54d19 241
asreed 2:daceae26f5df 242 }
asreed 2:daceae26f5df 243
asreed 2:daceae26f5df 244 void displayAt( int x, int y, char *buffer )
asreed 2:daceae26f5df 245 {
asreed 2:daceae26f5df 246 if (allowUpdate) {
asreed 2:daceae26f5df 247 printf( "\033[%d;%dH%s", y, x, buffer);
asreed 2:daceae26f5df 248 fflush(stdout);
asreed 0:44f87c90421e 249 }
asreed 0:44f87c90421e 250 }
asreed 1:aef8ec8d23d8 251
asreed 2:daceae26f5df 252 void initialise()
asreed 2:daceae26f5df 253 {
asreed 2:daceae26f5df 254 printf("\033[2J\033[H"); // clear screen and move the cursor to 0, 0
asreed 2:daceae26f5df 255 printf("\033[?25l"); // Turn off visible cursor[?25 lower case L
asreed 2:daceae26f5df 256
asreed 2:daceae26f5df 257
asreed 2:daceae26f5df 258 /* what is the character set?
asreed 2:daceae26f5df 259
asreed 2:daceae26f5df 260 for (int i = 32; i < 255; i ++) {
asreed 2:daceae26f5df 261 printf(" %c ", i);
asreed 2:daceae26f5df 262 }
asreed 2:daceae26f5df 263 thread_sleep_for(10000);
asreed 2:daceae26f5df 264 */
asreed 2:daceae26f5df 265 printf("Environmental Control System");
asreed 2:daceae26f5df 266 printf( "\033[1;37m" );
asreed 2:daceae26f5df 267 printf("\033[3;28H\033[1;34mLow Threshold \033[1;31mHigh Threshold");
asreed 2:daceae26f5df 268 printf("\033[2;37m\033[16;1H* Press \"Space key\" to set threshold values\r\n");
asreed 2:daceae26f5df 269 printf(" Use \"Tab key\" to select each threshold setting\r\n");
asreed 2:daceae26f5df 270 printf(" Hit \"Enter key\" to store new threshold value");
asreed 2:daceae26f5df 271 fflush(stdout); // send the codes to the terminal
asreed 2:daceae26f5df 272 }