I have managed to get the 'edit' select for the 'enterBut' to select the parameter. The 'upButt' however does not add a value too the selected parameter (if i==….) Instead this button also select the next parameter. The "blink" is also not working as of yet.
/*clock2B_changed
NOT WORKING YET
Original:
https://simple-circuit.com/arduino-ds3231-real-time-clock-button/
25 Nov 2018
edited for use with ADAFRUIT 2.8" TFT ILI9431,8bit 240x320 & DUE
2 x Touch screen buttons. (enter & up)
*/
#include <Adafruit_GFX.h>
#include <Wire.h>
#include "Sodaq_DS3231.h"
#include <SPI.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <avr/dtostrf.h>
#include<TouchScreen.h>
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET RESET
//T.S allignment
#define TS_MINX 40
#define TS_MINY 40
#define TS_MAXX 1000
#define TS_MAXY 1000
//Touch
#define YM 10
#define XM A4
#define YP A5
#define XP 11
//Color Definitons
#define BLACK 0x0000
#define BLUE 0x001F
#define GREY 0xCE79
#define LIGHTGREY 0xDEDB
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define MINPRESSURE 100
#define MAXPRESSURE 1000
// (11, A5, A4, 10 ,RESISTANCE)
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 365);
int X, Y, Z;
int upButt;
int enterButt;
char Time[] = "TIME: : : ";
char Calendar[] = "DATE: / /20 ";
byte i, second, minute, hour, date, month, year;
//define DS3231 address
//SDA=20 SCL=21 I2C Ard_DUE
#define DS3231_I2C_ADDRESS 0x68
void setup() {
Serial.begin(9600);
tft.reset();
uint16_t identifier = tft.readID();
tft.begin(identifier);
tft.setRotation (1);
tft.fillScreen(BLACK);
Wire.begin();
rtc.begin();
Graphics();
DS3231_display();
}
void DS3231_display() {
// Convert BCD to decimal
second = (second >> 4) * 10 + (second & 0x0F);
minute = (minute >> 4) * 10 + (minute & 0x0F);
hour = (hour >> 4) * 10 + (hour & 0x0F);
date = (date >> 4) * 10 + (date & 0x0F);
month = (month >> 4) * 10 + (month & 0x0F);
year = (year >> 4) * 10 + (year & 0x0F);
// End conversion
Time[12] = second % 10 + 48;
Time[11] = second / 10 + 48;
Time[9] = minute % 10 + 48;
Time[8] = minute / 10 + 48;
Time[6] = hour % 10 + 48;
Time[5] = hour / 10 + 48;
Calendar[14] = year % 10 + 48;
Calendar[13] = year / 10 + 48;
Calendar[9] = month % 10 + 48;
Calendar[8] = month / 10 + 48;
Calendar[6] = date % 10 + 48;
Calendar[5] = date / 10 + 48;
tft.setTextColor(WHITE); //Time & Calendar
tft.setTextSize(3);
//L TOP W H COLOR
tft.fillRect(100,14, 160, 25, RED); // erase prevTime
tft.setCursor(15, 15);
tft.fillRect(102, 89, 185, 25, RED); // erase old date
tft.print(Time); // Display time
tft.setCursor(15, 90);
tft.print(Calendar); // Display calendar
} //end void
void blink_parameter() {
tft.setTextColor(GREEN);
byte j = 0;
while (j < 10 && ( 3 , 78 , 160 , 190, true) && ( 88 , 163 , 160 , 190, true) ) {
j++;
}
delay(25);
}
byte edit(byte x, byte y, byte parameter) {
char text[3];
while ( 3 , 78 , 160 , 190,true) { // Works corectly
TSPoint p = ts.getPoint();
if (p.z > ts.pressureThreshhold) {
X = 320 - map(p.y, TS_MAXX, TS_MINX, 0, 320 );
Y = map(p.x, TS_MAXY, TS_MINY, 0, 240);
Z = p.z;
//upButtPin;
if ( 88 , 163 , 160 , 190,true) { //NOT adding a value to parameter
parameter++;
if (i == 0 && parameter > 23) // If hours > 23 ==> hours = 0
parameter = 0;
if (i == 1 && parameter > 59) // If minutes > 59 ==> minutes = 0
parameter = 0;
if (i == 2 && parameter > 31) // If date > 31 ==> date = 1
parameter = 1;
if (i == 3 && parameter > 12) // If month > 12 ==> month = 1
parameter = 1;
if (i == 4 && parameter > 99) // If year > 99 ==> year = 0
parameter = 0;
sprintf(text, "%02u", parameter);
tft.setCursor(x, y);
tft.print(text);
delay(200); // Wait 200ms
}
else ( 88 , 163 , 160 , 190,false);
tft.setCursor(x, y);
tft.print(" "); // NOT working. Should Display two spaces
blink_parameter();
sprintf(text, "%02u", parameter);
tft.setCursor(x, y);
tft.print(text);
blink_parameter();
if (3 , 78 , 160 , 190,true) { // If button (enterButtPin) is pressed
i++; // Increament 'i' for the next parameter
return parameter; // Return parameter value and exit
}
}//if (p.z
}//while(3,78
}//byte edit(byte
void loop() {
TSPoint p = ts.getPoint();
if (p.z > ts.pressureThreshhold) {
X = 320 - map(p.y, TS_MAXX, TS_MINX, 0, 320 );
Y = map(p.x, TS_MAXY, TS_MINY, 0, 240);
Z = p.z;
//enterButt
if (3 , 78 , 160 , 190,true) {
i = 0;
hour = edit(105, 15, hour);
minute = edit(160, 15, minute);
date = edit(105, 90, date);
month = edit(159, 90, month);
year = edit(249, 90, year);
// Convert decimal to BCD
minute = ((minute / 10) << 4) + (minute % 10);
hour = ((hour / 10) << 4) + (hour % 10);
date = ((date / 10) << 4) + (date % 10);
month = ((month / 10) << 4) + (month % 10);
year = ((year / 10) << 4) + (year % 10);
// End conversion
// Write data to DS3231 RTC
Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address
Wire.write(0); // Send register address
Wire.write(0); // Reset sesonds and start oscillator
Wire.write(minute); // Write minute
Wire.write(hour); // Write hour
Wire.write(1); // Write day (not used)
Wire.write(date); // Write date
Wire.write(month); // Write month
Wire.write(year); // Write year
Wire.endTransmission(); // Stop transmission and release the I2C bus
delay(200); // Wait 200ms
}//end (!enterButt
else (3 , 78 , 160 , 190,false);//enterButt
Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address
Wire.write(0); // Send register address
Wire.endTransmission(false); // I2C restart
Wire.requestFrom(0x68, 7); // Request 7 bytes from DS3231 and
//release I2C bus at end of reading
second = Wire.read(); // Read seconds from register 0
minute = Wire.read(); // Read minuts from register 1
hour = Wire.read(); // Read hour from register 2
Wire.read(); // Read day from register 3 (not used)
date = Wire.read(); // Read date from register 4
month = Wire.read(); // Read month from register 5
year = Wire.read(); // Read year from register 6
DS3231_display(); // Diaplay time & calendar
delay(50); // Wait 50ms
}//
}//end loop
void Graphics()
{
//tft.setFont(&FreeMonoBold9pt7b); //set new font
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.drawRect(3, 170, 75, 35, WHITE); //enterButtPin
tft.setCursor(10, 185);
tft.print("Enter");
tft.drawRect(88, 170, 75, 35, WHITE); //upButtPin
tft.setCursor(115, 185);
tft.print("Up");
}