Clock with sensors for temperature, humidity and air pressure. TFT 2.2inch 320x240 SPI with SDCard socket. Sensors: DHT22 aka AM2302, SHT11, BMP180 RTC: DS3231 with 24C32 EEPROM on board.

Dependencies:   BMP180 DS3231 RHT03 SDFileSystem SPI_TFT_ILI9341 _24LCXXX mbed SHTx

Clock and environmental display

Used a Nucleo L152RE, cheap display with QVGA 320x240 resolution and SPI bus plus SDCARD socket and a bunch of cheap board from Chinese dealers:

  • DS3231 RTC with on board EEPROM 4k Byte
  • BMP180 pressure sensor
  • SHT11 temperature and humidity sensor
  • TTP224 capacitive switch buttons with 4 pads

Simple weather forecast regarding the pressure. Not very reliable. Still searching for infos.

Data will be stored every ten minutes for statistics into EEPROM and on SDCARD EEPROM data is used for statistics display. The text file on SDCARD can be used for importing into some programs on PC.

Backlit control is done by a Pololu 3.3V step-down converter (I was to lazy to search for a transistor ;-) ).

SHT11 uses not the normal I2C protocol. I set it up for second I2C port (PB_11, PB_10). I used a AM2302 sensor, but sensor or lib were not very reliable and the update was hanging several hours. These combined temperature and humidity sensors with digital interface are not very cheap.

Update 1st June 2014

Some major changes. Now using SHT11 temperature humidity sensor. Code for AM2302 and DHT22 still available. Display changed to landscape orientation and inverted to white letters on black background. I use a TTP224 touch module with 4 buttons. Backlit control with a Pololu 3.3V step down converter (#2097) using the SHDN pin. A little bit bigger weather icons (95*85 pixel)

Normal display

/media/uploads/RobertFischer/weather_clock_v2.jpg

Stats display

/media/uploads/RobertFischer/stats_disp.jpg

New media files for icons on black background:

------------------------------

Text for previous version

Now my little clock is running a few day and shows a little issue. It seems, the DHT22/AM2302 sensor is not very reliable and sometime the program hangs getting the data. I will show up with an workaround next days. Later on it is planned to change the sensor. I already ordered a SHT11 sensor which has I²C bus.

Weather symbols converted to RGB565 bmp files with size of 72x72. Put these files on a SDcard

May, 18: Now guessing weather. First splash screen disabled. Changed the reading of temp sensor. If after 5 tries no luck, take old values. The AM2302 reading is not very reliable.

Not really happy with the layout, but a good beginning. :) /media/uploads/RobertFischer/weather_color_v1.jpg

