Components and supplies
3D Printable Parts
Arduino Nano R3
RGB Stribe Led
HC-06 Bluetooth Module
DS3231MPMB1 Peripheral Module
Tools and machines
3D Printer (generic)
Soldering iron (generic)
Project description
Code
Arduino Nano Code
arduino
Time and animation codes are in files
1 2#include <DS3231.h> 3#include <Adafruit_NeoPixel.h> 4#ifdef __AVR__ 5 #include <avr/power.h> 6#endif 7 8#define PIN 6 9#define PIN2 7 10 11 12#define NUMPIXELS 60 13DS3231 rtc(SDA, SCL); 14Time t; 15int hr; 16int mnt; 17int sc; 18char data; 19char color_select; 20int h_red_deger=255; 21int h_green_deger=0; 22int h_blue_deger=0; 23int m_red_deger=0; 24int m_green_deger=255; 25int m_blue_deger=0; 26int s_red_deger=255; 27int s_green_deger=255; 28int s_blue_deger=0; 29Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); 30Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(12, PIN2, NEO_GRB + NEO_KHZ800); 31Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800); 32Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(12, PIN2, NEO_GRB + NEO_KHZ800); 33 34 35int delayval = 10; 36 37void setup() { 38 Serial.begin(9600); 39 rtc.begin(); 40 41#if defined (__AVR_ATtiny85__) 42 if (F_CPU == 16000000) clock_prescale_set(clock_div_1); 43#endif 44 // End of trinket special code 45 46 pixels.begin(); // This initializes the NeoPixel library. 47 pixels2.begin(); 48 strip.begin(); 49 strip.show(); 50 strip2.begin(); 51 strip2.show(); 52// 53} 54 55void loop() { 56 57 while(Serial.available() > 0) // balant kuruluyken 58 { 59 delay(10); 60 char c = Serial.read(); 61 data=c; 62 if(data=='m') 63 { 64 data=' '; 65 t = rtc.getTime(); 66 hr=t.hour; 67 mnt=t.min; 68 sc=t.sec; 69 while(data!='m') 70 { 71 data=Serial.read(); 72 if(data=='+') 73 { 74 hr++; 75 } 76 if(data=='-') 77 { 78 hr--; 79 } 80 for(int i=0;i<12;i++){pixels2.setPixelColor(i, pixels2.Color(0,255,10));} 81 pixels2.show(); 82 if(hr>=12){hr=hr-12;} 83 if(hr<0){hr=hr+12;} 84 pixels2.setPixelColor(hr, pixels2.Color(255,0,0)); 85 pixels2.show(); 86 delay(100); 87 pixels2.setPixelColor(hr, pixels2.Color(0,0,0)); 88 pixels2.show(); 89 delay(100); 90 } 91 rtc.setTime(hr,mnt,sc); 92 if(data=='m') 93 { 94 data=' '; 95 t = rtc.getTime(); 96 hr=t.hour; 97 mnt=t.min; 98 sc=t.sec; 99 while(data!='m') 100 { 101 data=Serial.read(); 102 if(data=='+') 103 { 104 mnt++; 105 if(mnt==60) 106 {mnt=0;} 107 } 108 if(data=='-') 109 { 110 if(mnt==0) 111 {mnt=60;} 112 113 mnt--; 114 } 115 for(int k=0;k<60;k++){pixels.setPixelColor(k, pixels.Color(0,0,0));} 116 for(int k=0;k<60;k++){pixels.setPixelColor(k, pixels.Color(25,25,255));k=k+4;} 117 118 pixels.setPixelColor(mnt, pixels.Color(0,250,0)); 119 pixels.show(); 120 delay(100); 121 pixels.setPixelColor(mnt, pixels.Color(0,0,0)); 122 pixels.show(); 123 delay(100); 124 } 125 } 126 127 rtc.setTime(hr,mnt,sc); 128 data=' '; 129 } 130 131 132 133 134 if(data=='H') 135 { 136 color_select=data; 137 } 138 if(data=='M') 139 { 140 color_select=data; 141 } 142 if(data=='S') 143 { 144 color_select=data; 145 } 146 if(data=='A') 147 { 148 data=' '; 149 colorWipe(strip.Color(255, 0, 0), 50); // Red 150 colorWipe(strip.Color(0, 255, 0), 50); // Green 151 colorWipe(strip.Color(0, 0, 255), 50); // Blue 152//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW 153 // Send a theater pixel chase in... 154 theaterChase(strip.Color(127, 127, 127), 50); // White 155 theaterChase(strip.Color(127, 0, 0), 50); // Red 156 theaterChase(strip.Color(0, 0, 127), 50); // Blue 157 158 rainbow(20); 159 rainbowCycle(20); 160 theaterChaseRainbow(50); 161 } 162 if(data=='r'&&color_select=='H') 163 { 164 h_red_deger=Serial.parseInt(); 165 pixels2.setPixelColor(hr, pixels2.Color(h_red_deger,h_green_deger, h_blue_deger)); 166 pixels2.show(); 167 168 169 } 170 171 if(data=='g'&&color_select=='H') 172 { h_green_deger=Serial.parseInt(); 173 pixels2.setPixelColor(hr, pixels2.Color(h_red_deger,h_green_deger, h_blue_deger)); 174 pixels2.show(); 175 } 176 if(data=='b'&&color_select=='H') 177 { 178 h_blue_deger=Serial.parseInt(); 179 pixels2.setPixelColor(hr, pixels2.Color(h_red_deger,h_green_deger, h_blue_deger)); 180 pixels2.show(); 181 } 182 183 184 185 if(data=='r'&&color_select=='M') 186 { 187 m_red_deger=Serial.parseInt(); 188 pixels.setPixelColor(mnt, pixels.Color(m_red_deger,m_green_deger,m_blue_deger)); 189 pixels.show(); 190 191 192 } 193 194 if(data=='g'&&color_select=='M') 195 { m_green_deger=Serial.parseInt(); 196 pixels.setPixelColor(mnt, pixels.Color(m_red_deger,m_green_deger,m_blue_deger)); 197 pixels.show(); 198 } 199 if(data=='b'&&color_select=='M') 200 { 201 m_blue_deger=Serial.parseInt(); 202 pixels.setPixelColor(mnt, pixels.Color(m_red_deger,m_green_deger,m_blue_deger)); 203 pixels.show(); 204 } 205 206 207if(data=='r'&&color_select=='S') 208 { 209 s_red_deger=Serial.parseInt(); 210 pixels.setPixelColor(sc, pixels.Color(s_red_deger,s_green_deger,s_blue_deger)); 211 pixels.show(); 212 213 214 } 215 216 if(data=='g'&&color_select=='S') 217 { s_green_deger=Serial.parseInt(); 218 pixels.setPixelColor(sc, pixels.Color(s_red_deger,s_green_deger,s_blue_deger)); 219 pixels.show(); 220 } 221 if(data=='b'&&color_select=='S') 222 { 223 s_blue_deger=Serial.parseInt(); 224 pixels.setPixelColor(sc, pixels.Color(s_red_deger,s_green_deger,s_blue_deger)); 225 pixels.show(); 226 } 227 228 229 230 231 232 } 233 t = rtc.getTime(); 234 hr=t.hour; 235 mnt=t.min; 236 sc=t.sec; 237 238 239 pixels.setPixelColor(sc, pixels.Color(s_red_deger,s_green_deger,s_blue_deger)); 240 pixels.setPixelColor(mnt, pixels.Color(m_red_deger,m_green_deger,m_blue_deger)); 241 pixels.show(); 242 243 for(int i=0;i<12;i++){ 244 if(i==hr) 245 {i++;} 246 pixels2.setPixelColor(i, pixels2.Color(0,255,0));} 247 pixels2.show(); 248 if(hr>=12){hr=hr-12;} 249 pixels2.setPixelColor(hr, pixels2.Color(h_red_deger,h_green_deger,h_blue_deger)); 250 pixels2.show(); 251 delay(10); 252 pixels.setPixelColor(sc, pixels.Color(0,0,0)); 253 for(int k=0;k<60;k++){pixels.setPixelColor(k, pixels.Color(0,0,0));} 254 for(int k=0;k<60;k++){pixels.setPixelColor(k, pixels.Color(25,25,255));k=k+4;} 255 pixels.setPixelColor(mnt, pixels.Color(0,0,0)); 256 pixels.show(); 257 258 259 260 261} 262 263 264 265 266 267 268 269 270 271 272 273 274 275void colorWipe(uint32_t c, uint8_t wait) { 276 for(uint16_t i=0; i<strip.numPixels(); i++) { 277 strip.setPixelColor(i, c); 278 strip.show(); 279 280 strip2.setPixelColor(i, c); 281 strip2.show(); 282 delay(wait); 283 } 284} 285 286void rainbow(uint8_t wait) { 287 uint16_t i, j; 288 289 for(j=0; j<256; j++) { 290 for(i=0; i<strip.numPixels(); i++) { 291 strip.setPixelColor(i, Wheel((i+j) & 255)); 292 strip2.setPixelColor(i, Wheel((i+j) & 255)); 293 } 294 strip2.show(); 295 296 strip.show(); 297 delay(wait); 298 } 299} 300 301// Slightly different, this makes the rainbow equally distributed throughout 302void rainbowCycle(uint8_t wait) { 303 uint16_t i, j; 304 305 for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel 306 for(i=0; i< strip.numPixels(); i++) { 307 strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); 308 strip2.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); 309 } 310 strip.show(); 311 strip2.show(); 312 delay(wait); 313 } 314} 315 316//Theatre-style crawling lights. 317void theaterChase(uint32_t c, uint8_t wait) { 318 for (int j=0; j<10; j++) { //do 10 cycles of chasing 319 for (int q=0; q < 3; q++) { 320 for (int i=0; i < strip.numPixels(); i=i+3) { 321 strip.setPixelColor(i+q, c); //turn every third pixel on 322 strip2.setPixelColor(i+q, c); 323 } 324 strip2.show(); 325 strip.show(); 326 327 delay(wait); 328 329 for (int i=0; i < strip.numPixels(); i=i+3) { 330 strip.setPixelColor(i+q, 0); //turn every third pixel off 331 strip2.setPixelColor(i+q, 0); 332 } 333 } 334 } 335} 336 337//Theatre-style crawling lights with rainbow effect 338void theaterChaseRainbow(uint8_t wait) { 339 for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel 340 for (int q=0; q < 3; q++) { 341 for (int i=0; i < strip.numPixels(); i=i+3) { 342 strip.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on 343 strip2.setPixelColor(i+q, Wheel( (i+j) % 255)); 344 } 345 strip2.show(); 346 strip.show(); 347 348 delay(wait); 349 350 for (int i=0; i < strip.numPixels(); i=i+3) { 351 strip.setPixelColor(i+q, 0); //turn every third pixel off 352 strip2.setPixelColor(i+q, 0); 353 } 354 } 355 } 356} 357 358// Input a value 0 to 255 to get a color value. 359// The colours are a transition r - g - b - back to r. 360uint32_t Wheel(byte WheelPos) { 361 WheelPos = 255 - WheelPos; 362 if(WheelPos < 85) { 363 return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); 364 } 365 if(WheelPos < 170) { 366 WheelPos -= 85; 367 return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); 368 } 369 WheelPos -= 170; 370 return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); 371} 372 373 374
Arduino Nano Code
arduino
Time and animation codes are in files
1 2#include <DS3231.h> 3#include <Adafruit_NeoPixel.h> 4#ifdef __AVR__ 5 6 #include <avr/power.h> 7#endif 8 9#define PIN 6 10#define PIN2 11 7 12 13 14#define NUMPIXELS 60 15DS3231 rtc(SDA, SCL); 16Time 17 t; 18int hr; 19int mnt; 20int sc; 21char data; 22char color_select; 23int 24 h_red_deger=255; 25int h_green_deger=0; 26int h_blue_deger=0; 27int m_red_deger=0; 28int 29 m_green_deger=255; 30int m_blue_deger=0; 31int s_red_deger=255; 32int s_green_deger=255; 33int 34 s_blue_deger=0; 35Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, 36 NEO_GRB + NEO_KHZ800); 37Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(12, PIN2, 38 NEO_GRB + NEO_KHZ800); 39Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB 40 + NEO_KHZ800); 41Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(12, PIN2, NEO_GRB 42 + NEO_KHZ800); 43 44 45int delayval = 10; 46 47void setup() { 48 Serial.begin(9600); 49 50 rtc.begin(); 51 52#if defined (__AVR_ATtiny85__) 53 if (F_CPU == 16000000) 54 clock_prescale_set(clock_div_1); 55#endif 56 // End of trinket special code 57 58 59 pixels.begin(); // This initializes the NeoPixel library. 60 pixels2.begin(); 61 62 strip.begin(); 63 strip.show(); 64 strip2.begin(); 65 strip2.show(); 66// 67} 68 69void 70 loop() { 71 72 while(Serial.available() > 0) // balant kuruluyken 73 { 74 delay(10); 75 76 char c = Serial.read(); 77 data=c; 78 if(data=='m') 79 { 80 data=' 81 '; 82 t = rtc.getTime(); 83 hr=t.hour; 84 mnt=t.min; 85 sc=t.sec; 86 87 while(data!='m') 88 { 89 data=Serial.read(); 90 if(data=='+') 91 92 { 93 hr++; 94 } 95 if(data=='-') 96 { 97 98 hr--; 99 } 100 for(int i=0;i<12;i++){pixels2.setPixelColor(i, 101 pixels2.Color(0,255,10));} 102 pixels2.show(); 103 if(hr>=12){hr=hr-12;} 104 105 if(hr<0){hr=hr+12;} 106 pixels2.setPixelColor(hr, pixels2.Color(255,0,0)); 107 108 pixels2.show(); 109 delay(100); 110 pixels2.setPixelColor(hr, 111 pixels2.Color(0,0,0)); 112 pixels2.show(); 113 delay(100); 114 } 115 116 rtc.setTime(hr,mnt,sc); 117 if(data=='m') 118 { 119 data=' 120 '; 121 t = rtc.getTime(); 122 hr=t.hour; 123 mnt=t.min; 124 125 sc=t.sec; 126 while(data!='m') 127 { 128 data=Serial.read(); 129 130 if(data=='+') 131 { 132 mnt++; 133 if(mnt==60) 134 135 {mnt=0;} 136 } 137 if(data=='-') 138 { 139 140 if(mnt==0) 141 {mnt=60;} 142 143 mnt--; 144 145 } 146 for(int k=0;k<60;k++){pixels.setPixelColor(k, pixels.Color(0,0,0));} 147 148 for(int k=0;k<60;k++){pixels.setPixelColor(k, pixels.Color(25,25,255));k=k+4;} 149 150 151 pixels.setPixelColor(mnt, pixels.Color(0,250,0)); 152 pixels.show(); 153 154 delay(100); 155 pixels.setPixelColor(mnt, pixels.Color(0,0,0)); 156 157 pixels.show(); 158 delay(100); 159 } 160 161 } 162 163 rtc.setTime(hr,mnt,sc); 164 data=' '; 165 166 } 167 168 169 170 171 if(data=='H') 172 { 173 color_select=data; 174 175 } 176 if(data=='M') 177 { 178 color_select=data; 179 } 180 181 if(data=='S') 182 { 183 color_select=data; 184 } 185 if(data=='A') 186 187 { 188 data=' '; 189 colorWipe(strip.Color(255, 0, 0), 50); // Red 190 191 colorWipe(strip.Color(0, 255, 0), 50); // Green 192 colorWipe(strip.Color(0, 193 0, 255), 50); // Blue 194//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW 195 196 // Send a theater pixel chase in... 197 theaterChase(strip.Color(127, 127, 127), 198 50); // White 199 theaterChase(strip.Color(127, 0, 0), 50); // Red 200 theaterChase(strip.Color(0, 201 0, 127), 50); // Blue 202 203 rainbow(20); 204 rainbowCycle(20); 205 theaterChaseRainbow(50); 206 207 } 208 if(data=='r'&&color_select=='H') 209 { 210 h_red_deger=Serial.parseInt(); 211 212 pixels2.setPixelColor(hr, pixels2.Color(h_red_deger,h_green_deger, h_blue_deger)); 213 214 pixels2.show(); 215 216 217 } 218 219 if(data=='g'&&color_select=='H') 220 221 { h_green_deger=Serial.parseInt(); 222 pixels2.setPixelColor(hr, 223 pixels2.Color(h_red_deger,h_green_deger, h_blue_deger)); 224 pixels2.show(); 225 226 } 227 if(data=='b'&&color_select=='H') 228 { 229 h_blue_deger=Serial.parseInt(); 230 231 pixels2.setPixelColor(hr, pixels2.Color(h_red_deger,h_green_deger, h_blue_deger)); 232 233 pixels2.show(); 234 } 235 236 237 238 if(data=='r'&&color_select=='M') 239 240 { 241 m_red_deger=Serial.parseInt(); 242 pixels.setPixelColor(mnt, 243 pixels.Color(m_red_deger,m_green_deger,m_blue_deger)); 244 pixels.show(); 245 246 247 248 } 249 250 if(data=='g'&&color_select=='M') 251 252 { m_green_deger=Serial.parseInt(); 253 pixels.setPixelColor(mnt, 254 pixels.Color(m_red_deger,m_green_deger,m_blue_deger)); 255 pixels.show(); 256 257 } 258 if(data=='b'&&color_select=='M') 259 { 260 m_blue_deger=Serial.parseInt(); 261 262 pixels.setPixelColor(mnt, pixels.Color(m_red_deger,m_green_deger,m_blue_deger)); 263 264 pixels.show(); 265 } 266 267 268if(data=='r'&&color_select=='S') 269 270 { 271 s_red_deger=Serial.parseInt(); 272 pixels.setPixelColor(sc, 273 pixels.Color(s_red_deger,s_green_deger,s_blue_deger)); 274 pixels.show(); 275 276 277 278 } 279 280 if(data=='g'&&color_select=='S') 281 282 { s_green_deger=Serial.parseInt(); 283 pixels.setPixelColor(sc, pixels.Color(s_red_deger,s_green_deger,s_blue_deger)); 284 285 pixels.show(); 286 } 287 if(data=='b'&&color_select=='S') 288 289 { 290 s_blue_deger=Serial.parseInt(); 291 pixels.setPixelColor(sc, 292 pixels.Color(s_red_deger,s_green_deger,s_blue_deger)); 293 pixels.show(); 294 295 } 296 297 298 299 300 301 } 302 t = rtc.getTime(); 303 304 hr=t.hour; 305 mnt=t.min; 306 sc=t.sec; 307 308 309 310 pixels.setPixelColor(sc, pixels.Color(s_red_deger,s_green_deger,s_blue_deger)); 311 312 pixels.setPixelColor(mnt, pixels.Color(m_red_deger,m_green_deger,m_blue_deger)); 313 314 pixels.show(); 315 316 for(int i=0;i<12;i++){ 317 if(i==hr) 318 {i++;} 319 320 pixels2.setPixelColor(i, pixels2.Color(0,255,0));} 321 pixels2.show(); 322 323 if(hr>=12){hr=hr-12;} 324 pixels2.setPixelColor(hr, pixels2.Color(h_red_deger,h_green_deger,h_blue_deger)); 325 326 pixels2.show(); 327 delay(10); 328 pixels.setPixelColor(sc, pixels.Color(0,0,0)); 329 330 for(int k=0;k<60;k++){pixels.setPixelColor(k, pixels.Color(0,0,0));} 331 for(int 332 k=0;k<60;k++){pixels.setPixelColor(k, pixels.Color(25,25,255));k=k+4;} 333 pixels.setPixelColor(mnt, 334 pixels.Color(0,0,0)); 335 pixels.show(); 336 337 338 339 340} 341 342 343 344 345 346 347 348 349 350 351 352 353 354void 355 colorWipe(uint32_t c, uint8_t wait) { 356 for(uint16_t i=0; i<strip.numPixels(); 357 i++) { 358 strip.setPixelColor(i, c); 359 strip.show(); 360 361 strip2.setPixelColor(i, 362 c); 363 strip2.show(); 364 delay(wait); 365 } 366} 367 368void rainbow(uint8_t 369 wait) { 370 uint16_t i, j; 371 372 for(j=0; j<256; j++) { 373 for(i=0; i<strip.numPixels(); 374 i++) { 375 strip.setPixelColor(i, Wheel((i+j) & 255)); 376 strip2.setPixelColor(i, 377 Wheel((i+j) & 255)); 378 } 379 strip2.show(); 380 381 strip.show(); 382 383 delay(wait); 384 } 385} 386 387// Slightly different, this makes the rainbow 388 equally distributed throughout 389void rainbowCycle(uint8_t wait) { 390 uint16_t 391 i, j; 392 393 for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel 394 for(i=0; 395 i< strip.numPixels(); i++) { 396 strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) 397 + j) & 255)); 398 strip2.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) 399 + j) & 255)); 400 } 401 strip.show(); 402 strip2.show(); 403 delay(wait); 404 405 } 406} 407 408//Theatre-style crawling lights. 409void theaterChase(uint32_t c, 410 uint8_t wait) { 411 for (int j=0; j<10; j++) { //do 10 cycles of chasing 412 for 413 (int q=0; q < 3; q++) { 414 for (int i=0; i < strip.numPixels(); i=i+3) { 415 416 strip.setPixelColor(i+q, c); //turn every third pixel on 417 strip2.setPixelColor(i+q, 418 c); 419 } 420 strip2.show(); 421 strip.show(); 422 423 delay(wait); 424 425 426 for (int i=0; i < strip.numPixels(); i=i+3) { 427 strip.setPixelColor(i+q, 428 0); //turn every third pixel off 429 strip2.setPixelColor(i+q, 0); 430 431 } 432 } 433 } 434} 435 436//Theatre-style crawling lights with rainbow 437 effect 438void theaterChaseRainbow(uint8_t wait) { 439 for (int j=0; j < 256; j++) 440 { // cycle all 256 colors in the wheel 441 for (int q=0; q < 3; q++) { 442 443 for (int i=0; i < strip.numPixels(); i=i+3) { 444 strip.setPixelColor(i+q, 445 Wheel( (i+j) % 255)); //turn every third pixel on 446 strip2.setPixelColor(i+q, 447 Wheel( (i+j) % 255)); 448 } 449 strip2.show(); 450 strip.show(); 451 452 453 delay(wait); 454 455 for (int i=0; i < strip.numPixels(); i=i+3) { 456 457 strip.setPixelColor(i+q, 0); //turn every third pixel off 458 strip2.setPixelColor(i+q, 459 0); 460 } 461 } 462 } 463} 464 465// Input a value 0 to 255 to get a color 466 value. 467// The colours are a transition r - g - b - back to r. 468uint32_t Wheel(byte 469 WheelPos) { 470 WheelPos = 255 - WheelPos; 471 if(WheelPos < 85) { 472 return 473 strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); 474 } 475 if(WheelPos < 170) 476 { 477 WheelPos -= 85; 478 return strip.Color(0, WheelPos * 3, 255 - WheelPos 479 * 3); 480 } 481 WheelPos -= 170; 482 return strip.Color(WheelPos * 3, 255 - WheelPos 483 * 3, 0); 484} 485 486 487
Downloadable files
ClockAPK
controlling by your phone
ClockAPK
Schematic
Schematic
ClockAPK
controlling by your phone
ClockAPK
Comments
Only logged in users can leave comments
TheTNR
0 Followers
•0 Projects
Table of contents
Intro
36
0