arduinoで時計 その2

#概要

arduinoで時計やってみた。

#写真

![DSCN0542.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e493b399-a4f8-237b-4d01-49c05b38d6bb.jpeg)


#サンプルコード

```
#include <Adafruit_GFX.h>
#include "Adafruit_TFTLCD.h"

#define XP			  	8
#define YP			  	A3
#define XM			  	A2
#define YM			  	9
#define LCD_CS		  	A3
#define LCD_CD		  	A2
#define LCD_WR		  	A1
#define LCD_RD		  	A0
#define LCD_RESET	  	A4
#define BLACK		  	0x0000
#define BLUE			0x001F
#define RED			 	0xF800
#define GREEN		   	0x07E0
#define CYAN			0x07FF
#define MAGENTA		 	0xF81F
#define YELLOW		  	0xFFE0
#define WHITE		   	0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

uint16_t ccenterx,
	ccentery;
const uint16_t cradius = 110;
const float scosConst = 0.0174532925;
float sx = 0,
	sy = 1,
	mx = 1,
	my = 0,
	hx = -1,
	hy = 0;
float sdeg = 0,
	mdeg = 0,
	hdeg = 0;
uint16_t osx,
	osy,
	omx,
	omy,
	ohx,
	ohy;
uint16_t x0 = 0,
	x1 = 0,
	yy0 = 0,
	yy1 = 0;
uint32_t targetTime = 0;
uint8_t hh,
	mm,
	ss;
void drawClockFace() {
	tft.fillCircle(ccenterx, ccentery, cradius, BLUE);
	tft.fillCircle(ccenterx, ccentery, cradius - 4, BLACK);
	for (int i = 0; i < 360; i += 30) 
	{
		sx = cos((i - 90) * scosConst);
		sy = sin((i - 90) * scosConst);
		x0 = sx * (cradius - 4) + ccenterx;
		yy0 = sy * (cradius - 4) + ccentery;
		x1 = sx * (cradius - 11) + ccenterx;
		yy1 = sy * (cradius - 11) + ccentery;
		tft.drawLine(x0, yy0, x1, yy1, BLUE);
	}
}
static uint8_t conv2d(const char * p) {
	uint8_t v = 0;
	if ('0' <= * p && * p <= '9') 
		v = * p - '0';
	return 10 * v + * ++p - '0';
}
void drawClockHands(uint8_t h, uint8_t m, uint8_t s) {
	sdeg = s * 6;
	mdeg = m * 6 + sdeg * 0.01666667;
	hdeg = h * 30 + mdeg * 0.0833333;
	hx = cos((hdeg - 90) * scosConst);
	hy = sin((hdeg - 90) * scosConst);
	mx = cos((mdeg - 90) * scosConst);
	my = sin((mdeg - 90) * scosConst);
	sx = cos((sdeg - 90) * scosConst);
	sy = sin((sdeg - 90) * scosConst);
	tft.drawLine(ohx, ohy, ccenterx + 1, ccentery + 1, BLACK);
	tft.drawLine(omx, omy, ccenterx + 1, ccentery + 1, BLACK);
	tft.drawLine(osx, osy, ccenterx + 1, ccentery + 1, BLACK);
	tft.drawLine(hx * (cradius - 28) + ccenterx + 1, hy * (cradius - 28) + ccentery + 1, ccenterx + 1, ccentery + 1, WHITE);
	tft.drawLine(mx * (cradius - 17) + ccenterx + 1, my * (cradius - 17) + ccentery + 1, ccenterx + 1, ccentery + 1, WHITE);
	tft.drawLine(sx * (cradius - 14) + ccenterx + 1, sy * (cradius - 14) + ccentery + 1, ccenterx + 1, ccentery + 1, RED);
	tft.fillCircle(ccenterx + 1, ccentery + 1, 3, RED);
	osx = sx * (cradius - 14) + ccenterx + 1;
	osy = sy * (cradius - 14) + ccentery + 1;
	omx = mx * (cradius - 17) + ccenterx + 1;
	omy = my * (cradius - 17) + ccentery + 1;
	ohx = hx * (cradius - 28) + ccenterx + 1;
	ohy = hy * (cradius - 28) + ccentery + 1;
}
void drawPrintTime(uint16_t x, uint16_t y, uint8_t h, uint8_t m, uint8_t s) {
	tft.setCursor(0, 0);
	tft.print("clock");
	tft.setCursor(x, y);
	tft.print(__DATE__);
	tft.setCursor(x, y - 13);
	if (hh > 12)
	{
		if (hh < 22)
			tft.print('0');
		tft.print (hh - 12);
	}
	else
	{
		if (hh < 10)
			tft.print('0');
		tft.print (hh);
	}
	tft.print (':');
	if (mm < 10)
		tft.print('0');
	tft.print(mm);
	tft.print(':');
	if (ss < 10)
		tft.print('0');
	tft.print(ss);
	if (hh > 12)
	{
		tft.print(" PM");
	}
	else
	{
		tft.print(" AM");
	}
}
void setup(void) {
	tft.reset();
	uint16_t identifier = 0x9341;
	tft.begin(identifier);
	tft.fillScreen(BLACK);
	tft.setTextColor(WHITE);
	tft.setTextSize(2);
	ccenterx = tft.width() / 2;
	ccentery = tft.height() / 2;
	osx = ccenterx;
	osy = ccentery;
	omx = ccenterx;
	omy = ccentery;
	ohx = ccenterx;
	ohy = ccentery;
	drawClockFace();
	hh = conv2d(__TIME__);
	mm = conv2d(__TIME__ + 3);
	ss = conv2d(__TIME__ + 6);
	targetTime = millis() + 1000;
}
void loop() {
	if (targetTime < millis())
	{
		targetTime = millis() + 1000;
		ss++;
		if (ss == 60)
		{
			ss = 0;
			mm++;
			if (mm > 59)
			{
				mm = 0;
				hh++;
				if (hh > 23)
					hh = 0;
			}
		}
		drawClockHands(hh, mm, ss);
		tft.fillRect(30, 282, 180, 20, RED);
		drawPrintTime(34, 300, hh, mm, ss);
	}
}





```

以上。