Committer:
RobertFischer
Date:
Mon May 12 21:04:00 2014 +0000
Revision:
0:7e22a0e87f8e
Child:
1:5c0b32a77708
Little clock with RTC DS3231 and sensors BMP180 and DHT22. Display is a cheap 2.2inch 320x240 TFT with SDCard connector.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RobertFischer 0:7e22a0e87f8e 1 /************************************************************************
RobertFischer 0:7e22a0e87f8e 2 * Simple indoor weather station with TFT display
RobertFischer 0:7e22a0e87f8e 3 *
RobertFischer 0:7e22a0e87f8e 4 * Sensors: AM2302 aka DHT22 hygrometer thermometer
RobertFischer 0:7e22a0e87f8e 5 * BMP180 barometer atmospheric pressure
RobertFischer 0:7e22a0e87f8e 6 *
RobertFischer 0:7e22a0e87f8e 7 * Real time clock: DS3231
RobertFischer 0:7e22a0e87f8e 8 * Storage: 24c32 (on rtc board)
RobertFischer 0:7e22a0e87f8e 9 *
RobertFischer 0:7e22a0e87f8e 10 * Board: ST NUCLEO-L152RE
RobertFischer 0:7e22a0e87f8e 11 * cheap 2.2inch 320x240 TFT with SPI-Interface and SDCard socket.
RobertFischer 0:7e22a0e87f8e 12 *
RobertFischer 0:7e22a0e87f8e 13 * Data stored every 10 minutes into file and 8K byte EEPROM
RobertFischer 0:7e22a0e87f8e 14 *
RobertFischer 0:7e22a0e87f8e 15 * EEPROM storage:
RobertFischer 0:7e22a0e87f8e 16 * 576 values of temp, hygro and barometer (about 4 days)
RobertFischer 0:7e22a0e87f8e 17 * Format: day, hour, min, temp, humidity, preasure
RobertFischer 0:7e22a0e87f8e 18 * pressure will cover 940hpa to 1060hpa
RobertFischer 0:7e22a0e87f8e 19 *
RobertFischer 0:7e22a0e87f8e 20 * Similar program exists for a E-Paper display and Seeduino Arch Pro.
RobertFischer 0:7e22a0e87f8e 21 * will release this code later.
RobertFischer 0:7e22a0e87f8e 22 ************************************************************************/
RobertFischer 0:7e22a0e87f8e 23
RobertFischer 0:7e22a0e87f8e 24 //#define NO_DMA
RobertFischer 0:7e22a0e87f8e 25
RobertFischer 0:7e22a0e87f8e 26 #include "stdio.h"
RobertFischer 0:7e22a0e87f8e 27 #include "mbed.h"
RobertFischer 0:7e22a0e87f8e 28 #include "string"
RobertFischer 0:7e22a0e87f8e 29
RobertFischer 0:7e22a0e87f8e 30 // TFT and SDCard
RobertFischer 0:7e22a0e87f8e 31 #include "SDFileSystem.h"
RobertFischer 0:7e22a0e87f8e 32 #include "SPI_TFT_ILI9341.h"
RobertFischer 0:7e22a0e87f8e 33
RobertFischer 0:7e22a0e87f8e 34 // RTC, EEPROM sensors
RobertFischer 0:7e22a0e87f8e 35 #include "DS3231.h"
RobertFischer 0:7e22a0e87f8e 36 #include "_24LCXXX.h"
RobertFischer 0:7e22a0e87f8e 37 #include "BMP180.h"
RobertFischer 0:7e22a0e87f8e 38 #include "RHT03.h" //AM2303
RobertFischer 0:7e22a0e87f8e 39
RobertFischer 0:7e22a0e87f8e 40 // some fonts
RobertFischer 0:7e22a0e87f8e 41 #include "Courier9x15.h"
RobertFischer 0:7e22a0e87f8e 42 #include "Arial12x12.h"
RobertFischer 0:7e22a0e87f8e 43 #include "Times_New_Roman28x27.h"
RobertFischer 0:7e22a0e87f8e 44
RobertFischer 0:7e22a0e87f8e 45 // my functions
RobertFischer 0:7e22a0e87f8e 46 void drawClock(void);
RobertFischer 0:7e22a0e87f8e 47 void drawAnalogTime(void);
RobertFischer 0:7e22a0e87f8e 48 void drawDigitalTime(void);
RobertFischer 0:7e22a0e87f8e 49 void drawTemp(void);
RobertFischer 0:7e22a0e87f8e 50 void drawPressure(void);
RobertFischer 0:7e22a0e87f8e 51 void SetTime(void);
RobertFischer 0:7e22a0e87f8e 52 void UpdateDisplay(void);
RobertFischer 0:7e22a0e87f8e 53 void storeData(void);
RobertFischer 0:7e22a0e87f8e 54 void showGraph(void);
RobertFischer 0:7e22a0e87f8e 55 int map (int ,int , int , int , int);
RobertFischer 0:7e22a0e87f8e 56
RobertFischer 0:7e22a0e87f8e 57 char store_temp, store_humidity, store_pressure;
RobertFischer 0:7e22a0e87f8e 58
RobertFischer 0:7e22a0e87f8e 59 extern unsigned char p1[]; // the mbed logo
RobertFischer 0:7e22a0e87f8e 60
RobertFischer 0:7e22a0e87f8e 61 // analog clock size and locate
RobertFischer 0:7e22a0e87f8e 62 #define CLOCK_RADIUS 64 // radius of clock face
RobertFischer 0:7e22a0e87f8e 63 #define CLOCK_CENTER_X 68 // If you adjust the radius, you'll probably want to adjust this
RobertFischer 0:7e22a0e87f8e 64 #define CLOCK_CENTER_Y 68 // If you adjust the radius, you'll probably want to adjust this
RobertFischer 0:7e22a0e87f8e 65
RobertFischer 0:7e22a0e87f8e 66 // Maximum of stored value into eeprom
RobertFischer 0:7e22a0e87f8e 67 #define max_datastorage 576 // 576 * 6 = 3456
RobertFischer 0:7e22a0e87f8e 68 #define COUNTERADDRESS 4000 // The counter for ring buffer will be stored here
RobertFischer 0:7e22a0e87f8e 69
RobertFischer 0:7e22a0e87f8e 70 // the TFT is connected to SPI
RobertFischer 0:7e22a0e87f8e 71 SPI_TFT_ILI9341 TFT(PA_7, PA_6, PA_5, PB_6, PA_9, PC_7,"TFT"); // NUCLEO mosi, miso, sclk, cs, reset, dc
RobertFischer 0:7e22a0e87f8e 72
RobertFischer 0:7e22a0e87f8e 73 // SDCard on SPI2 at morpho connectors
RobertFischer 0:7e22a0e87f8e 74 SDFileSystem sd(PB_15, PB_14, PB_13, PB_12, "sd"); // MOSI, MISO, SCLK, SSEL
RobertFischer 0:7e22a0e87f8e 75
RobertFischer 0:7e22a0e87f8e 76 I2C i2c(PB_9, PB_8); // sda, scl
RobertFischer 0:7e22a0e87f8e 77 BMP180 bmp(PB_9, PB_8);
RobertFischer 0:7e22a0e87f8e 78 DS3231 rtc(PB_9,PB_8);
RobertFischer 0:7e22a0e87f8e 79 _24LCXXX eeprom(&i2c, 0x57);
RobertFischer 0:7e22a0e87f8e 80 RHT03 humtemp(PA_10); //Initalise the RHT03 (change pin number to the pin its connected to)
RobertFischer 0:7e22a0e87f8e 81
RobertFischer 0:7e22a0e87f8e 82 // set interrupts
RobertFischer 0:7e22a0e87f8e 83 InterruptIn RTCInt(PB_4);
RobertFischer 0:7e22a0e87f8e 84 InterruptIn ShowGraphInt(PB_5);
RobertFischer 0:7e22a0e87f8e 85
RobertFischer 0:7e22a0e87f8e 86 int main()
RobertFischer 0:7e22a0e87f8e 87 {
RobertFischer 0:7e22a0e87f8e 88 char Control;
RobertFischer 0:7e22a0e87f8e 89 //unsigned int y;
RobertFischer 0:7e22a0e87f8e 90
RobertFischer 0:7e22a0e87f8e 91 // Test if SD-Card works
RobertFischer 0:7e22a0e87f8e 92 //FILE *fp = fopen("/sd/mbed.txt", "a");
RobertFischer 0:7e22a0e87f8e 93 //fprintf(fp, "Hello World!\n");
RobertFischer 0:7e22a0e87f8e 94 //fclose(fp);
RobertFischer 0:7e22a0e87f8e 95
RobertFischer 0:7e22a0e87f8e 96 TFT.set_orientation(0);
RobertFischer 0:7e22a0e87f8e 97 TFT.claim(stdout); // send stdout to the TFT display
RobertFischer 0:7e22a0e87f8e 98 TFT.claim(stderr); // send stderr to the TFT display
RobertFischer 0:7e22a0e87f8e 99 TFT.background(White); // set background to black
RobertFischer 0:7e22a0e87f8e 100 TFT.foreground(Black); // set chars to white
RobertFischer 0:7e22a0e87f8e 101 TFT.cls(); // clear the screen
RobertFischer 0:7e22a0e87f8e 102
RobertFischer 0:7e22a0e87f8e 103 //y= 0;
RobertFischer 0:7e22a0e87f8e 104 //TFT.background(Black);
RobertFischer 0:7e22a0e87f8e 105 //TFT.cls();
RobertFischer 0:7e22a0e87f8e 106
RobertFischer 0:7e22a0e87f8e 107 TFT.set_font((unsigned char*) Arial12x12);
RobertFischer 0:7e22a0e87f8e 108 int err = TFT.BMP_16(9,12,"/sd/Carina.bmp"); // load test.bmp from external SD-card
RobertFischer 0:7e22a0e87f8e 109 TFT.locate(10,120);
RobertFischer 0:7e22a0e87f8e 110 if (err != 1) TFT.printf(" - Err: %d",err);
RobertFischer 0:7e22a0e87f8e 111 wait(2);
RobertFischer 0:7e22a0e87f8e 112
RobertFischer 0:7e22a0e87f8e 113 TFT.cls(); // clear the screen
RobertFischer 0:7e22a0e87f8e 114 TFT.locate(0,0);
RobertFischer 0:7e22a0e87f8e 115 printf(" Hello Mbed ");
RobertFischer 0:7e22a0e87f8e 116 TFT.Bitmap(20,20,172,55,p1);
RobertFischer 0:7e22a0e87f8e 117
RobertFischer 0:7e22a0e87f8e 118 // set the DS3231 for alarm every minute.
RobertFischer 0:7e22a0e87f8e 119 rtc.writeRegister(DS3231_Alarm2_Minutes,0x80);
RobertFischer 0:7e22a0e87f8e 120 rtc.writeRegister(DS3231_Alarm2_Hours,0x80);
RobertFischer 0:7e22a0e87f8e 121 rtc.writeRegister(DS3231_Alarm_2_Day_Date,0x80);
RobertFischer 0:7e22a0e87f8e 122
RobertFischer 0:7e22a0e87f8e 123 Control = rtc.readRegister(DS3231_Control);
RobertFischer 0:7e22a0e87f8e 124 Control = Control|DS3231_bit_A2IE;
RobertFischer 0:7e22a0e87f8e 125 Control = Control|DS3231_bit_INTCN;
RobertFischer 0:7e22a0e87f8e 126 rtc.writeRegister(DS3231_Control,Control);
RobertFischer 0:7e22a0e87f8e 127
RobertFischer 0:7e22a0e87f8e 128 Control=rtc.readRegister(DS3231_Control_Status)&0xFC;
RobertFischer 0:7e22a0e87f8e 129 rtc.writeRegister(DS3231_Control_Status,Control);
RobertFischer 0:7e22a0e87f8e 130
RobertFischer 0:7e22a0e87f8e 131
RobertFischer 0:7e22a0e87f8e 132 wait(1); // wait two seconds
RobertFischer 0:7e22a0e87f8e 133
RobertFischer 0:7e22a0e87f8e 134 UpdateDisplay();
RobertFischer 0:7e22a0e87f8e 135
RobertFischer 0:7e22a0e87f8e 136 RTCInt.fall(&UpdateDisplay); // interrupt for display update every minute called by rtc alarm
RobertFischer 0:7e22a0e87f8e 137
RobertFischer 0:7e22a0e87f8e 138 ShowGraphInt.fall(&showGraph); // interrupt for showing value history diagram. called by a button or capacitive touch switch
RobertFischer 0:7e22a0e87f8e 139
RobertFischer 0:7e22a0e87f8e 140 while(1) {
RobertFischer 0:7e22a0e87f8e 141 wait(10.0);
RobertFischer 0:7e22a0e87f8e 142 }
RobertFischer 0:7e22a0e87f8e 143 }
RobertFischer 0:7e22a0e87f8e 144
RobertFischer 0:7e22a0e87f8e 145
RobertFischer 0:7e22a0e87f8e 146 void UpdateDisplay(void)
RobertFischer 0:7e22a0e87f8e 147 {
RobertFischer 0:7e22a0e87f8e 148
RobertFischer 0:7e22a0e87f8e 149 //led2 = 0;
RobertFischer 0:7e22a0e87f8e 150
RobertFischer 0:7e22a0e87f8e 151 TFT.cls();
RobertFischer 0:7e22a0e87f8e 152
RobertFischer 0:7e22a0e87f8e 153 TFT.fillrect(237,317,239,319,Red); // Just for status: during update there is a small red dot at the bottom right corner
RobertFischer 0:7e22a0e87f8e 154
RobertFischer 0:7e22a0e87f8e 155 drawClock();
RobertFischer 0:7e22a0e87f8e 156 drawAnalogTime();
RobertFischer 0:7e22a0e87f8e 157 drawDigitalTime();
RobertFischer 0:7e22a0e87f8e 158
RobertFischer 0:7e22a0e87f8e 159 drawPressure();
RobertFischer 0:7e22a0e87f8e 160
RobertFischer 0:7e22a0e87f8e 161 drawTemp();
RobertFischer 0:7e22a0e87f8e 162
RobertFischer 0:7e22a0e87f8e 163 storeData();
RobertFischer 0:7e22a0e87f8e 164
RobertFischer 0:7e22a0e87f8e 165 TFT.fillrect(237,317,239,319,White);
RobertFischer 0:7e22a0e87f8e 166
RobertFischer 0:7e22a0e87f8e 167 // Reset clock alarm
RobertFischer 0:7e22a0e87f8e 168 char Control=rtc.readRegister(DS3231_Control_Status)& 0xFC;
RobertFischer 0:7e22a0e87f8e 169 rtc.writeRegister(DS3231_Control_Status,Control);
RobertFischer 0:7e22a0e87f8e 170
RobertFischer 0:7e22a0e87f8e 171 //led2 = 1;
RobertFischer 0:7e22a0e87f8e 172
RobertFischer 0:7e22a0e87f8e 173 }
RobertFischer 0:7e22a0e87f8e 174
RobertFischer 0:7e22a0e87f8e 175 // store every ten minute values into file and eeprom
RobertFischer 0:7e22a0e87f8e 176 void storeData(void)
RobertFischer 0:7e22a0e87f8e 177 {
RobertFischer 0:7e22a0e87f8e 178 int date, month, year, hour, minute, second, dayOfWeek;
RobertFischer 0:7e22a0e87f8e 179 unsigned int store_address;
RobertFischer 0:7e22a0e87f8e 180 char b[6];
RobertFischer 0:7e22a0e87f8e 181
RobertFischer 0:7e22a0e87f8e 182 //led1=0;
RobertFischer 0:7e22a0e87f8e 183
RobertFischer 0:7e22a0e87f8e 184 rtc.readDateTime(&dayOfWeek,&date,&month,&year,&hour,&minute,&second);
RobertFischer 0:7e22a0e87f8e 185
RobertFischer 0:7e22a0e87f8e 186 // Save only every 10 minutes
RobertFischer 0:7e22a0e87f8e 187 if ( minute%10 == 0) {
RobertFischer 0:7e22a0e87f8e 188
RobertFischer 0:7e22a0e87f8e 189 /* Store into EEPROM */
RobertFischer 0:7e22a0e87f8e 190 eeprom.nbyte_read( COUNTERADDRESS, &store_address, sizeof(int) );
RobertFischer 0:7e22a0e87f8e 191
RobertFischer 0:7e22a0e87f8e 192 if ( store_address > (max_datastorage * 6)) {
RobertFischer 0:7e22a0e87f8e 193 store_address = 0;
RobertFischer 0:7e22a0e87f8e 194 }
RobertFischer 0:7e22a0e87f8e 195
RobertFischer 0:7e22a0e87f8e 196 b[0] = date;
RobertFischer 0:7e22a0e87f8e 197 b[1] = hour;
RobertFischer 0:7e22a0e87f8e 198 b[2] = minute;
RobertFischer 0:7e22a0e87f8e 199 b[3] = store_temp;
RobertFischer 0:7e22a0e87f8e 200 b[4] = store_humidity;
RobertFischer 0:7e22a0e87f8e 201 b[5] = store_pressure;
RobertFischer 0:7e22a0e87f8e 202
RobertFischer 0:7e22a0e87f8e 203 eeprom.nbyte_write( store_address, &b, 6);
RobertFischer 0:7e22a0e87f8e 204
RobertFischer 0:7e22a0e87f8e 205 store_address += 6;
RobertFischer 0:7e22a0e87f8e 206
RobertFischer 0:7e22a0e87f8e 207 eeprom.nbyte_write(COUNTERADDRESS,&store_address,sizeof(int));
RobertFischer 0:7e22a0e87f8e 208
RobertFischer 0:7e22a0e87f8e 209 // Store into file
RobertFischer 0:7e22a0e87f8e 210 FILE *fp = fopen("/sd/stored_data.txt", "a");
RobertFischer 0:7e22a0e87f8e 211 fprintf(fp, "%02i %02i %02i:%02i %02i %cC %02i %% %04i hPa\n",month, date, hour, minute, store_temp, 176, store_humidity, (store_pressure+1880) * 50 / 100);
RobertFischer 0:7e22a0e87f8e 212 fclose(fp);
RobertFischer 0:7e22a0e87f8e 213
RobertFischer 0:7e22a0e87f8e 214 }
RobertFischer 0:7e22a0e87f8e 215
RobertFischer 0:7e22a0e87f8e 216 //led1=1;
RobertFischer 0:7e22a0e87f8e 217 }
RobertFischer 0:7e22a0e87f8e 218
RobertFischer 0:7e22a0e87f8e 219 // show grap of stored data (at the moment landscape oriented. not yet changed to potrait display)
RobertFischer 0:7e22a0e87f8e 220 void showGraph(void)
RobertFischer 0:7e22a0e87f8e 221 {
RobertFischer 0:7e22a0e87f8e 222 unsigned int store_address,i;
RobertFischer 0:7e22a0e87f8e 223 char b[6];
RobertFischer 0:7e22a0e87f8e 224 char temp_arr[204], temp_min, temp_max;
RobertFischer 0:7e22a0e87f8e 225 char humidity_arr[204], hum_min, hum_max;
RobertFischer 0:7e22a0e87f8e 226 int pressure_arr[204], press_min, press_max;
RobertFischer 0:7e22a0e87f8e 227
RobertFischer 0:7e22a0e87f8e 228 eeprom.nbyte_read( COUNTERADDRESS, &store_address, sizeof(int) );
RobertFischer 0:7e22a0e87f8e 229
RobertFischer 0:7e22a0e87f8e 230 TFT.set_font((unsigned char*) Courier9x15);
RobertFischer 0:7e22a0e87f8e 231
RobertFischer 0:7e22a0e87f8e 232 TFT.set_orientation(1);
RobertFischer 0:7e22a0e87f8e 233 TFT.cls();
RobertFischer 0:7e22a0e87f8e 234 TFT.line(58,8,58,50,0);
RobertFischer 0:7e22a0e87f8e 235 TFT.line(56,48,263,48,0);
RobertFischer 0:7e22a0e87f8e 236 TFT.line(58,60,58,102,0);
RobertFischer 0:7e22a0e87f8e 237 TFT.line(56,100,263,100,0);
RobertFischer 0:7e22a0e87f8e 238 TFT.line(58,112,58,154,0);
RobertFischer 0:7e22a0e87f8e 239 TFT.line(56,152,263,152,0);
RobertFischer 0:7e22a0e87f8e 240
RobertFischer 0:7e22a0e87f8e 241 // store_address is allways one step ahead of last stored values
RobertFischer 0:7e22a0e87f8e 242 if ( store_address == 0)
RobertFischer 0:7e22a0e87f8e 243 store_address = max_datastorage * 6;
RobertFischer 0:7e22a0e87f8e 244 else
RobertFischer 0:7e22a0e87f8e 245 store_address -= 6;
RobertFischer 0:7e22a0e87f8e 246
RobertFischer 0:7e22a0e87f8e 247 // read from eeprom, store into array, find min and max values
RobertFischer 0:7e22a0e87f8e 248 temp_min = 100;
RobertFischer 0:7e22a0e87f8e 249 hum_min = 99;
RobertFischer 0:7e22a0e87f8e 250 press_min = 1150;
RobertFischer 0:7e22a0e87f8e 251 temp_max = 0;
RobertFischer 0:7e22a0e87f8e 252 hum_max = 0;
RobertFischer 0:7e22a0e87f8e 253 press_max = 0;
RobertFischer 0:7e22a0e87f8e 254
RobertFischer 0:7e22a0e87f8e 255 // Read from EEPROM storage into arrays
RobertFischer 0:7e22a0e87f8e 256 for (i=0; i<204; i++) {
RobertFischer 0:7e22a0e87f8e 257 eeprom.nbyte_read( store_address, &b, 6);
RobertFischer 0:7e22a0e87f8e 258
RobertFischer 0:7e22a0e87f8e 259 // draw every 2 hour an line
RobertFischer 0:7e22a0e87f8e 260 if ( b[2] == 0 && (b[1]%4 == 0 || b[1] == 0) ) {
RobertFischer 0:7e22a0e87f8e 261 TFT.line(263-i,46,263-i,50,1);
RobertFischer 0:7e22a0e87f8e 262 TFT.line(263-i,98,263-i,102,1);
RobertFischer 0:7e22a0e87f8e 263 TFT.line(263-i,150,263-i,154,1);
RobertFischer 0:7e22a0e87f8e 264 TFT.locate(254-i,158);
RobertFischer 0:7e22a0e87f8e 265 if ( i > 15 ) // do not write at the right border
RobertFischer 0:7e22a0e87f8e 266 printf("%2i",b[1]);
RobertFischer 0:7e22a0e87f8e 267 }
RobertFischer 0:7e22a0e87f8e 268
RobertFischer 0:7e22a0e87f8e 269 // store temp into array and check min max
RobertFischer 0:7e22a0e87f8e 270 temp_arr[i] = b[3];
RobertFischer 0:7e22a0e87f8e 271 if ( b[3] < temp_min )
RobertFischer 0:7e22a0e87f8e 272 temp_min = b[3];
RobertFischer 0:7e22a0e87f8e 273 if ( b[3] > temp_max )
RobertFischer 0:7e22a0e87f8e 274 temp_max = b[3];
RobertFischer 0:7e22a0e87f8e 275
RobertFischer 0:7e22a0e87f8e 276 // store humidity into array and check min max
RobertFischer 0:7e22a0e87f8e 277 humidity_arr[i] = b[4];
RobertFischer 0:7e22a0e87f8e 278 if ( b[4] < hum_min )
RobertFischer 0:7e22a0e87f8e 279 hum_min = b[4];
RobertFischer 0:7e22a0e87f8e 280 if ( b[4] > hum_max )
RobertFischer 0:7e22a0e87f8e 281 hum_max = b[4];
RobertFischer 0:7e22a0e87f8e 282
RobertFischer 0:7e22a0e87f8e 283 // store pressure into array and check min max
RobertFischer 0:7e22a0e87f8e 284 pressure_arr[i] = (b[5]+1880) * 50 / 100; // calculate pressure to Pascal and hektoPascal
RobertFischer 0:7e22a0e87f8e 285 if ( pressure_arr[i] < 990 )
RobertFischer 0:7e22a0e87f8e 286 pressure_arr[i] = 1000;
RobertFischer 0:7e22a0e87f8e 287
RobertFischer 0:7e22a0e87f8e 288 if ( pressure_arr[i] < press_min )
RobertFischer 0:7e22a0e87f8e 289 press_min = pressure_arr[i];
RobertFischer 0:7e22a0e87f8e 290 if ( pressure_arr[i] > press_max )
RobertFischer 0:7e22a0e87f8e 291 press_max = pressure_arr[i];
RobertFischer 0:7e22a0e87f8e 292
RobertFischer 0:7e22a0e87f8e 293 if ( store_address == 0)
RobertFischer 0:7e22a0e87f8e 294 store_address = max_datastorage * 6;
RobertFischer 0:7e22a0e87f8e 295 else
RobertFischer 0:7e22a0e87f8e 296 store_address -= 6;
RobertFischer 0:7e22a0e87f8e 297 }
RobertFischer 0:7e22a0e87f8e 298
RobertFischer 0:7e22a0e87f8e 299 // rounding min and max to 5
RobertFischer 0:7e22a0e87f8e 300 temp_min -= 1;
RobertFischer 0:7e22a0e87f8e 301 temp_min = temp_min - (temp_min%5);
RobertFischer 0:7e22a0e87f8e 302 temp_max += 1;
RobertFischer 0:7e22a0e87f8e 303 temp_max = temp_max + (5 - (temp_max%5));
RobertFischer 0:7e22a0e87f8e 304 TFT.locate(0,2);
RobertFischer 0:7e22a0e87f8e 305 printf("%i%cC",temp_max,127);
RobertFischer 0:7e22a0e87f8e 306 TFT.locate(0,40);
RobertFischer 0:7e22a0e87f8e 307 printf("%i%cC",temp_min,127);
RobertFischer 0:7e22a0e87f8e 308
RobertFischer 0:7e22a0e87f8e 309 hum_min -= 1;
RobertFischer 0:7e22a0e87f8e 310 hum_min = hum_min - (hum_min%5);
RobertFischer 0:7e22a0e87f8e 311 hum_max += 1;
RobertFischer 0:7e22a0e87f8e 312 hum_max = hum_max + (5 - (hum_max%5));
RobertFischer 0:7e22a0e87f8e 313 TFT.locate(0,54);
RobertFischer 0:7e22a0e87f8e 314 printf("%i%%",hum_max);
RobertFischer 0:7e22a0e87f8e 315 TFT.locate(0,92);
RobertFischer 0:7e22a0e87f8e 316 printf("%i%%",hum_min);
RobertFischer 0:7e22a0e87f8e 317
RobertFischer 0:7e22a0e87f8e 318 press_min -= 1;
RobertFischer 0:7e22a0e87f8e 319 press_min = press_min - (press_min%5);
RobertFischer 0:7e22a0e87f8e 320 press_max += 1;
RobertFischer 0:7e22a0e87f8e 321 press_max = press_max + (5 - (press_max%5));
RobertFischer 0:7e22a0e87f8e 322 TFT.locate(0,106);
RobertFischer 0:7e22a0e87f8e 323 printf("%ihPa",press_max);
RobertFischer 0:7e22a0e87f8e 324 TFT.locate(0,144);
RobertFischer 0:7e22a0e87f8e 325 printf("%ihPa",press_min);
RobertFischer 0:7e22a0e87f8e 326
RobertFischer 0:7e22a0e87f8e 327 // drawing lines
RobertFischer 0:7e22a0e87f8e 328 for (i=0; i<204; i++) {
RobertFischer 0:7e22a0e87f8e 329 // temp line
RobertFischer 0:7e22a0e87f8e 330 TFT.pixel(263-i,map(temp_arr[i],temp_min,temp_max,48,8),Red);
RobertFischer 0:7e22a0e87f8e 331 // humidity line
RobertFischer 0:7e22a0e87f8e 332 TFT.pixel(263-i,map(humidity_arr[i],hum_min,hum_max,100,60),Blue);
RobertFischer 0:7e22a0e87f8e 333 // pressure line
RobertFischer 0:7e22a0e87f8e 334 TFT.pixel(263-i,map(pressure_arr[i],press_min,press_max,152,112),Green);
RobertFischer 0:7e22a0e87f8e 335
RobertFischer 0:7e22a0e87f8e 336 }
RobertFischer 0:7e22a0e87f8e 337
RobertFischer 0:7e22a0e87f8e 338 //epaper.write_disp(); // update screen
RobertFischer 0:7e22a0e87f8e 339 TFT.set_orientation(0);
RobertFischer 0:7e22a0e87f8e 340
RobertFischer 0:7e22a0e87f8e 341 }
RobertFischer 0:7e22a0e87f8e 342
RobertFischer 0:7e22a0e87f8e 343 // draw temp and humidity
RobertFischer 0:7e22a0e87f8e 344 void drawTemp(void)
RobertFischer 0:7e22a0e87f8e 345 {
RobertFischer 0:7e22a0e87f8e 346 int done=0;
RobertFischer 0:7e22a0e87f8e 347 float temp,hum;
RobertFischer 0:7e22a0e87f8e 348 while(!done) { //Loop keeps running until RHT03 is read succesfully
RobertFischer 0:7e22a0e87f8e 349 wait(2.2); //Needed to make sure the sensor has time to initalise and so its not polled too quickly
RobertFischer 0:7e22a0e87f8e 350 if(humtemp.readData() == RHT_ERROR_NONE) done=1; //Request data from the RHT03
RobertFischer 0:7e22a0e87f8e 351 }
RobertFischer 0:7e22a0e87f8e 352
RobertFischer 0:7e22a0e87f8e 353 temp = humtemp.getTemperatureC(); //Gets the current temperature in centigrade
RobertFischer 0:7e22a0e87f8e 354 store_temp = temp;
RobertFischer 0:7e22a0e87f8e 355 hum = humtemp.getHumidity(); //Gets the current humidity in percentage
RobertFischer 0:7e22a0e87f8e 356 store_humidity = hum;
RobertFischer 0:7e22a0e87f8e 357
RobertFischer 0:7e22a0e87f8e 358 TFT.set_font((unsigned char*) Times_New_Roman28x27); // select the font
RobertFischer 0:7e22a0e87f8e 359 TFT.locate(156,0);
RobertFischer 0:7e22a0e87f8e 360 printf("%2.0f%cC",temp,127);
RobertFischer 0:7e22a0e87f8e 361 TFT.locate(156,31);
RobertFischer 0:7e22a0e87f8e 362 printf("%2.0f%%",hum);
RobertFischer 0:7e22a0e87f8e 363
RobertFischer 0:7e22a0e87f8e 364 }
RobertFischer 0:7e22a0e87f8e 365
RobertFischer 0:7e22a0e87f8e 366 // read and draw air pressure. later calculate symbol for wheather guess regarding pressure change.
RobertFischer 0:7e22a0e87f8e 367 void drawPressure(void)
RobertFischer 0:7e22a0e87f8e 368 {
RobertFischer 0:7e22a0e87f8e 369 long Pressure, BMP180_Temperature;
RobertFischer 0:7e22a0e87f8e 370
RobertFischer 0:7e22a0e87f8e 371 bmp.readTP(&BMP180_Temperature,&Pressure,OVERSAMPLING_STANDARD);
RobertFischer 0:7e22a0e87f8e 372
RobertFischer 0:7e22a0e87f8e 373 store_pressure = char((Pressure / 50) - 1880);
RobertFischer 0:7e22a0e87f8e 374
RobertFischer 0:7e22a0e87f8e 375 TFT.set_font((unsigned char*) Times_New_Roman28x27); // select the font
RobertFischer 0:7e22a0e87f8e 376 TFT.locate(0,138);
RobertFischer 0:7e22a0e87f8e 377 printf("%4dhPa",Pressure / 100);
RobertFischer 0:7e22a0e87f8e 378 TFT.set_font((unsigned char*) Courier9x15);
RobertFischer 0:7e22a0e87f8e 379 TFT.locate(0,168);
RobertFischer 0:7e22a0e87f8e 380 printf("%i,%1i%cC",BMP180_Temperature/10,BMP180_Temperature%10,127);
RobertFischer 0:7e22a0e87f8e 381
RobertFischer 0:7e22a0e87f8e 382 // Draw some weather icons for test
RobertFischer 0:7e22a0e87f8e 383 int err ;
RobertFischer 0:7e22a0e87f8e 384 err = TFT.BMP_16(2,190,"/sd/rain.bmp"); // load test.bmp from external SD-card
RobertFischer 0:7e22a0e87f8e 385 if (err != 1) TFT.printf(" - Err: %d",err);
RobertFischer 0:7e22a0e87f8e 386
RobertFischer 0:7e22a0e87f8e 387 err = TFT.BMP_16(76,190,"/sd/cloud.bmp"); // load test.bmp from external SD-card
RobertFischer 0:7e22a0e87f8e 388 if (err != 1) TFT.printf(" - Err: %d",err);
RobertFischer 0:7e22a0e87f8e 389
RobertFischer 0:7e22a0e87f8e 390 err = TFT.BMP_16(150,190,"/sd/sun.bmp"); // load test.bmp from external SD-card
RobertFischer 0:7e22a0e87f8e 391 if (err != 1) TFT.printf(" - Err: %d",err);
RobertFischer 0:7e22a0e87f8e 392
RobertFischer 0:7e22a0e87f8e 393 }
RobertFischer 0:7e22a0e87f8e 394
RobertFischer 0:7e22a0e87f8e 395 // draw digital date and time.
RobertFischer 0:7e22a0e87f8e 396 void drawDigitalTime()
RobertFischer 0:7e22a0e87f8e 397 {
RobertFischer 0:7e22a0e87f8e 398 //SetTime(); // Call only once to set date and time on DS3231
RobertFischer 0:7e22a0e87f8e 399
RobertFischer 0:7e22a0e87f8e 400 int date, month, year, hour, minute, second, dayOfWeek;
RobertFischer 0:7e22a0e87f8e 401
RobertFischer 0:7e22a0e87f8e 402 rtc.readDateTime(&dayOfWeek,&date,&month,&year,&hour,&minute,&second);
RobertFischer 0:7e22a0e87f8e 403
RobertFischer 0:7e22a0e87f8e 404 TFT.set_font((unsigned char*) Times_New_Roman28x27); // select the font
RobertFischer 0:7e22a0e87f8e 405 TFT.locate(0,290);
RobertFischer 0:7e22a0e87f8e 406
RobertFischer 0:7e22a0e87f8e 407 if (date > 0) {
RobertFischer 0:7e22a0e87f8e 408 printf("%02i.%02i.%i %02i:%02d",date,month,year,hour,minute);
RobertFischer 0:7e22a0e87f8e 409 } else {
RobertFischer 0:7e22a0e87f8e 410 printf("Error read RTC");
RobertFischer 0:7e22a0e87f8e 411 }
RobertFischer 0:7e22a0e87f8e 412
RobertFischer 0:7e22a0e87f8e 413 }
RobertFischer 0:7e22a0e87f8e 414
RobertFischer 0:7e22a0e87f8e 415 // guess what ;-)
RobertFischer 0:7e22a0e87f8e 416 void SetTime()
RobertFischer 0:7e22a0e87f8e 417 {
RobertFischer 0:7e22a0e87f8e 418 // DS3231
RobertFischer 0:7e22a0e87f8e 419 // hour,minute,second
RobertFischer 0:7e22a0e87f8e 420 rtc.setTime(23,39,0);
RobertFischer 0:7e22a0e87f8e 421 // dayofweek,day,month,year
RobertFischer 0:7e22a0e87f8e 422 rtc.setDate(3,10,5,2014);
RobertFischer 0:7e22a0e87f8e 423
RobertFischer 0:7e22a0e87f8e 424 }
RobertFischer 0:7e22a0e87f8e 425
RobertFischer 0:7e22a0e87f8e 426 // draw hands into analog clock
RobertFischer 0:7e22a0e87f8e 427 void drawAnalogTime()
RobertFischer 0:7e22a0e87f8e 428 {
RobertFischer 0:7e22a0e87f8e 429 int x1, x2, y1, y2, x3, y3, m, h, midHours, second;
RobertFischer 0:7e22a0e87f8e 430
RobertFischer 0:7e22a0e87f8e 431 rtc.readTime(&h,&m,&second);
RobertFischer 0:7e22a0e87f8e 432
RobertFischer 0:7e22a0e87f8e 433 // Draw minute hand
RobertFischer 0:7e22a0e87f8e 434 midHours = m/12;
RobertFischer 0:7e22a0e87f8e 435 m -= 30;
RobertFischer 0:7e22a0e87f8e 436 if ( m < 0 )
RobertFischer 0:7e22a0e87f8e 437 m += 60;
RobertFischer 0:7e22a0e87f8e 438
RobertFischer 0:7e22a0e87f8e 439 m = map(m,0,60,360,0);
RobertFischer 0:7e22a0e87f8e 440
RobertFischer 0:7e22a0e87f8e 441 // Center for single line hand
RobertFischer 0:7e22a0e87f8e 442 // double line hand
RobertFischer 0:7e22a0e87f8e 443 x1 = CLOCK_CENTER_X + 3 * sin(3.14 * ((double) (m - 90))/180);
RobertFischer 0:7e22a0e87f8e 444 y1 = CLOCK_CENTER_Y + 3 * cos(3.14 * ((double) (m - 90))/180);
RobertFischer 0:7e22a0e87f8e 445 x3 = CLOCK_CENTER_X + 3 * sin(3.14 * ((double) (m + 90))/180);
RobertFischer 0:7e22a0e87f8e 446 y3 = CLOCK_CENTER_Y + 3 * cos(3.14 * ((double) (m + 90))/180);
RobertFischer 0:7e22a0e87f8e 447 x2 = CLOCK_CENTER_X + (CLOCK_RADIUS - 20) * sin(3.14 * ((double) m)/180);
RobertFischer 0:7e22a0e87f8e 448 y2 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 20) * cos(3.14 * ((double) m)/180);
RobertFischer 0:7e22a0e87f8e 449 TFT.line(x1,y1,x2,y2,0x001F);
RobertFischer 0:7e22a0e87f8e 450 TFT.line(x3,y3,x2,y2,0x001F);
RobertFischer 0:7e22a0e87f8e 451 TFT.line(x1,y1,x3,y3,0x001F);
RobertFischer 0:7e22a0e87f8e 452
RobertFischer 0:7e22a0e87f8e 453 // Draw hour hand
RobertFischer 0:7e22a0e87f8e 454
RobertFischer 0:7e22a0e87f8e 455 // Calc from 24 to 12 hour
RobertFischer 0:7e22a0e87f8e 456 if ( h > 11 )
RobertFischer 0:7e22a0e87f8e 457 h -= 12;
RobertFischer 0:7e22a0e87f8e 458
RobertFischer 0:7e22a0e87f8e 459 // Rotate 180°. Otherwise clock will be printed upside down
RobertFischer 0:7e22a0e87f8e 460 h = h - 6;
RobertFischer 0:7e22a0e87f8e 461 if ( h < 0 )
RobertFischer 0:7e22a0e87f8e 462 h += 12;
RobertFischer 0:7e22a0e87f8e 463
RobertFischer 0:7e22a0e87f8e 464 // minute correction for hour hand
RobertFischer 0:7e22a0e87f8e 465 h *= 5;
RobertFischer 0:7e22a0e87f8e 466 h += midHours;
RobertFischer 0:7e22a0e87f8e 467
RobertFischer 0:7e22a0e87f8e 468 h = map(h,0,60,360,0);
RobertFischer 0:7e22a0e87f8e 469
RobertFischer 0:7e22a0e87f8e 470 x1 = CLOCK_CENTER_X + 3 * sin(3.14 * ((double) (h - 90))/180);
RobertFischer 0:7e22a0e87f8e 471 y1 = CLOCK_CENTER_Y + 3 * cos(3.14 * ((double) (h - 90))/180);
RobertFischer 0:7e22a0e87f8e 472 x3 = CLOCK_CENTER_X + 3 * sin(3.14 * ((double) (h + 90))/180);
RobertFischer 0:7e22a0e87f8e 473 y3 = CLOCK_CENTER_Y + 3 * cos(3.14 * ((double) (h + 90))/180);
RobertFischer 0:7e22a0e87f8e 474 x2 = CLOCK_CENTER_X + (CLOCK_RADIUS - 32) * sin(3.14 * ((double) h)/180);
RobertFischer 0:7e22a0e87f8e 475 y2 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 32) * cos(3.14 * ((double) h)/180);
RobertFischer 0:7e22a0e87f8e 476 TFT.line(x1,y1,x2,y2,0xF400);
RobertFischer 0:7e22a0e87f8e 477 TFT.line(x3,y3,x2,y2,0xF400);
RobertFischer 0:7e22a0e87f8e 478 TFT.line(x1,y1,x3,y3,0xF400);
RobertFischer 0:7e22a0e87f8e 479
RobertFischer 0:7e22a0e87f8e 480 }
RobertFischer 0:7e22a0e87f8e 481
RobertFischer 0:7e22a0e87f8e 482
RobertFischer 0:7e22a0e87f8e 483 // Draw analog clock w/o hands
RobertFischer 0:7e22a0e87f8e 484 void drawClock(void)
RobertFischer 0:7e22a0e87f8e 485 {
RobertFischer 0:7e22a0e87f8e 486 int x1, x2, y1, y2;
RobertFischer 0:7e22a0e87f8e 487
RobertFischer 0:7e22a0e87f8e 488 TFT.background(White); // set background to black
RobertFischer 0:7e22a0e87f8e 489 TFT.foreground(Black); // set chars to white
RobertFischer 0:7e22a0e87f8e 490 TFT.set_font((unsigned char*) Arial12x12);
RobertFischer 0:7e22a0e87f8e 491
RobertFischer 0:7e22a0e87f8e 492 TFT.fillcircle(CLOCK_CENTER_X,CLOCK_CENTER_Y,CLOCK_RADIUS,0x0000);
RobertFischer 0:7e22a0e87f8e 493 TFT.fillcircle(CLOCK_CENTER_X,CLOCK_CENTER_Y,CLOCK_RADIUS-4,0xFFFF);
RobertFischer 0:7e22a0e87f8e 494
RobertFischer 0:7e22a0e87f8e 495 /*
RobertFischer 0:7e22a0e87f8e 496 TFT.locate( CLOCK_CENTER_X - 8, CLOCK_CENTER_Y - CLOCK_RADIUS + 6);
RobertFischer 0:7e22a0e87f8e 497 printf("12");
RobertFischer 0:7e22a0e87f8e 498 TFT.locate( CLOCK_CENTER_X - CLOCK_RADIUS + 6, CLOCK_CENTER_Y - 6);
RobertFischer 0:7e22a0e87f8e 499 printf("9");
RobertFischer 0:7e22a0e87f8e 500 TFT.locate( CLOCK_CENTER_X + CLOCK_RADIUS - 12, CLOCK_CENTER_Y - 6);
RobertFischer 0:7e22a0e87f8e 501 printf("3");
RobertFischer 0:7e22a0e87f8e 502 TFT.locate( CLOCK_CENTER_X - 2, CLOCK_CENTER_Y + CLOCK_RADIUS - 15);
RobertFischer 0:7e22a0e87f8e 503 printf("6");
RobertFischer 0:7e22a0e87f8e 504 */
RobertFischer 0:7e22a0e87f8e 505
RobertFischer 0:7e22a0e87f8e 506 x1 = CLOCK_CENTER_X - 1;
RobertFischer 0:7e22a0e87f8e 507 y1 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 16);
RobertFischer 0:7e22a0e87f8e 508 x2 = CLOCK_CENTER_X + 1;
RobertFischer 0:7e22a0e87f8e 509 y2 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 6);
RobertFischer 0:7e22a0e87f8e 510 TFT.fillrect(x1,y1,x2,y2,0x0000);
RobertFischer 0:7e22a0e87f8e 511
RobertFischer 0:7e22a0e87f8e 512 x1 = CLOCK_CENTER_X - 1;
RobertFischer 0:7e22a0e87f8e 513 y1 = CLOCK_CENTER_Y - (CLOCK_RADIUS - 6);
RobertFischer 0:7e22a0e87f8e 514 x2 = CLOCK_CENTER_X + 1;
RobertFischer 0:7e22a0e87f8e 515 y2 = CLOCK_CENTER_Y - (CLOCK_RADIUS - 16);
RobertFischer 0:7e22a0e87f8e 516 TFT.fillrect(x1,y1,x2,y2,0x0000);
RobertFischer 0:7e22a0e87f8e 517
RobertFischer 0:7e22a0e87f8e 518 x1 = CLOCK_CENTER_X + (CLOCK_RADIUS - 16);
RobertFischer 0:7e22a0e87f8e 519 y1 = CLOCK_CENTER_Y - 1;
RobertFischer 0:7e22a0e87f8e 520 x2 = CLOCK_CENTER_X + (CLOCK_RADIUS - 6);
RobertFischer 0:7e22a0e87f8e 521 y2 = CLOCK_CENTER_Y + 1;
RobertFischer 0:7e22a0e87f8e 522 TFT.fillrect(x1,y1,x2,y2,0x0000);
RobertFischer 0:7e22a0e87f8e 523
RobertFischer 0:7e22a0e87f8e 524 x1 = CLOCK_CENTER_X - (CLOCK_RADIUS - 6);
RobertFischer 0:7e22a0e87f8e 525 y1 = CLOCK_CENTER_Y - 1;
RobertFischer 0:7e22a0e87f8e 526 x2 = CLOCK_CENTER_X - (CLOCK_RADIUS - 16);
RobertFischer 0:7e22a0e87f8e 527 y2 = CLOCK_CENTER_Y + 1;
RobertFischer 0:7e22a0e87f8e 528 TFT.fillrect(x1,y1,x2,y2,0x0000);
RobertFischer 0:7e22a0e87f8e 529
RobertFischer 0:7e22a0e87f8e 530 x1 = CLOCK_CENTER_X + (CLOCK_RADIUS - 13) * sin(3.14 * ((double) 30)/180);
RobertFischer 0:7e22a0e87f8e 531 y1 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 13) * cos(3.14 * ((double) 30)/180);
RobertFischer 0:7e22a0e87f8e 532 x2 = CLOCK_CENTER_X + (CLOCK_RADIUS - 6) * sin(3.14 * ((double) 30)/180);
RobertFischer 0:7e22a0e87f8e 533 y2 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 6) * cos(3.14 * ((double) 30)/180);
RobertFischer 0:7e22a0e87f8e 534 TFT.line(x1,y1,x2,y2,0x0000);
RobertFischer 0:7e22a0e87f8e 535
RobertFischer 0:7e22a0e87f8e 536 x1 = CLOCK_CENTER_X + (CLOCK_RADIUS - 13) * sin(3.14 * ((double) 60)/180);
RobertFischer 0:7e22a0e87f8e 537 y1 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 13) * cos(3.14 * ((double) 60)/180);
RobertFischer 0:7e22a0e87f8e 538 x2 = CLOCK_CENTER_X + (CLOCK_RADIUS - 6) * sin(3.14 * ((double) 60)/180);
RobertFischer 0:7e22a0e87f8e 539 y2 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 6) * cos(3.14 * ((double) 60)/180);
RobertFischer 0:7e22a0e87f8e 540 TFT.line(x1,y1,x2,y2,0x0000);
RobertFischer 0:7e22a0e87f8e 541
RobertFischer 0:7e22a0e87f8e 542 x1 = CLOCK_CENTER_X + (CLOCK_RADIUS - 13) * sin(3.14 * ((double) 120)/180);
RobertFischer 0:7e22a0e87f8e 543 y1 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 13) * cos(3.14 * ((double) 120)/180);
RobertFischer 0:7e22a0e87f8e 544 x2 = CLOCK_CENTER_X + (CLOCK_RADIUS - 6) * sin(3.14 * ((double) 120)/180);
RobertFischer 0:7e22a0e87f8e 545 y2 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 6) * cos(3.14 * ((double) 120)/180);
RobertFischer 0:7e22a0e87f8e 546 TFT.line(x1,y1,x2,y2,0x0000);
RobertFischer 0:7e22a0e87f8e 547
RobertFischer 0:7e22a0e87f8e 548 x1 = CLOCK_CENTER_X + (CLOCK_RADIUS - 13) * sin(3.14 * ((double) 150)/180);
RobertFischer 0:7e22a0e87f8e 549 y1 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 13) * cos(3.14 * ((double) 150)/180);
RobertFischer 0:7e22a0e87f8e 550 x2 = CLOCK_CENTER_X + (CLOCK_RADIUS - 6) * sin(3.14 * ((double) 150)/180);
RobertFischer 0:7e22a0e87f8e 551 y2 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 6) * cos(3.14 * ((double) 150)/180);
RobertFischer 0:7e22a0e87f8e 552 TFT.line(x1,y1,x2,y2,0x0000);
RobertFischer 0:7e22a0e87f8e 553
RobertFischer 0:7e22a0e87f8e 554 x1 = CLOCK_CENTER_X + (CLOCK_RADIUS - 13) * sin(3.14 * ((double) 210)/180);
RobertFischer 0:7e22a0e87f8e 555 y1 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 13) * cos(3.14 * ((double) 210)/180);
RobertFischer 0:7e22a0e87f8e 556 x2 = CLOCK_CENTER_X + (CLOCK_RADIUS - 6) * sin(3.14 * ((double) 210)/180);
RobertFischer 0:7e22a0e87f8e 557 y2 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 6) * cos(3.14 * ((double) 210)/180);
RobertFischer 0:7e22a0e87f8e 558 TFT.line(x1,y1,x2,y2,0x0000);
RobertFischer 0:7e22a0e87f8e 559
RobertFischer 0:7e22a0e87f8e 560 x1 = CLOCK_CENTER_X + (CLOCK_RADIUS - 13) * sin(3.14 * ((double) 240)/180);
RobertFischer 0:7e22a0e87f8e 561 y1 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 13) * cos(3.14 * ((double) 240)/180);
RobertFischer 0:7e22a0e87f8e 562 x2 = CLOCK_CENTER_X + (CLOCK_RADIUS - 6) * sin(3.14 * ((double) 240)/180);
RobertFischer 0:7e22a0e87f8e 563 y2 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 6) * cos(3.14 * ((double) 240)/180);
RobertFischer 0:7e22a0e87f8e 564 TFT.line(x1,y1,x2,y2,0x0000);
RobertFischer 0:7e22a0e87f8e 565
RobertFischer 0:7e22a0e87f8e 566 x1 = CLOCK_CENTER_X + (CLOCK_RADIUS - 13) * sin(3.14 * ((double) 300)/180);
RobertFischer 0:7e22a0e87f8e 567 y1 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 13) * cos(3.14 * ((double) 300)/180);
RobertFischer 0:7e22a0e87f8e 568 x2 = CLOCK_CENTER_X + (CLOCK_RADIUS - 6) * sin(3.14 * ((double) 300)/180);
RobertFischer 0:7e22a0e87f8e 569 y2 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 6) * cos(3.14 * ((double) 300)/180);
RobertFischer 0:7e22a0e87f8e 570 TFT.line(x1,y1,x2,y2,0x0000);
RobertFischer 0:7e22a0e87f8e 571
RobertFischer 0:7e22a0e87f8e 572 x1 = CLOCK_CENTER_X + (CLOCK_RADIUS - 13) * sin(3.14 * ((double) 330)/180);
RobertFischer 0:7e22a0e87f8e 573 y1 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 13) * cos(3.14 * ((double) 330)/180);
RobertFischer 0:7e22a0e87f8e 574 x2 = CLOCK_CENTER_X + (CLOCK_RADIUS - 6) * sin(3.14 * ((double) 330)/180);
RobertFischer 0:7e22a0e87f8e 575 y2 = CLOCK_CENTER_Y + (CLOCK_RADIUS - 6) * cos(3.14 * ((double) 330)/180);
RobertFischer 0:7e22a0e87f8e 576 TFT.line(x1,y1,x2,y2,0x0000);
RobertFischer 0:7e22a0e87f8e 577
RobertFischer 0:7e22a0e87f8e 578 }
RobertFischer 0:7e22a0e87f8e 579
RobertFischer 0:7e22a0e87f8e 580 // Map funktion copied from Arduino code
RobertFischer 0:7e22a0e87f8e 581 int map (int x, int in_min, int in_max, int out_min, int out_max)
RobertFischer 0:7e22a0e87f8e 582 {
RobertFischer 0:7e22a0e87f8e 583 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
RobertFischer 0:7e22a0e87f8e 584 }