Temperature Control: NUCLEO-F334R8 + DS18B20 + LCD1602 shield + RELAY and see the results on the PC and on the LCD1602. For more info see here: http://www.emcu.it/NUCLEOevaBoards/mBed/QSG-Mbed-Library.pdf
Dependencies: DS1820 mbed TextLCD
Fork of F334andDS18B20 by
main.cpp@2:54ef8b27cbaa, 2015-12-27 (annotated)
- Committer:
- emcu
- Date:
- Sun Dec 27 01:37:03 2015 +0000
- Revision:
- 2:54ef8b27cbaa
- Parent:
- 1:5c2c3c1e5093
Temperature control based on:; NUCLEO-F334R8 ; DS18B20 ; RELAY module ; LCD1602 shield
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
emcu | 0:b6b929b7764c | 1 | /** |
emcu | 0:b6b929b7764c | 2 | |
emcu | 2:54ef8b27cbaa | 3 | Temperature control based on: |
emcu | 2:54ef8b27cbaa | 4 | NUCLEO-F334R8 |
emcu | 2:54ef8b27cbaa | 5 | DS18B20 |
emcu | 2:54ef8b27cbaa | 6 | RELAY module |
emcu | 2:54ef8b27cbaa | 7 | LCD1602 shield |
emcu | 2:54ef8b27cbaa | 8 | |
emcu | 0:b6b929b7764c | 9 | By: www.emcu.it |
emcu | 0:b6b929b7764c | 10 | Date: Dec.2015 |
emcu | 0:b6b929b7764c | 11 | Version: 1.0 |
emcu | 2:54ef8b27cbaa | 12 | Name: F334andDS18B20andLDC1602 |
emcu | 2:54ef8b27cbaa | 13 | NOTE: For more info see here: http://www.emcu.it/NUCLEOevaBoards/mBed/QSG-Mbed-Library.pdf |
emcu | 0:b6b929b7764c | 14 | |
emcu | 0:b6b929b7764c | 15 | THE SOFTWARE AND HARDWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
emcu | 0:b6b929b7764c | 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
emcu | 0:b6b929b7764c | 17 | FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS |
emcu | 0:b6b929b7764c | 18 | OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
emcu | 0:b6b929b7764c | 19 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
emcu | 0:b6b929b7764c | 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
emcu | 0:b6b929b7764c | 21 | |
emcu | 0:b6b929b7764c | 22 | UART Configuration (It is necessary for see the results, we suggest to use TeraTerm on PC) |
emcu | 0:b6b929b7764c | 23 | Baud Rate: 9600 |
emcu | 0:b6b929b7764c | 24 | Data Bit: 8 |
emcu | 0:b6b929b7764c | 25 | Parity: NONE |
emcu | 0:b6b929b7764c | 26 | Stop Bit: 1 |
emcu | 0:b6b929b7764c | 27 | Flow Control: NONE |
emcu | 0:b6b929b7764c | 28 | |
emcu | 0:b6b929b7764c | 29 | This SW is ready to use on the NUCLEO-F334R8. |
emcu | 2:54ef8b27cbaa | 30 | Connect to the NUCLEO-F334R8, the DS18B20 sensor (see the schematic below), the LCD1602 board and a RELAY board. |
emcu | 2:54ef8b27cbaa | 31 | The temperature sampling time is 200 msec, you change this parameter in the TempSamplingTime. |
emcu | 0:b6b929b7764c | 32 | |
emcu | 0:b6b929b7764c | 33 | DS18B20 front view |
emcu | 0:b6b929b7764c | 34 | __________ |
emcu | 0:b6b929b7764c | 35 | | | |
emcu | 0:b6b929b7764c | 36 | | DS | |
emcu | 0:b6b929b7764c | 37 | | 18B20 | |
emcu | 0:b6b929b7764c | 38 | | | |
emcu | 0:b6b929b7764c | 39 | |__________| |
emcu | 0:b6b929b7764c | 40 | | | | |
emcu | 0:b6b929b7764c | 41 | 1 2 3 |
emcu | 2:54ef8b27cbaa | 42 | GND DQ VCC (5V) |
emcu | 2:54ef8b27cbaa | 43 | | | |______________ to VCC (5V on the LCD1602 or on the NUCLEO-F334R8) |
emcu | 0:b6b929b7764c | 44 | | | _|_ |
emcu | 0:b6b929b7764c | 45 | | | | | |
emcu | 0:b6b929b7764c | 46 | | | | | 4K7 |
emcu | 0:b6b929b7764c | 47 | | | | | |
emcu | 0:b6b929b7764c | 48 | | | -|- |
emcu | 2:54ef8b27cbaa | 49 | | |___|______________ to A1 (on the LCD1602 board or on the NUCLEO-F334R8) |
emcu | 0:b6b929b7764c | 50 | | |
emcu | 0:b6b929b7764c | 51 | | |
emcu | 2:54ef8b27cbaa | 52 | |______________________ to GND (on the LCD1602 board or on the NUCLEO-F334R8) |
emcu | 0:b6b929b7764c | 53 | |
emcu | 2:54ef8b27cbaa | 54 | This SW is just for only one DS18B20 + LCD1602 board |
emcu | 0:b6b929b7764c | 55 | This SW is a derivative of:: https://developer.mbed.org/users/Sissors/code/DS1820_HelloWorld/ |
emcu | 0:b6b929b7764c | 56 | On the: https://developer.mbed.org/users/Sissors/code/DS1820_HelloWorld/ there is a multi sensor (DS18B20) example. |
emcu | 0:b6b929b7764c | 57 | |
emcu | 0:b6b929b7764c | 58 | */ |
emcu | 0:b6b929b7764c | 59 | |
emcu | 0:b6b929b7764c | 60 | |
emcu | 0:b6b929b7764c | 61 | // Below there is the Data Pin where is connected the: |
emcu | 0:b6b929b7764c | 62 | // pin.2 (DQ) of the DS18B20 |
emcu | 1:5c2c3c1e5093 | 63 | #define DATA_PIN A1 |
emcu | 0:b6b929b7764c | 64 | |
emcu | 0:b6b929b7764c | 65 | #include "mbed.h" |
emcu | 0:b6b929b7764c | 66 | #include "DS1820.h" |
emcu | 2:54ef8b27cbaa | 67 | #include "TextLCD.h" |
emcu | 2:54ef8b27cbaa | 68 | |
emcu | 2:54ef8b27cbaa | 69 | // Define the LED |
emcu | 2:54ef8b27cbaa | 70 | DigitalOut myled(LED1); |
emcu | 2:54ef8b27cbaa | 71 | DigitalOut RL1(A5); // Relè n.1 |
emcu | 0:b6b929b7764c | 72 | |
emcu | 0:b6b929b7764c | 73 | // Define the PC serial Port |
emcu | 0:b6b929b7764c | 74 | Serial pc(SERIAL_TX, SERIAL_RX); |
emcu | 0:b6b929b7764c | 75 | |
emcu | 0:b6b929b7764c | 76 | // Specify the pin of the NUCLEO-F334R8 where is connected |
emcu | 0:b6b929b7764c | 77 | // the pin.2 (DQ) of the DS18B20. |
emcu | 0:b6b929b7764c | 78 | DS1820 probe(DATA_PIN); |
emcu | 2:54ef8b27cbaa | 79 | |
emcu | 2:54ef8b27cbaa | 80 | // SetUp GPIO for drive the LCD |
emcu | 2:54ef8b27cbaa | 81 | // LCD (RS, E, D4, D5, D6, D7) |
emcu | 2:54ef8b27cbaa | 82 | TextLCD lcd(PA_9, PC_7, PB_5, PB_4, PB_10, PA_8); // LCD Shield for Arduino |
emcu | 2:54ef8b27cbaa | 83 | AnalogIn button(PA_0); // board button |
emcu | 2:54ef8b27cbaa | 84 | PwmOut backlight(PB_6); |
emcu | 2:54ef8b27cbaa | 85 | |
emcu | 2:54ef8b27cbaa | 86 | // COSTANTs |
emcu | 2:54ef8b27cbaa | 87 | #define ON 1 |
emcu | 2:54ef8b27cbaa | 88 | #define OFF 0 |
emcu | 2:54ef8b27cbaa | 89 | #define tStep 0.1 // Step minimo di Up e Down x le impostazioni dei valori |
emcu | 2:54ef8b27cbaa | 90 | #define tUp 1 |
emcu | 2:54ef8b27cbaa | 91 | #define tDown 2 |
emcu | 2:54ef8b27cbaa | 92 | #define tRigth 3 |
emcu | 2:54ef8b27cbaa | 93 | #define tLeft 4 |
emcu | 2:54ef8b27cbaa | 94 | #define tNone 5 |
emcu | 2:54ef8b27cbaa | 95 | #define NumConv 4 |
emcu | 2:54ef8b27cbaa | 96 | #define MaxError 30 |
emcu | 2:54ef8b27cbaa | 97 | #define TastoSU 15000 |
emcu | 2:54ef8b27cbaa | 98 | #define TastoGIU 30900 |
emcu | 2:54ef8b27cbaa | 99 | #define TastoDES DeltaTasti + 2 |
emcu | 2:54ef8b27cbaa | 100 | #define TastoSIN 48000 |
emcu | 2:54ef8b27cbaa | 101 | #define DeltaTasti 4000 |
emcu | 2:54ef8b27cbaa | 102 | #define TempSamplingTime 200 |
emcu | 2:54ef8b27cbaa | 103 | |
emcu | 2:54ef8b27cbaa | 104 | // VARIABLEs |
emcu | 2:54ef8b27cbaa | 105 | uint8_t n = 0; |
emcu | 2:54ef8b27cbaa | 106 | uint8_t FlashSeg = 0; |
emcu | 2:54ef8b27cbaa | 107 | uint8_t rele = OFF; |
emcu | 2:54ef8b27cbaa | 108 | float temperature = 0; |
emcu | 2:54ef8b27cbaa | 109 | float DeltaTemp = 0.5; |
emcu | 2:54ef8b27cbaa | 110 | float tempON = 20.00; |
emcu | 2:54ef8b27cbaa | 111 | float tempOFF = tempON + DeltaTemp; |
emcu | 2:54ef8b27cbaa | 112 | float temperaturePREVIOUS = 0; |
emcu | 2:54ef8b27cbaa | 113 | float temperatureMAX = 0; |
emcu | 2:54ef8b27cbaa | 114 | float temperatureMIN = 0; |
emcu | 2:54ef8b27cbaa | 115 | float MaxTempError = 0; |
emcu | 2:54ef8b27cbaa | 116 | unsigned long value = 0; |
emcu | 2:54ef8b27cbaa | 117 | uint8_t LastButtonPressed = tNone; |
emcu | 2:54ef8b27cbaa | 118 | |
emcu | 2:54ef8b27cbaa | 119 | // FUNCTIONs |
emcu | 2:54ef8b27cbaa | 120 | void CalcMed(void); |
emcu | 2:54ef8b27cbaa | 121 | void PrintTemperatures(void); |
emcu | 2:54ef8b27cbaa | 122 | uint8_t ReadButtonOnLCD1602(void); |
emcu | 2:54ef8b27cbaa | 123 | void SetUp(void); |
emcu | 2:54ef8b27cbaa | 124 | void ShowSetUp(void); |
emcu | 2:54ef8b27cbaa | 125 | void WaitingRightButton(void); |
emcu | 2:54ef8b27cbaa | 126 | |
emcu | 2:54ef8b27cbaa | 127 | |
emcu | 0:b6b929b7764c | 128 | int main() |
emcu | 0:b6b929b7764c | 129 | { |
emcu | 2:54ef8b27cbaa | 130 | |
emcu | 2:54ef8b27cbaa | 131 | // SetUp the resolution of the DS18B20 to 12bit |
emcu | 2:54ef8b27cbaa | 132 | probe.setResolution(12); |
emcu | 2:54ef8b27cbaa | 133 | |
emcu | 2:54ef8b27cbaa | 134 | // StartUp Logo to the PC |
emcu | 2:54ef8b27cbaa | 135 | pc.printf("\r\n\r\nTemperature Control made using:\n\r"); |
emcu | 2:54ef8b27cbaa | 136 | pc.printf("NUCLEO-F334R8 + DS18B20 (input on A1) + LCD1602 + RELAY (output on A5).\n\r"); |
emcu | 2:54ef8b27cbaa | 137 | pc.printf("For more info look here:\n\r"); |
emcu | 2:54ef8b27cbaa | 138 | pc.printf(" http://www.emcu.it/NUCLEOevaBoards/mBed/QSG-Mbed-Library.pdf\n\r"); |
emcu | 2:54ef8b27cbaa | 139 | pc.printf("by: www.emcu.it\n\r\n\r"); |
emcu | 2:54ef8b27cbaa | 140 | |
emcu | 2:54ef8b27cbaa | 141 | // TurnOn the LCD backlight of the LCD1602 board |
emcu | 2:54ef8b27cbaa | 142 | backlight = ON; // ON: 1, OFF: 0 |
emcu | 2:54ef8b27cbaa | 143 | |
emcu | 2:54ef8b27cbaa | 144 | // StartUp Logo to the LCD1602 board |
emcu | 2:54ef8b27cbaa | 145 | lcd.cls(); |
emcu | 2:54ef8b27cbaa | 146 | lcd.locate(0,0); |
emcu | 2:54ef8b27cbaa | 147 | lcd.printf("By: www.emcu.it"); |
emcu | 2:54ef8b27cbaa | 148 | lcd.locate(0,1); |
emcu | 2:54ef8b27cbaa | 149 | lcd.printf("Ver.1.0"); |
emcu | 2:54ef8b27cbaa | 150 | |
emcu | 2:54ef8b27cbaa | 151 | // SetUp the temperatures after PowerOn |
emcu | 2:54ef8b27cbaa | 152 | probe.convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until ready |
emcu | 2:54ef8b27cbaa | 153 | temperature = probe.temperature('c'); |
emcu | 2:54ef8b27cbaa | 154 | // Eliminate the wrong reading |
emcu | 2:54ef8b27cbaa | 155 | CalcMed(); |
emcu | 2:54ef8b27cbaa | 156 | temperaturePREVIOUS = temperature; |
emcu | 2:54ef8b27cbaa | 157 | temperatureMAX = temperature; |
emcu | 2:54ef8b27cbaa | 158 | temperatureMIN = 50.50; |
emcu | 2:54ef8b27cbaa | 159 | wait(1); |
emcu | 2:54ef8b27cbaa | 160 | |
emcu | 0:b6b929b7764c | 161 | while(1) |
emcu | 0:b6b929b7764c | 162 | { |
emcu | 2:54ef8b27cbaa | 163 | // READ BUTTON on LCD board +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
emcu | 2:54ef8b27cbaa | 164 | if (ReadButtonOnLCD1602() == tUp) |
emcu | 2:54ef8b27cbaa | 165 | backlight = ON; |
emcu | 2:54ef8b27cbaa | 166 | else if (ReadButtonOnLCD1602() == tDown) |
emcu | 2:54ef8b27cbaa | 167 | backlight = OFF; |
emcu | 2:54ef8b27cbaa | 168 | else if (ReadButtonOnLCD1602() == tRigth) |
emcu | 2:54ef8b27cbaa | 169 | ShowSetUp(); |
emcu | 2:54ef8b27cbaa | 170 | else if (ReadButtonOnLCD1602() == tLeft) |
emcu | 2:54ef8b27cbaa | 171 | SetUp(); |
emcu | 2:54ef8b27cbaa | 172 | else; |
emcu | 2:54ef8b27cbaa | 173 | // END READ BUTTON on LCD board +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
emcu | 2:54ef8b27cbaa | 174 | |
emcu | 2:54ef8b27cbaa | 175 | // READ and DISPLAY the TEMPERATURE +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
emcu | 2:54ef8b27cbaa | 176 | probe.convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until ready |
emcu | 2:54ef8b27cbaa | 177 | temperature = probe.temperature('c'); |
emcu | 2:54ef8b27cbaa | 178 | wait_ms(TempSamplingTime); |
emcu | 2:54ef8b27cbaa | 179 | // Eliminate the wrong reading |
emcu | 2:54ef8b27cbaa | 180 | CalcMed(); |
emcu | 2:54ef8b27cbaa | 181 | |
emcu | 2:54ef8b27cbaa | 182 | // ON/OFF Relè |
emcu | 2:54ef8b27cbaa | 183 | if (temperature <= tempON) // ON Relè |
emcu | 2:54ef8b27cbaa | 184 | { |
emcu | 2:54ef8b27cbaa | 185 | rele = ON; |
emcu | 2:54ef8b27cbaa | 186 | RL1 = 1; |
emcu | 2:54ef8b27cbaa | 187 | } |
emcu | 2:54ef8b27cbaa | 188 | else if (temperature >= tempOFF) // OFF Relè |
emcu | 2:54ef8b27cbaa | 189 | { |
emcu | 2:54ef8b27cbaa | 190 | rele = OFF; |
emcu | 2:54ef8b27cbaa | 191 | RL1 = 0; |
emcu | 2:54ef8b27cbaa | 192 | } |
emcu | 2:54ef8b27cbaa | 193 | |
emcu | 2:54ef8b27cbaa | 194 | // pc.printf("The Temperature is %2.3f Celsius/Centigradi\r\n", temperature); |
emcu | 2:54ef8b27cbaa | 195 | PrintTemperatures(); |
emcu | 2:54ef8b27cbaa | 196 | |
emcu | 2:54ef8b27cbaa | 197 | // Display Status on the LCD1602 board |
emcu | 2:54ef8b27cbaa | 198 | lcd.cls(); |
emcu | 2:54ef8b27cbaa | 199 | lcd.locate(0,0); |
emcu | 2:54ef8b27cbaa | 200 | if (rele == ON) |
emcu | 2:54ef8b27cbaa | 201 | lcd.printf("T %2.3f RELEon ", temperature); // probe.temperature('c')); |
emcu | 2:54ef8b27cbaa | 202 | if (rele == OFF) |
emcu | 2:54ef8b27cbaa | 203 | lcd.printf("T %2.3f RELEoff", temperature); // probe.temperature('c')); |
emcu | 2:54ef8b27cbaa | 204 | lcd.locate(0,1); |
emcu | 2:54ef8b27cbaa | 205 | lcd.printf("TM%2.3fTm%2.3f", temperatureMAX, temperatureMIN); |
emcu | 2:54ef8b27cbaa | 206 | // END READ and DISPLAY the TEMPERATURE +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
emcu | 2:54ef8b27cbaa | 207 | |
emcu | 2:54ef8b27cbaa | 208 | // START Flashing bar on the LCD ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
emcu | 2:54ef8b27cbaa | 209 | FlashSeg++; |
emcu | 2:54ef8b27cbaa | 210 | if (FlashSeg == 1) |
emcu | 2:54ef8b27cbaa | 211 | { |
emcu | 2:54ef8b27cbaa | 212 | lcd.locate(8,0); |
emcu | 2:54ef8b27cbaa | 213 | lcd.printf(" "); |
emcu | 2:54ef8b27cbaa | 214 | } |
emcu | 2:54ef8b27cbaa | 215 | if (FlashSeg == 2) |
emcu | 2:54ef8b27cbaa | 216 | { |
emcu | 2:54ef8b27cbaa | 217 | lcd.locate(8,0); |
emcu | 2:54ef8b27cbaa | 218 | lcd.printf("*"); |
emcu | 2:54ef8b27cbaa | 219 | FlashSeg = 0; |
emcu | 2:54ef8b27cbaa | 220 | } |
emcu | 2:54ef8b27cbaa | 221 | // END START Flashing bar on the LCD ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
emcu | 2:54ef8b27cbaa | 222 | |
emcu | 0:b6b929b7764c | 223 | } |
emcu | 0:b6b929b7764c | 224 | } |
emcu | 0:b6b929b7764c | 225 | |
emcu | 0:b6b929b7764c | 226 | |
emcu | 2:54ef8b27cbaa | 227 | /* |
emcu | 2:54ef8b27cbaa | 228 | **** ShowSetUp |
emcu | 2:54ef8b27cbaa | 229 | This function use the global variable: |
emcu | 2:54ef8b27cbaa | 230 | tempON |
emcu | 2:54ef8b27cbaa | 231 | tempOFF |
emcu | 2:54ef8b27cbaa | 232 | */ |
emcu | 2:54ef8b27cbaa | 233 | void ShowSetUp(void) |
emcu | 2:54ef8b27cbaa | 234 | { |
emcu | 2:54ef8b27cbaa | 235 | // TurnOn the LCD backlight of the LCD1602 board |
emcu | 2:54ef8b27cbaa | 236 | backlight = ON; // ON: 1, OFF: 0 |
emcu | 2:54ef8b27cbaa | 237 | |
emcu | 2:54ef8b27cbaa | 238 | // Show the SetUp related to: |
emcu | 2:54ef8b27cbaa | 239 | // TempMin (tempON) & TempMax (tempOFF) |
emcu | 2:54ef8b27cbaa | 240 | lcd.cls(); |
emcu | 2:54ef8b27cbaa | 241 | lcd.locate(0,0); |
emcu | 2:54ef8b27cbaa | 242 | lcd.printf("Tm%2.2f TM%2.2f ", tempON, tempOFF); |
emcu | 2:54ef8b27cbaa | 243 | WaitingRightButton(); |
emcu | 2:54ef8b27cbaa | 244 | |
emcu | 2:54ef8b27cbaa | 245 | lcd.cls(); |
emcu | 2:54ef8b27cbaa | 246 | lcd.locate(0,0); |
emcu | 2:54ef8b27cbaa | 247 | lcd.printf("LEFT SetUp Menu "); |
emcu | 2:54ef8b27cbaa | 248 | WaitingRightButton(); |
emcu | 2:54ef8b27cbaa | 249 | |
emcu | 2:54ef8b27cbaa | 250 | lcd.cls(); |
emcu | 2:54ef8b27cbaa | 251 | lcd.locate(0,0); |
emcu | 2:54ef8b27cbaa | 252 | lcd.printf("By: www.emcu.it "); |
emcu | 2:54ef8b27cbaa | 253 | WaitingRightButton(); |
emcu | 2:54ef8b27cbaa | 254 | |
emcu | 2:54ef8b27cbaa | 255 | lcd.cls(); |
emcu | 2:54ef8b27cbaa | 256 | lcd.locate(0,0); |
emcu | 2:54ef8b27cbaa | 257 | lcd.printf("By patient.... ", tempON, tempOFF); |
emcu | 2:54ef8b27cbaa | 258 | } |
emcu | 2:54ef8b27cbaa | 259 | |
emcu | 2:54ef8b27cbaa | 260 | |
emcu | 2:54ef8b27cbaa | 261 | /* |
emcu | 2:54ef8b27cbaa | 262 | **** WaitingRightButton |
emcu | 2:54ef8b27cbaa | 263 | This function waiting the Release and Pressure of the Rirght Button |
emcu | 2:54ef8b27cbaa | 264 | */ |
emcu | 2:54ef8b27cbaa | 265 | void WaitingRightButton(void) |
emcu | 2:54ef8b27cbaa | 266 | { |
emcu | 2:54ef8b27cbaa | 267 | // Awaiting the release of the Right Button |
emcu | 2:54ef8b27cbaa | 268 | lcd.locate(0,1); |
emcu | 2:54ef8b27cbaa | 269 | lcd.printf("Release RIGHT bu"); |
emcu | 2:54ef8b27cbaa | 270 | while (ReadButtonOnLCD1602() == tRigth); |
emcu | 2:54ef8b27cbaa | 271 | wait_ms(100); |
emcu | 2:54ef8b27cbaa | 272 | // Awaiting the pressure of the Rigth Button |
emcu | 2:54ef8b27cbaa | 273 | lcd.locate(0,1); |
emcu | 2:54ef8b27cbaa | 274 | lcd.printf("Press RIGTH but."); |
emcu | 2:54ef8b27cbaa | 275 | while (ReadButtonOnLCD1602() != tRigth); |
emcu | 2:54ef8b27cbaa | 276 | } |
emcu | 2:54ef8b27cbaa | 277 | |
emcu | 2:54ef8b27cbaa | 278 | |
emcu | 2:54ef8b27cbaa | 279 | /* |
emcu | 2:54ef8b27cbaa | 280 | **** SetUp |
emcu | 2:54ef8b27cbaa | 281 | This function use the global variable: |
emcu | 2:54ef8b27cbaa | 282 | tempON |
emcu | 2:54ef8b27cbaa | 283 | tempOFF |
emcu | 2:54ef8b27cbaa | 284 | This function use this definitions: |
emcu | 2:54ef8b27cbaa | 285 | tUp |
emcu | 2:54ef8b27cbaa | 286 | tDown |
emcu | 2:54ef8b27cbaa | 287 | tRigth |
emcu | 2:54ef8b27cbaa | 288 | tLeft |
emcu | 2:54ef8b27cbaa | 289 | */ |
emcu | 2:54ef8b27cbaa | 290 | void SetUp(void) |
emcu | 2:54ef8b27cbaa | 291 | { |
emcu | 2:54ef8b27cbaa | 292 | // TurnOn the LCD backlight of the LCD1602 board |
emcu | 2:54ef8b27cbaa | 293 | backlight = ON; // ON: 1, OFF: 0 |
emcu | 2:54ef8b27cbaa | 294 | |
emcu | 2:54ef8b27cbaa | 295 | // Show the SetUp related to: |
emcu | 2:54ef8b27cbaa | 296 | // TempMin (tempON) & TempMax (tempOFF) |
emcu | 2:54ef8b27cbaa | 297 | lcd.cls(); |
emcu | 2:54ef8b27cbaa | 298 | lcd.locate(0,0); |
emcu | 2:54ef8b27cbaa | 299 | lcd.printf("Tm%2.2f TM%2.2f ", tempON, tempOFF); |
emcu | 2:54ef8b27cbaa | 300 | |
emcu | 2:54ef8b27cbaa | 301 | // Awaiting the release of the Left Button |
emcu | 2:54ef8b27cbaa | 302 | lcd.locate(0,1); |
emcu | 2:54ef8b27cbaa | 303 | lcd.printf("Release LEFT but"); |
emcu | 2:54ef8b27cbaa | 304 | while (ReadButtonOnLCD1602() == tLeft); |
emcu | 2:54ef8b27cbaa | 305 | wait_ms(100); |
emcu | 2:54ef8b27cbaa | 306 | // Awaiting the pressure of the Left Button |
emcu | 2:54ef8b27cbaa | 307 | lcd.locate(0,1); |
emcu | 2:54ef8b27cbaa | 308 | lcd.printf("Press LEFT butt."); |
emcu | 2:54ef8b27cbaa | 309 | // Awaiting the release of the Left Button |
emcu | 2:54ef8b27cbaa | 310 | while (ReadButtonOnLCD1602() != tLeft); |
emcu | 2:54ef8b27cbaa | 311 | |
emcu | 2:54ef8b27cbaa | 312 | // Menù for SetUp the TempMin (tempON) |
emcu | 2:54ef8b27cbaa | 313 | lcd.cls(); |
emcu | 2:54ef8b27cbaa | 314 | lcd.locate(0,0); |
emcu | 2:54ef8b27cbaa | 315 | lcd.printf("TempMin %2.2f", tempON); |
emcu | 2:54ef8b27cbaa | 316 | lcd.locate(0,1); |
emcu | 2:54ef8b27cbaa | 317 | lcd.printf("UP DOWN RIGHT"); |
emcu | 2:54ef8b27cbaa | 318 | // Awaiting the pressure of Right Button to finish this part |
emcu | 2:54ef8b27cbaa | 319 | while (ReadButtonOnLCD1602() != tRigth) |
emcu | 2:54ef8b27cbaa | 320 | { |
emcu | 2:54ef8b27cbaa | 321 | // Increase value |
emcu | 2:54ef8b27cbaa | 322 | if (ReadButtonOnLCD1602() == tUp) |
emcu | 2:54ef8b27cbaa | 323 | { |
emcu | 2:54ef8b27cbaa | 324 | tempON = tempON + float(tStep); |
emcu | 2:54ef8b27cbaa | 325 | // Awaiting the release of the tUp Button |
emcu | 2:54ef8b27cbaa | 326 | while (ReadButtonOnLCD1602() == tUp); |
emcu | 2:54ef8b27cbaa | 327 | } |
emcu | 2:54ef8b27cbaa | 328 | // Decrease value |
emcu | 2:54ef8b27cbaa | 329 | if (ReadButtonOnLCD1602() == tDown) |
emcu | 2:54ef8b27cbaa | 330 | { |
emcu | 2:54ef8b27cbaa | 331 | tempON = tempON - float(tStep); |
emcu | 2:54ef8b27cbaa | 332 | // Awaiting the release of the tDown Button |
emcu | 2:54ef8b27cbaa | 333 | while (ReadButtonOnLCD1602() == tDown); |
emcu | 2:54ef8b27cbaa | 334 | } |
emcu | 2:54ef8b27cbaa | 335 | lcd.locate(0,0); |
emcu | 2:54ef8b27cbaa | 336 | lcd.printf("TempMin %2.2f", tempON); |
emcu | 2:54ef8b27cbaa | 337 | } |
emcu | 2:54ef8b27cbaa | 338 | lcd.locate(0,1); |
emcu | 2:54ef8b27cbaa | 339 | lcd.printf("Release RIGHT"); |
emcu | 2:54ef8b27cbaa | 340 | // Awaiting the release of the tRight Button |
emcu | 2:54ef8b27cbaa | 341 | while (ReadButtonOnLCD1602() == tRigth); |
emcu | 2:54ef8b27cbaa | 342 | wait_ms(100); |
emcu | 2:54ef8b27cbaa | 343 | |
emcu | 2:54ef8b27cbaa | 344 | // Menù for SetUp the TempMax (tempOFF) |
emcu | 2:54ef8b27cbaa | 345 | if (tempOFF <= tempON) |
emcu | 2:54ef8b27cbaa | 346 | tempOFF = tempON + float(tStep) + float(tStep); |
emcu | 2:54ef8b27cbaa | 347 | lcd.cls(); |
emcu | 2:54ef8b27cbaa | 348 | lcd.locate(0,0); |
emcu | 2:54ef8b27cbaa | 349 | lcd.printf("TempMax %2.2f", tempOFF); |
emcu | 2:54ef8b27cbaa | 350 | lcd.locate(0,1); |
emcu | 2:54ef8b27cbaa | 351 | lcd.printf("UP DOWN LEFT"); |
emcu | 2:54ef8b27cbaa | 352 | // Awaiting the pressure of Left Button to finish this part |
emcu | 2:54ef8b27cbaa | 353 | while (ReadButtonOnLCD1602() != tLeft) |
emcu | 2:54ef8b27cbaa | 354 | { |
emcu | 2:54ef8b27cbaa | 355 | // Increase value |
emcu | 2:54ef8b27cbaa | 356 | if (ReadButtonOnLCD1602() == tUp) |
emcu | 2:54ef8b27cbaa | 357 | { |
emcu | 2:54ef8b27cbaa | 358 | tempOFF = tempOFF + float(tStep); |
emcu | 2:54ef8b27cbaa | 359 | // Awaiting the release of the tUp Button |
emcu | 2:54ef8b27cbaa | 360 | while (ReadButtonOnLCD1602() == tUp); |
emcu | 2:54ef8b27cbaa | 361 | } |
emcu | 2:54ef8b27cbaa | 362 | // Decrease value |
emcu | 2:54ef8b27cbaa | 363 | if (ReadButtonOnLCD1602() == tDown) |
emcu | 2:54ef8b27cbaa | 364 | { |
emcu | 2:54ef8b27cbaa | 365 | tempOFF = tempOFF - float(tStep); |
emcu | 2:54ef8b27cbaa | 366 | // Awaiting the release of the tDown Button |
emcu | 2:54ef8b27cbaa | 367 | while (ReadButtonOnLCD1602() == tDown); |
emcu | 2:54ef8b27cbaa | 368 | } |
emcu | 2:54ef8b27cbaa | 369 | lcd.locate(0,0); |
emcu | 2:54ef8b27cbaa | 370 | lcd.printf("TempMax %2.2f", tempOFF); |
emcu | 2:54ef8b27cbaa | 371 | } |
emcu | 2:54ef8b27cbaa | 372 | // Awaiting the release of the tLeft Button |
emcu | 2:54ef8b27cbaa | 373 | lcd.locate(0,1); |
emcu | 2:54ef8b27cbaa | 374 | lcd.printf("Release LEFT but"); |
emcu | 2:54ef8b27cbaa | 375 | while (ReadButtonOnLCD1602() == tLeft); |
emcu | 2:54ef8b27cbaa | 376 | |
emcu | 2:54ef8b27cbaa | 377 | lcd.cls(); |
emcu | 2:54ef8b27cbaa | 378 | lcd.locate(0,0); |
emcu | 2:54ef8b27cbaa | 379 | lcd.printf("By patient.... ", tempON, tempOFF); |
emcu | 2:54ef8b27cbaa | 380 | |
emcu | 2:54ef8b27cbaa | 381 | return; |
emcu | 2:54ef8b27cbaa | 382 | } |
emcu | 2:54ef8b27cbaa | 383 | |
emcu | 2:54ef8b27cbaa | 384 | |
emcu | 2:54ef8b27cbaa | 385 | /* |
emcu | 2:54ef8b27cbaa | 386 | **** ReadButtonOnLCD1602 |
emcu | 2:54ef8b27cbaa | 387 | This function Read the button on the LCD1620 |
emcu | 2:54ef8b27cbaa | 388 | This function use the global variable: |
emcu | 2:54ef8b27cbaa | 389 | value |
emcu | 2:54ef8b27cbaa | 390 | LastButtonPressed |
emcu | 2:54ef8b27cbaa | 391 | This function use this definitions: |
emcu | 2:54ef8b27cbaa | 392 | TastoSU |
emcu | 2:54ef8b27cbaa | 393 | TastoGIU |
emcu | 2:54ef8b27cbaa | 394 | TastoDES |
emcu | 2:54ef8b27cbaa | 395 | TastoSIN |
emcu | 2:54ef8b27cbaa | 396 | DeltaTasti |
emcu | 2:54ef8b27cbaa | 397 | tUp |
emcu | 2:54ef8b27cbaa | 398 | tDown |
emcu | 2:54ef8b27cbaa | 399 | tRigth |
emcu | 2:54ef8b27cbaa | 400 | tLeft |
emcu | 2:54ef8b27cbaa | 401 | tNone |
emcu | 2:54ef8b27cbaa | 402 | */ |
emcu | 2:54ef8b27cbaa | 403 | uint8_t ReadButtonOnLCD1602(void) |
emcu | 2:54ef8b27cbaa | 404 | { |
emcu | 2:54ef8b27cbaa | 405 | value = button.read_u16(); |
emcu | 2:54ef8b27cbaa | 406 | // pc.printf("Button value = %d\n\r",value); |
emcu | 2:54ef8b27cbaa | 407 | |
emcu | 2:54ef8b27cbaa | 408 | if (value < (TastoSU + DeltaTasti) && value > (TastoSU - DeltaTasti)) // Button UP |
emcu | 2:54ef8b27cbaa | 409 | { |
emcu | 2:54ef8b27cbaa | 410 | // pc.printf("UP\n\r"); |
emcu | 2:54ef8b27cbaa | 411 | return tUp; |
emcu | 2:54ef8b27cbaa | 412 | } |
emcu | 2:54ef8b27cbaa | 413 | else if (value < (TastoGIU + DeltaTasti) && value > (TastoGIU - DeltaTasti)) // Button DOWN |
emcu | 2:54ef8b27cbaa | 414 | { |
emcu | 2:54ef8b27cbaa | 415 | // pc.printf("DOWN\n\r"); |
emcu | 2:54ef8b27cbaa | 416 | return tDown; |
emcu | 2:54ef8b27cbaa | 417 | } |
emcu | 2:54ef8b27cbaa | 418 | else if (value < (TastoDES + DeltaTasti) && value <= (TastoDES - DeltaTasti)) // Button RIGHT |
emcu | 2:54ef8b27cbaa | 419 | { |
emcu | 2:54ef8b27cbaa | 420 | // pc.printf("RIGHT\n\r"); |
emcu | 2:54ef8b27cbaa | 421 | return tRigth; |
emcu | 2:54ef8b27cbaa | 422 | } |
emcu | 2:54ef8b27cbaa | 423 | else if (value < (TastoSIN + DeltaTasti) && value > (TastoSIN - DeltaTasti)) // Button LEFT |
emcu | 2:54ef8b27cbaa | 424 | { |
emcu | 2:54ef8b27cbaa | 425 | // pc.printf("LEFT\n\r"); |
emcu | 2:54ef8b27cbaa | 426 | return tLeft; |
emcu | 2:54ef8b27cbaa | 427 | } |
emcu | 2:54ef8b27cbaa | 428 | else |
emcu | 2:54ef8b27cbaa | 429 | return tNone; |
emcu | 2:54ef8b27cbaa | 430 | } |
emcu | 2:54ef8b27cbaa | 431 | |
emcu | 2:54ef8b27cbaa | 432 | |
emcu | 2:54ef8b27cbaa | 433 | /* |
emcu | 2:54ef8b27cbaa | 434 | This function is use for eliminate the wrong reading and |
emcu | 2:54ef8b27cbaa | 435 | for setup the MAX and MIN temperature we have read. |
emcu | 2:54ef8b27cbaa | 436 | This function use the global variable: |
emcu | 2:54ef8b27cbaa | 437 | temperature |
emcu | 2:54ef8b27cbaa | 438 | MaxTempError |
emcu | 2:54ef8b27cbaa | 439 | temperaturePREVIOUS |
emcu | 2:54ef8b27cbaa | 440 | temperatureMAX |
emcu | 2:54ef8b27cbaa | 441 | temperatureMIN |
emcu | 2:54ef8b27cbaa | 442 | This function use this definition: |
emcu | 2:54ef8b27cbaa | 443 | MaxError |
emcu | 2:54ef8b27cbaa | 444 | */ |
emcu | 2:54ef8b27cbaa | 445 | void CalcMed(void) |
emcu | 2:54ef8b27cbaa | 446 | { |
emcu | 2:54ef8b27cbaa | 447 | // Remove a measure that exceed the +- MaxError |
emcu | 2:54ef8b27cbaa | 448 | MaxTempError = (temperature * MaxError) / 100; |
emcu | 2:54ef8b27cbaa | 449 | if (temperature > (temperature + MaxTempError)) |
emcu | 2:54ef8b27cbaa | 450 | temperature = temperaturePREVIOUS; |
emcu | 2:54ef8b27cbaa | 451 | else if (temperature < (temperature - MaxTempError)) |
emcu | 2:54ef8b27cbaa | 452 | temperature = temperaturePREVIOUS; |
emcu | 2:54ef8b27cbaa | 453 | else |
emcu | 2:54ef8b27cbaa | 454 | temperaturePREVIOUS = temperature; |
emcu | 2:54ef8b27cbaa | 455 | |
emcu | 2:54ef8b27cbaa | 456 | // SetUp the Max and Min temperature measured |
emcu | 2:54ef8b27cbaa | 457 | if (temperature > temperatureMAX) |
emcu | 2:54ef8b27cbaa | 458 | temperatureMAX = temperature; |
emcu | 2:54ef8b27cbaa | 459 | if (temperature < temperatureMIN) |
emcu | 2:54ef8b27cbaa | 460 | temperatureMIN = temperature; |
emcu | 2:54ef8b27cbaa | 461 | } |
emcu | 2:54ef8b27cbaa | 462 | |
emcu | 2:54ef8b27cbaa | 463 | |
emcu | 2:54ef8b27cbaa | 464 | /* |
emcu | 2:54ef8b27cbaa | 465 | This function Display temperatures on the PC |
emcu | 2:54ef8b27cbaa | 466 | */ |
emcu | 2:54ef8b27cbaa | 467 | void PrintTemperatures(void) |
emcu | 2:54ef8b27cbaa | 468 | { |
emcu | 2:54ef8b27cbaa | 469 | pc.printf("TEMPERATURE =====> %2.3f Centigrade/Centigradi\r\n", temperature); |
emcu | 2:54ef8b27cbaa | 470 | // pc.printf("DeltaTemp = %2.3f\r\n", DeltaTemp); |
emcu | 2:54ef8b27cbaa | 471 | pc.printf("tempON = %2.3f\r\n", tempON); |
emcu | 2:54ef8b27cbaa | 472 | pc.printf("tempOFF = %2.3f\r\n", tempOFF); |
emcu | 2:54ef8b27cbaa | 473 | pc.printf("RELE' is = %d\r\n", rele); |
emcu | 2:54ef8b27cbaa | 474 | pc.printf("MaxTempError = %2.3f\r\n", MaxTempError); |
emcu | 2:54ef8b27cbaa | 475 | pc.printf("temperaturePREVIOUS = %2.3f\r\n", temperaturePREVIOUS); |
emcu | 2:54ef8b27cbaa | 476 | pc.printf("temperatureMAX = %2.3f\r\n", temperatureMAX); |
emcu | 2:54ef8b27cbaa | 477 | pc.printf("temperatureMIN = %2.3f\r\n\r\n", temperatureMIN); |
emcu | 2:54ef8b27cbaa | 478 | } |