-
Notifications
You must be signed in to change notification settings - Fork 0
/
LCD_TEMP.ino
117 lines (108 loc) · 3.59 KB
/
LCD_TEMP.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <LiquidCrystal.h> // Contains LiquidCrystal Library
#include <FlexiTimer2.h> // Contains FlexiTimer2 Library
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int tempPin = 4; // define the pin of temperature sensor
float tempVal; // define a variable to store temperature value
int hour, minute, second; // define variables stored record time
void setup() {
lcd.begin(16, 2); // set up the LCD's number of columns and rows
startingAnimation(); // display a dynamic start screen
FlexiTimer2::set(1000, timerInt); // configure the timer and interrupt function
FlexiTimer2::start(); // start timer
Serial.begin(9600); // initialize serial port with baud rate 9600
Serial.println("UNO is ready!"); // print the string "UNO is ready!"
Serial.println("Input hour,minute,second to set time.");
}
void loop() {
// Get temperature
tempVal = getTemp();
if (second >= 60) { // when seconds is equal to 60, minutes plus 1
second = 0;
minute++;
if (minute >= 60) { // when minutes is equal to 60, hours plus 1
minute = 0;
hour++;
if (hour >= 24) { // when hours is equal to 24, hours turn to zero
hour = 0;
}
}
}
lcdDisplay(); // display temperature and time information on LCD
delay(200);
}
void startingAnimation() {
for (int i = 0; i < 16; i++) {
lcd.scrollDisplayRight();
}
lcd.print("starting...");
for (int i = 0; i < 16; i++) {
lcd.scrollDisplayLeft();
delay(300);
}
lcd.clear();
}
// the timer interrupt function of FlexiTimer2 is executed every 1s
void timerInt() {
second++; // second plus 1
}
// serial port interrupt function
void serialEvent() {
int inInt[3]; // define an array to save the received serial data
while (Serial.available()) {
for (int i = 0; i < 3; i++) {
inInt[i] = Serial.parseInt(); // receive 3 integer data
}
// print the received data for confirmation
Serial.print("Your input is: ");
Serial.print(inInt[0]);
Serial.print(", ");
Serial.print(inInt[1]);
Serial.print(", ");
Serial.println(inInt[2]);
// use received data to adjust time
hour = inInt[0];
minute = inInt[1];
second = inInt[2];
// print the modified time
Serial.print("Time now is: ");
Serial.print(hour / 10);
Serial.print(hour % 10);
Serial.print(':');
Serial.print(minute / 10);
Serial.print(minute % 10);
Serial.print(':');
Serial.print(second / 10);
Serial.println(second % 10);
}
}
// function used by LCD1602 to display time and temperature
void lcdDisplay() {
lcd.setCursor(0, 0); // set the cursor to (0,0) (first column,first row).
lcd.print("TEMP: "); // display temperature information
lcd.print(tempVal);
lcd.print("C");
lcd.setCursor(0, 1); // set the cursor to (0,1) (first column,second row)
lcd.print("TIME: "); // display time information
lcd.print(hour / 10);
lcd.print(hour % 10);
lcd.print(':');
lcd.print(minute / 10);
lcd.print(minute % 10);
lcd.print(':');
lcd.print(second / 10);
lcd.print(second % 10);
}
// function used to get temperature
float getTemp() {
// Convert analog value of tempPin into digital value
int adcVal = analogRead(tempPin);
// Calculate voltage
float v = adcVal * 5.0 / 1024;
// Calculate resistance value of thermistor
float Rt = 10 * v / (5 - v);
// Calculate temperature (Kelvin)
float tempK = 1 / (log(Rt / 10) / 3950 + 1 / (273.15 + 25));
// Calculate temperature (Celsius)
return tempK - 273.15;
}