100 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
| // Spiro
 | |
| // Rainbow patern generator
 | |
| 
 | |
| #include <TFT_eSPI.h> // Hardware-specific library
 | |
| #include <SPI.h>
 | |
| 
 | |
| TFT_eSPI tft = TFT_eSPI();       // Invoke custom library
 | |
| 
 | |
| #define DEG2RAD 0.0174532925 // Convert angles in degrees to radians
 | |
| 
 | |
| unsigned long runTime = 0;
 | |
| 
 | |
| float sx = 0, sy = 0;
 | |
| uint16_t x0 = 0, x1 = 0, yy0 = 0, yy1 = 0;
 | |
| 
 | |
| void setup()
 | |
| {
 | |
|   //randomSeed(analogRead(A0));
 | |
| 
 | |
|   // Setup the LCD
 | |
|   tft.init();
 | |
|   tft.setRotation(3);
 | |
| }
 | |
| 
 | |
| void loop()
 | |
| {
 | |
|   runTime = millis();
 | |
| 
 | |
|   tft.fillScreen(TFT_BLACK);
 | |
|   int n = random(2, 23), r = random(20, 100), colour = 0; //rainbow();
 | |
| 
 | |
|   for (long i = 0; i < (360 * n); i++) {
 | |
|     sx = cos((i / n - 90) * DEG2RAD);
 | |
|     sy = sin((i / n - 90) * DEG2RAD);
 | |
|     x0 = sx * (120 - r) + 159;
 | |
|     yy0 = sy * (120 - r) + 119;
 | |
| 
 | |
| 
 | |
|     sy = cos(((i % 360) - 90) * DEG2RAD);
 | |
|     sx = sin(((i % 360) - 90) * DEG2RAD);
 | |
|     x1 = sx * r + x0;
 | |
|     yy1 = sy * r + yy0;
 | |
|     tft.drawPixel(x1, yy1, rainbow(map(i%360,0,360,0,127))); //colour);
 | |
|   }
 | |
|   
 | |
|   r = random(20, 100);//r = r / random(2,4);
 | |
|   for (long i = 0; i < (360 * n); i++) {
 | |
|     sx = cos((i / n - 90) * DEG2RAD);
 | |
|     sy = sin((i / n - 90) * DEG2RAD);
 | |
|     x0 = sx * (120 - r) + 159;
 | |
|     yy0 = sy * (120 - r) + 119;
 | |
| 
 | |
| 
 | |
|     sy = cos(((i % 360) - 90) * DEG2RAD);
 | |
|     sx = sin(((i % 360) - 90) * DEG2RAD);
 | |
|     x1 = sx * r + x0;
 | |
|     yy1 = sy * r + yy0;
 | |
|     tft.drawPixel(x1, yy1, rainbow(map(i%360,0,360,0,127))); //colour);
 | |
|   }
 | |
| 
 | |
| 
 | |
|   delay(2000);
 | |
| }
 | |
| 
 | |
| unsigned int rainbow(int value)
 | |
| {
 | |
|   // Value is expected to be in range 0-127
 | |
|   // The value is converted to a spectrum colour from 0 = blue through to red = blue
 | |
|   //int value = random (128);
 | |
|   byte red = 0; // Red is the top 5 bits of a 16 bit colour value
 | |
|   byte green = 0;// Green is the middle 6 bits
 | |
|   byte blue = 0; // Blue is the bottom 5 bits
 | |
| 
 | |
|   byte quadrant = value / 32;
 | |
| 
 | |
|   if (quadrant == 0) {
 | |
|     blue = 31;
 | |
|     green = 2 * (value % 32);
 | |
|     red = 0;
 | |
|   }
 | |
|   if (quadrant == 1) {
 | |
|     blue = 31 - (value % 32);
 | |
|     green = 63;
 | |
|     red = 0;
 | |
|   }
 | |
|   if (quadrant == 2) {
 | |
|     blue = 0;
 | |
|     green = 63;
 | |
|     red = value % 32;
 | |
|   }
 | |
|   if (quadrant == 3) {
 | |
|     blue = 0;
 | |
|     green = 63 - 2 * (value % 32);
 | |
|     red = 31;
 | |
|   }
 | |
|   return (red << 11) + (green << 5) + blue;
 | |
| }
 | |
| 
 | |
| 
 |