Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@4:7677c7a54d19, 2021-01-08 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |