Becky Page / Mbed OS Assignment1081
Committer:
asreed
Date:
Fri Dec 18 13:14:47 2020 +0000
Revision:
2:daceae26f5df
Parent:
1:aef8ec8d23d8
Child:
3:00878bd4ddb8
Commit of serial io additions to environmental control system

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 2:daceae26f5df 31 DigitalOut led(LED1);
asreed 2:daceae26f5df 32 DigitalIn pushButton(SW2, PullUp);
asreed 2:daceae26f5df 33 AnalogIn vTherm(P10_1);
asreed 2:daceae26f5df 34 AnalogIn lightLevel(P10_4);
asreed 2:daceae26f5df 35
asreed 2:daceae26f5df 36 /* Data Structures */
asreed 2:daceae26f5df 37
asreed 2:daceae26f5df 38 struct dataSet {
asreed 2:daceae26f5df 39 float highTempThresh = 26.0;
asreed 2:daceae26f5df 40 float lowTempThresh = 23.0;
asreed 2:daceae26f5df 41 float ambientTemp;
asreed 2:daceae26f5df 42 float highLightThresh = 80.0;
asreed 2:daceae26f5df 43 float lowLightThresh = 20.0;
asreed 2:daceae26f5df 44 float ambientLight;
asreed 2:daceae26f5df 45 } myData;
asreed 2:daceae26f5df 46
asreed 1:aef8ec8d23d8 47 /* prototype of function */
asreed 1:aef8ec8d23d8 48 void displayAt( int x, int y, char *buffer );
asreed 2:daceae26f5df 49 void initialise();
asreed 2:daceae26f5df 50 void readSensors();
asreed 2:daceae26f5df 51 void displayData();
asreed 2:daceae26f5df 52
asreed 2:daceae26f5df 53 /* console thread */
asreed 2:daceae26f5df 54 void consoleThread()
asreed 2:daceae26f5df 55 {
asreed 2:daceae26f5df 56 char inputStr[80];
asreed 2:daceae26f5df 57 int index = 0; // character input index in inputStr
asreed 2:daceae26f5df 58
asreed 2:daceae26f5df 59 int selection = 0; //{tempLow==0, tempHigh==1, lightLow==2, lightHigh==3}
asreed 2:daceae26f5df 60 while(1) {
asreed 2:daceae26f5df 61 if (serial_port.readable()) {
asreed 2:daceae26f5df 62 allowUpdate = false;
asreed 2:daceae26f5df 63 switch ( selection ) {
asreed 2:daceae26f5df 64 case 0: //tempLow:
asreed 2:daceae26f5df 65 printf("\033[4;31H\033[1;30m\033[47m%2.1f\033[1;37m\033[40m\033[14;1H", myData.lowTempThresh);
asreed 2:daceae26f5df 66 break;
asreed 2:daceae26f5df 67 case 1: //tempHigh:
asreed 2:daceae26f5df 68 printf("\033[4;47H\033[1;30m\033[47m%2.1f\033[1;37m\033[40m\033[14;1H", myData.highTempThresh);
asreed 2:daceae26f5df 69 break;
asreed 2:daceae26f5df 70 case 2: //lightLow:
asreed 2:daceae26f5df 71 printf("\033[5;31H\033[1;30m\033[47m%2.1f\033[1;37m\033[40m\033[14;1H", myData.lowLightThresh);
asreed 2:daceae26f5df 72 break;
asreed 2:daceae26f5df 73 case 3: //lightHigh:
asreed 2:daceae26f5df 74 printf("\033[5;47H\033[1;30m\033[47m%2.1f\033[1;37m\033[40m\033[14;1H", myData.highLightThresh);
asreed 2:daceae26f5df 75 break;
asreed 2:daceae26f5df 76 }
asreed 2:daceae26f5df 77 char inputChar;
asreed 2:daceae26f5df 78 inputChar = serial_port.getc();
asreed 2:daceae26f5df 79 switch (inputChar) {
asreed 2:daceae26f5df 80 case 0x08: // backspace
asreed 2:daceae26f5df 81
asreed 2:daceae26f5df 82 if (index > 0) inputStr[--index] = NULL;;
asreed 2:daceae26f5df 83
asreed 2:daceae26f5df 84 printf("\033[14;1HChange to: %s %c", inputStr, 0x08);
asreed 2:daceae26f5df 85 printf("\033[25h");
asreed 2:daceae26f5df 86 break;
asreed 2:daceae26f5df 87 case 0x09:
asreed 2:daceae26f5df 88 switch (selection) {
asreed 2:daceae26f5df 89 case 0:
asreed 2:daceae26f5df 90 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 91 break;
asreed 2:daceae26f5df 92 case 1:
asreed 2:daceae26f5df 93 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 94 break;
asreed 2:daceae26f5df 95 case 2:
asreed 2:daceae26f5df 96 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 97 break;
asreed 2:daceae26f5df 98 case 3:
asreed 2:daceae26f5df 99 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 100 break;
asreed 2:daceae26f5df 101 }
asreed 2:daceae26f5df 102 selection = (selection + 1)%4; // keep it within bounds
asreed 2:daceae26f5df 103
asreed 2:daceae26f5df 104 break;
asreed 2:daceae26f5df 105 case 0x0d: // enter key, accept input
asreed 2:daceae26f5df 106 if (index > 0) {
asreed 2:daceae26f5df 107 switch (selection) {
asreed 2:daceae26f5df 108 case 0:
asreed 2:daceae26f5df 109 myData.lowTempThresh = atof(inputStr);
asreed 2:daceae26f5df 110 break;
asreed 2:daceae26f5df 111 case 1:
asreed 2:daceae26f5df 112 myData.highTempThresh = atof(inputStr);
asreed 2:daceae26f5df 113 break;
asreed 2:daceae26f5df 114 case 2:
asreed 2:daceae26f5df 115 myData.lowLightThresh = atof(inputStr);
asreed 2:daceae26f5df 116 break;
asreed 2:daceae26f5df 117 case 3:
asreed 2:daceae26f5df 118 myData.highLightThresh = atof(inputStr);
asreed 2:daceae26f5df 119 break;
asreed 2:daceae26f5df 120 }
asreed 2:daceae26f5df 121 }
asreed 2:daceae26f5df 122 inputStr[index] = NULL;
asreed 2:daceae26f5df 123 index = 0;
asreed 2:daceae26f5df 124
asreed 2:daceae26f5df 125 allowUpdate = true;
asreed 2:daceae26f5df 126 printf("\033[14;1H\033[2K");
asreed 2:daceae26f5df 127 printf("\033[?25l");
asreed 2:daceae26f5df 128 break;
asreed 2:daceae26f5df 129 case 0x20: // Space bar data coming...
asreed 2:daceae26f5df 130 printf("\033[14;1HChange to: ");
asreed 2:daceae26f5df 131 break;
asreed 2:daceae26f5df 132 default: // should be a digit or decimal point
asreed 2:daceae26f5df 133 inputStr[index++] = inputChar;
asreed 2:daceae26f5df 134 inputStr[index] = NULL;
asreed 2:daceae26f5df 135 printf("\033[14;1HChange to: %s", inputStr);
asreed 2:daceae26f5df 136 printf("\033[?25h");
asreed 2:daceae26f5df 137 break;
asreed 2:daceae26f5df 138 }
asreed 2:daceae26f5df 139 }
asreed 2:daceae26f5df 140 thread_sleep_for(5); // let other task do stuff for 5ms
asreed 2:daceae26f5df 141 }
asreed 2:daceae26f5df 142 }
asreed 2:daceae26f5df 143
asreed 1:aef8ec8d23d8 144
asreed 0:44f87c90421e 145 int main()
asreed 0:44f87c90421e 146 {
asreed 2:daceae26f5df 147 initialise(); // function to setup VT100 display
asreed 2:daceae26f5df 148 thread.start( consoleThread );
asreed 2:daceae26f5df 149 /****************************************************************************
asreed 2:daceae26f5df 150 *
asreed 2:daceae26f5df 151 * Main loop:-
asreed 2:daceae26f5df 152 *
asreed 2:daceae26f5df 153 * flash status led
asreed 2:daceae26f5df 154 * read sensors
asreed 2:daceae26f5df 155 * display data read from the sensors and threshold values
asreed 2:daceae26f5df 156 * sleep for 0.5seconds
asreed 2:daceae26f5df 157 *
asreed 2:daceae26f5df 158 ***************************************************************************/
asreed 2:daceae26f5df 159
asreed 0:44f87c90421e 160 while (true) {
asreed 2:daceae26f5df 161 led = !led; // flashing status signal
asreed 2:daceae26f5df 162 readSensors();
asreed 2:daceae26f5df 163 displayData();
asreed 2:daceae26f5df 164 thread_sleep_for(BLINKING_RATE_MS);
asreed 2:daceae26f5df 165 }
asreed 2:daceae26f5df 166 }
asreed 2:daceae26f5df 167 void readSensors()
asreed 2:daceae26f5df 168 {
asreed 2:daceae26f5df 169 /* read thermistor Voltage */
asreed 0:44f87c90421e 170 float refVoltage = vTherm.read() * 2.4; // Range of ADC 0->2*Vref
asreed 0:44f87c90421e 171 float refCurrent = refVoltage / 10000.0; // 10k Reference Resistor
asreed 0:44f87c90421e 172 float thermVoltage = 3.3 - refVoltage; // Assume supply voltage is 3.3v
asreed 2:daceae26f5df 173 float thermResistance = thermVoltage / refCurrent;
asreed 0:44f87c90421e 174 float logrT = (float32_t)log((float64_t)thermResistance);
asreed 2:daceae26f5df 175
asreed 0:44f87c90421e 176 /* Calculate temperature from the resistance of thermistor using Steinhart-Hart Equation */
asreed 2:daceae26f5df 177 float stEqn = (float32_t)((0.0009032679) + ((0.000248772) * logrT) +
asreed 2:daceae26f5df 178 ((2.041094E-07) * pow((float64)logrT, (float32)3)));
asreed 0:44f87c90421e 179
asreed 2:daceae26f5df 180 myData.ambientTemp = (float32_t)(((1.0 / stEqn) - 273.15) + 0.5);
asreed 2:daceae26f5df 181 myData.ambientLight = ( 1 - lightLevel.read()) * 100;
asreed 2:daceae26f5df 182 }
asreed 2:daceae26f5df 183 void displayData()
asreed 2:daceae26f5df 184 {
asreed 2:daceae26f5df 185 int tCol, lCol;
asreed 2:daceae26f5df 186 if (myData.ambientTemp > myData.highTempThresh) {
asreed 2:daceae26f5df 187 tCol=41; //Red Text
asreed 2:daceae26f5df 188 printf("\033[1;31m");
asreed 2:daceae26f5df 189 } else if (myData.ambientTemp < myData.lowTempThresh) {
asreed 2:daceae26f5df 190 tCol=44; // Blue text
asreed 2:daceae26f5df 191 printf("\033[1;34m");
asreed 2:daceae26f5df 192 } else {
asreed 2:daceae26f5df 193 tCol=42; // Green Text
asreed 2:daceae26f5df 194 printf("\033[1;32m");
asreed 2:daceae26f5df 195 }
asreed 2:daceae26f5df 196 sprintf(buffer, "Temperature is: %2.1fC ", myData.ambientTemp);
asreed 2:daceae26f5df 197 displayAt(1, 4, buffer);
asreed 2:daceae26f5df 198 printf("\033[0;37m");
asreed 2:daceae26f5df 199 sprintf(buffer, "%2.1fC ", myData.lowTempThresh);
asreed 2:daceae26f5df 200 displayAt(31, 4, buffer);
asreed 2:daceae26f5df 201 sprintf(buffer, "%2.1fC ", myData.highTempThresh);
asreed 2:daceae26f5df 202 displayAt(47, 4, buffer);
asreed 2:daceae26f5df 203 sprintf(buffer,"\033[%dm \033[40m", tCol);
asreed 2:daceae26f5df 204 displayAt(26, 4, buffer);
asreed 2:daceae26f5df 205
asreed 2:daceae26f5df 206 if (myData.ambientLight > myData.highLightThresh) {
asreed 2:daceae26f5df 207 lCol=41; //Red Text
asreed 2:daceae26f5df 208 printf("\033[1;31m");
asreed 2:daceae26f5df 209 } else if (myData.ambientLight < myData.lowLightThresh) {
asreed 2:daceae26f5df 210 lCol=44; // Blue text
asreed 2:daceae26f5df 211 printf("\033[1;34m");
asreed 2:daceae26f5df 212 } else {
asreed 2:daceae26f5df 213 lCol=42; // Green Text
asreed 2:daceae26f5df 214 printf("\033[1;32m");
asreed 2:daceae26f5df 215 }
asreed 2:daceae26f5df 216 sprintf( buffer, "Ambient Light is: %3.1f%c ", myData.ambientLight, '%' );
asreed 2:daceae26f5df 217 displayAt(1, 5, buffer);
asreed 2:daceae26f5df 218 sprintf(buffer,"\033[%dm \033[40m", lCol);
asreed 2:daceae26f5df 219 displayAt(26, 5, buffer);
asreed 2:daceae26f5df 220 printf("\033[0;37m");
asreed 2:daceae26f5df 221 sprintf(buffer, "%2.1f%c ", myData.lowLightThresh, 0x25);
asreed 2:daceae26f5df 222 displayAt(31, 5, buffer);
asreed 2:daceae26f5df 223 sprintf(buffer, "%2.1f%c ", myData.highLightThresh, 0x25);
asreed 2:daceae26f5df 224 displayAt(47, 5, buffer);
asreed 2:daceae26f5df 225 }
asreed 2:daceae26f5df 226
asreed 2:daceae26f5df 227 void displayAt( int x, int y, char *buffer )
asreed 2:daceae26f5df 228 {
asreed 2:daceae26f5df 229 if (allowUpdate) {
asreed 2:daceae26f5df 230 printf( "\033[%d;%dH%s", y, x, buffer);
asreed 2:daceae26f5df 231 fflush(stdout);
asreed 0:44f87c90421e 232 }
asreed 0:44f87c90421e 233 }
asreed 1:aef8ec8d23d8 234
asreed 2:daceae26f5df 235 void initialise()
asreed 2:daceae26f5df 236 {
asreed 2:daceae26f5df 237 printf("\033[2J\033[H"); // clear screen and move the cursor to 0, 0
asreed 2:daceae26f5df 238 printf("\033[?25l"); // Turn off visible cursor[?25 lower case L
asreed 2:daceae26f5df 239
asreed 2:daceae26f5df 240
asreed 2:daceae26f5df 241 /* what is the character set?
asreed 2:daceae26f5df 242
asreed 2:daceae26f5df 243 for (int i = 32; i < 255; i ++) {
asreed 2:daceae26f5df 244 printf(" %c ", i);
asreed 2:daceae26f5df 245 }
asreed 2:daceae26f5df 246 thread_sleep_for(10000);
asreed 2:daceae26f5df 247 */
asreed 2:daceae26f5df 248 printf("Environmental Control System");
asreed 2:daceae26f5df 249 printf( "\033[1;37m" );
asreed 2:daceae26f5df 250 printf("\033[3;28H\033[1;34mLow Threshold \033[1;31mHigh Threshold");
asreed 2:daceae26f5df 251 printf("\033[2;37m\033[16;1H* Press \"Space key\" to set threshold values\r\n");
asreed 2:daceae26f5df 252 printf(" Use \"Tab key\" to select each threshold setting\r\n");
asreed 2:daceae26f5df 253 printf(" Hit \"Enter key\" to store new threshold value");
asreed 2:daceae26f5df 254 fflush(stdout); // send the codes to the terminal
asreed 2:daceae26f5df 255 }