You are on page 1of 7

19.

februara 2018 Jednostavni projekti

Arduino sa TFT u boji DS3231 i ST7735


Ova tema pokazuje kako izraditi sat u stvarnom vremenu s monitorom temperature
pomoću Arduino, DS3231 RTC i ST7735R (ST7735S) 1,8-inčnog TFT zaslona u boji.

Izgradnja ovog projekta s Arduinom je tako jednostavna, u krugu se nalaze dvije


tipke za podešavanje vremena, kao i datum, vrijeme, datum i temperatura koji se
prikazuju na 1,8 ″ (128 x 160) TFT ekranu sa ST7735 kontrolerom.

Prethodno sam izradio nekoliko projekata sa Arduinom i DS3231, veze su ispod:


Arduino i DS3231 sat u realnom vremenu
Arduino sat u realnom vremenu sa alarmom i monitorom temperature koristeći
DS3231
Arduino + DS3231 RTC sa alarmima, nadzorom temperature i daljinskim
upravljačem

I donja veza prikazuje jednostavan primjer povezivanja Arduina i ST7735 TFT:


primjer Arduino ST7735 1,8 ″ TFT zaslona

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

Arduino s DS3231 RTC i ST7735 TFT krugom:


Shematski dijagram projektnog kruga prikazan je u nastavku.

(Svi uzemljeni terminali povezani su zajedno)

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.

Arduino s DS3231 RTC i ST7735 TFT kodom:


Potrebne su nam dvije biblioteke (Adafruit_ST7735 i Adafruit_GFX)
kompanije Adafruit da bismo kompajlirali Arduino kod dolje, te biblioteke možete
preuzeti sa donje veze:
Preuzmi

Smjestite obje biblioteke u mapu Arduino IDE knjižnica.

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.

Arduino sa DS3231 RTC i ST7735 video zapisima:


Prvi video prikazuje hardverski krug projekta.

a donji video prikazuje simulaciju sklopa pomoću Proteusa:

Preuzimanje datoteke simulacije Proteus: Datoteku simulacije


Proteus možete preuzeti sa donje veze, koristite je sa verzijom 8.6 ili novijom.
QVGA 2.2 "(240x320) TFT SPI ekran sa SD-CARD
Skinuti
pinoutom
QVGA 2,2 "TFT SPI ekran je kupio od Ebay . Vozač Ekran je ILI9341 i odbor koristi 3.3V logici.
Dubina maksimalna boja TFT potpora je 16 bita.
SD-CARD se napaja iz ekrana VCC i ima poseban SPI igle.

Upozorenje! QVGA 2.2 "TFT ne podržava 5V ni na jednom od svojih pinova.

TFT ekran igle:


SDO (Mišo)
LED = 3.3V ili u seriji sa 100 Ohm otpornik od 5V
SCK (sat)
SDI (MOSI)
D / C (DATA / command)
RESET
CS  (CHIPSELECT)
GND
VCC = 3.3V

na
Pribadače SD-KARTICE: SD_CS (CHIPSELECT)
SD_MOSI  (MOSI)
SD_MISO  (MISO)
SD_SCK  (SAT)

Reference: ILI9341 PDF priručnik , www.instructables.com

You might also like