Professional Documents
Culture Documents
Potrebne komponente:
Za izgradnju ovog projekta potrebne su nam sljedeće komponente.
Arduino ploča
DS3231 ploča
ST7735R (ST7735S) TFT zaslon
Otpornik 5 x 1K ohma
2 x dugme
3V duguljasta baterija
Breadboard
Žice kratkospojnika
U krugu postoje 2 tipke (B1 i B2) povezane na Arduino pinove 7 i 6, odnosno dvije
tipke se koriste za podešavanje parametara vremena i datuma (minute, sati, dan u
sedmici, datum, mjesec i godina) . Tipka B1 odabire parametar, a B2 povećava
odabrani parametar.
C
1 // Arduino with DS3231 and ST7735R TFT display
2 // Real time clock & calendar with temperature monitor and 1.8" TFT screen
3
4 // include Wire library code (needed for I2C protocol devices)
5 #include <Wire.h>
6 // include ST7735 library
7 #include <Adafruit_GFX.h> // Core graphics library
8 #include <Adafruit_ST7735.h> // Hardware-specific library
9 #include <SPI.h>
10
11 #define TFT_CS 9 // TFT CS pin is connected to arduino pin 9
12 #define TFT_DC 10 // TFT DC pin is connected to arduino pin 10
13 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC);
14
15 #define button1 7 // Button B1 is connected to Arduino pin 7
16 #define button2 6 // Button B2 is connected to Arduino pin 6
17
18 void setup(void) {
19 pinMode(button1, INPUT_PULLUP);
20 pinMode(button2, INPUT_PULLUP);
21 tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab
22 tft.fillScreen(ST7735_BLACK);
23 Wire.begin(); // Join i2c bus
24 tft.drawFastHLine(0, 53, tft.width(), ST7735_BLUE); // Draw horizontal blue line at position (0, 53)
25 tft.drawFastHLine(0, 106, tft.width(), ST7735_BLUE); // Draw horizontal blue line at position (0, 106)
26 draw_text(52, 64, "TIME", 1, ST7735_MAGENTA);
27 draw_text(30, 117, "TEMPERATURE", 1, ST7735_RED);
28 }
29 char Time[] = " : : ";
30 char Calendar[] = " / /20 ";
31 char temperature[] = " 00.00";
32 char temperature_msb;
33 byte i, second, minute, hour, day, date, month, year, temperature_lsb;
34
35 void display_day(){
36 switch(day){
37 case 1: draw_text(40, 10, " SUNDAY ", 1, ST7735_CYAN); break;
38 case 2: draw_text(40, 10, " MONDAY ", 1, ST7735_CYAN); break;
39 case 3: draw_text(40, 10, " TUESDAY ", 1, ST7735_CYAN); break;
40 case 4: draw_text(40, 10, "WEDNESDAY", 1, ST7735_CYAN); break;
41 case 5: draw_text(40, 10, "THURSDAY ", 1, ST7735_CYAN); break;
42 case 6: draw_text(40, 10, " FRIDAY ", 1, ST7735_CYAN); break;
43 default: draw_text(40, 10, "SATURDAY ", 1, ST7735_CYAN);
44 }
45 }
46 void DS3231_display(){
47 // Convert BCD to decimal
48 second = (second >> 4) * 10 + (second & 0x0F);
49 minute = (minute >> 4) * 10 + (minute & 0x0F);
50 hour = (hour >> 4) * 10 + (hour & 0x0F);
51 date = (date >> 4) * 10 + (date & 0x0F);
52 month = (month >> 4) * 10 + (month & 0x0F);
53 year = (year >> 4) * 10 + (year & 0x0F);
54 // End conversion
55 Time[7] = second % 10 + 48;
56 Time[6] = second / 10 + 48;
57 Time[4] = minute % 10 + 48;
58 Time[3] = minute / 10 + 48;
59 Time[1] = hour % 10 + 48;
60 Time[0] = hour / 10 + 48;
61 Calendar[9] = year % 10 + 48;
62 Calendar[8] = year / 10 + 48;
63 Calendar[4] = month % 10 + 48;
64 Calendar[3] = month / 10 + 48;
65 Calendar[1] = date % 10 + 48;
66 Calendar[0] = date / 10 + 48;
67 if(temperature_msb < 0){
68 temperature_msb = abs(temperature_msb);
69 temperature[0] = '-';
70 }
71 else
72 temperature[0] = ' ';
73 temperature_lsb >>= 6;
74 temperature[2] = temperature_msb % 10 + 48;
75 temperature[1] = temperature_msb / 10 + 48;
76 if(temperature_lsb == 0 || temperature_lsb == 2){
77 temperature[5] = '0';
78 if(temperature_lsb == 0) temperature[4] = '0';
79 else temperature[4] = '5';
80 }
81 if(temperature_lsb == 1 || temperature_lsb == 3){
82 temperature[5] = '5';
83 if(temperature_lsb == 1) temperature[4] = '2';
84 else temperature[4] = '7';
85 }
86 draw_text(4, 27, Calendar, 2, ST7735_YELLOW);
87 draw_text(16, 81, Time, 2, ST7735_GREEN);
88 draw_text(14, 134, temperature, 2, ST7735_WHITE);
89 tft.drawCircle(90, 134, 2, ST7735_WHITE); // Degree symbol (°)
90 draw_text(96, 134, "C", 2, ST7735_WHITE);
91 }
92 void blink_parameter(){
93 byte j = 0;
94 while(j < 10 && digitalRead(button1) && digitalRead(button2)){
95 j++;
96 delay(25);
97 }
98 }
99 byte edit(byte x_pos, byte y_pos, byte parameter){
100 char text[3];
101 uint16_t color = ST7735_YELLOW;
102 sprintf(text,"%02u", parameter);
103 if(i == 3 || i == 4)
104 color = ST7735_GREEN;
105 while(!digitalRead(button1)); // Wait until button B1 released
106 while(true){
107 while(!digitalRead(button2)){ // If button (pin #9) is pressed
108 parameter++;
109 if(i == 0 && parameter > 31) // If date > 31 ==> date = 1
110 parameter = 1;
111 if(i == 1 && parameter > 12) // If month > 12 ==> month = 1
112 parameter = 1;
113 if(i == 2 && parameter > 99) // If year > 99 ==> year = 0
114 parameter = 0;
115 if(i == 3 && parameter > 23) // If hours > 23 ==> hours = 0
116 parameter = 0;
117 if(i == 4 && parameter > 59) // If minutes > 59 ==> minutes = 0
118 parameter = 0;
119 sprintf(text,"%02u", parameter);
120 draw_text(x_pos, y_pos, text, 2, color);
121 delay(200); // Wait 200ms
122 }
123 tft.fillRect(x_pos, y_pos, 22, 16, ST7735_BLACK);
124 blink_parameter();
125 draw_text(x_pos, y_pos, text, 2, color);
126 blink_parameter();
127 if(!digitalRead(button1)){ // If button (pin #8) is pressed
128 i++; // Increament 'i' for the next parameter
129 return parameter; // Return parameter value and exit
130 }
131 }
132 }
133 void draw_text(byte x_pos, byte y_pos, char *text, byte text_size, uint16_t text_color) {
134 tft.setCursor(x_pos, y_pos);
135 tft.setTextSize(text_size);
136 tft.setTextColor(text_color, ST7735_BLACK);
137 tft.print(text);
138 }
139
140 void loop() {
141 if(!digitalRead(button1)){ // If button B1 is pressed
142 i = 0;
143 while(!digitalRead(button1)); // Wait for button B1 release
144 while(true){
145 while(!digitalRead(button2)){ // While button B2 pressed
146 day++; // Increment day
147 if(day > 7) day = 1;
148 display_day(); // Call display_day function
149 delay(200); // Wait 200 ms
150 }
151 tft.fillRect(40, 10, 54, 8, ST7735_BLACK); // Draw rectangle (earase day from the display)
152 blink_parameter(); // Call blink_parameter function
153 display_day(); // Call display_day function
154 blink_parameter(); // Call blink_parameter function
155 if(!digitalRead(button1)) // If button B1 is pressed
156 break;
157 }
158 date = edit(4, 27, date); // Edit date
159 month = edit(40, 27, month); // Edit month
160 year = edit(100, 27, year); // Edit year
161 hour = edit(16, 81, hour); // Edit hours
162 minute = edit(52, 81, minute); // Edit minutes
163 // Convert decimal to BCD
164 minute = ((minute / 10) << 4) + (minute % 10);
165 hour = ((hour / 10) << 4) + (hour % 10);
166 date = ((date / 10) << 4) + (date % 10);
167 month = ((month / 10) << 4) + (month % 10);
168 year = ((year / 10) << 4) + (year % 10);
169 // End conversion
170 // Write data to DS3231 RTC
171 Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address
172 Wire.write(0); // Send register address
173 Wire.write(0); // Reset sesonds and start oscillator
174 Wire.write(minute); // Write minute
175 Wire.write(hour); // Write hour
176 Wire.write(day); // Write day
177 Wire.write(date); // Write date
178 Wire.write(month); // Write month
179 Wire.write(year); // Write year
180 Wire.endTransmission(); // Stop transmission and release the I2C bus
181 delay(200); // Wait 200ms
182 }
183 Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address
184 Wire.write(0); // Send register address
185 Wire.endTransmission(false); // I2C restart
186 Wire.requestFrom(0x68, 7); // Request 7 bytes from DS3231 and release I2C bus at end of reading
187 second = Wire.read(); // Read seconds from register 0
188 minute = Wire.read(); // Read minuts from register 1
189 hour = Wire.read(); // Read hour from register 2
190 day = Wire.read(); // Read day from register 3
191 date = Wire.read(); // Read date from register 4
192 month = Wire.read(); // Read month from register 5
193 year = Wire.read(); // Read year from register 6
194 Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address
195 Wire.write(0x11); // Send register address
196 Wire.endTransmission(false); // I2C restart
197 Wire.requestFrom(0x68, 2); // Request 2 bytes from DS3231 and release I2C bus at end of reading
198 temperature_msb = Wire.read(); // Read temperature MSB
199 temperature_lsb = Wire.read(); // Read temperature LSB
200 display_day();
201 DS3231_display(); // Diaplay time & calendar
202 delay(50); // Wait 50ms
203 }
204 // End of code.
na
Pribadače SD-KARTICE: SD_CS (CHIPSELECT)
SD_MOSI (MOSI)
SD_MISO (MISO)
SD_SCK (SAT)