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 Enrico Marinoni

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?

UserRevisionLine numberNew 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 }