/******************************************************************************************************************************************************** * * * Project: FFT Spectrum Analyzer * * Target Platform: ESP32 * * * * Version: 1.0 * * Hardware setup: See github * * Spectrum analyses done with analog chips MSGEQ7 * * * * Mark Donners * * The Electronic Engineer * * Website: www.theelectronicengineer.nl * * facebook: https://www.facebook.com/TheelectronicEngineer * * youtube: https://www.youtube.com/channel/UCm5wy-2RoXGjG2F9wpDFF3w * * github: https://github.com/donnersm * * * ********************************************************************************************************************************************************/ /* This part of the code ( the fire part) has been adapted and heavly alterted from * Patrick Rigney (https://www.toggledbits.com/) * Github: https://github.com/toggledbits/MatrixFireFast */ #pragma once #include "Settings.h" #define MAT_W kMatrixWidth /* Size (columns) of entire matrix */ #define MAT_H kMatrixHeight /* and rows */ const uint16_t rows = MAT_H; const uint16_t cols = MAT_W; const uint16_t xorg = 0; const uint16_t yorg = 0; uint8_t pix[rows][cols]; const uint8_t NCOLORS = (sizeof(colors)/sizeof(colors[0])); uint8_t nflare = 0; uint32_t flare[maxflare]; const uint8_t phy_h = MAT_W; const uint8_t phy_w = MAT_H; unsigned long t = 0; /* keep time */ uint16_t pos( uint16_t col, uint16_t row ) { uint16_t phy_x = xorg + (uint16_t) row; uint16_t phy_y = yorg + (uint16_t) col; return phy_x + phy_y * phy_w; } uint32_t isqrt(uint32_t n) { if ( n < 2 ) return n; uint32_t smallCandidate = isqrt(n >> 2) << 1; uint32_t largeCandidate = smallCandidate + 1; return (largeCandidate*largeCandidate > n) ? smallCandidate : largeCandidate; } // Set pixels to intensity around flare void glow( int x, int y, int z ) { int b = z * 10 / flaredecay + 1; for ( int i=(y-b); i<(y+b); ++i ) { for ( int j=(x-b); j<(x+b); ++j ) { if ( i >=0 && j >= 0 && i < rows && j < cols ) { int d = ( flaredecay * isqrt((x-j)*(x-j) + (y-i)*(y-i)) + 5) / 10; uint8_t n = 0; if ( z > d ) n = z - d; if ( n > pix[i][j] ) { // can only get brighter pix[i][j] = n; } } } } } void newflare() { if ( nflare < maxflare && random(1,101) <= flarechance ) { int x = random(0, cols); int y = random(0, flarerows); int z = NCOLORS - 1; flare[nflare++] = (z<<16) | (y<<8) | (x&0xff); glow( x, y, z ); } }