Advertisement
olelek

esp_rgb_matrix

Nov 30th, 2022
1,302
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 3.75 KB | Source Code | 0 0
  1.  
  2.  
  3. #define RGB_DATA  D2
  4. #define RGB_CLOCK D3
  5. #define RGB_LATCH D4
  6.  
  7. #define SIZE_MATRIX 8
  8. #define NO_MATRIX 3
  9. #define BIT_COLOR_DEPTH 3
  10.  
  11. uint32_t framebuffer[SIZE_MATRIX][SIZE_MATRIX*NO_MATRIX];
  12.  
  13. uint8_t pwm_counter=0;
  14.  
  15. enum COLOR_T{CL_BLUE=0, CL_GREEN=1, CL_RED=2};
  16.  
  17. uint8_t extractColor(uint32_t *pixel, COLOR_T color){
  18.   return (uint8_t)( ((*pixel)>>((uint8_t)color*8)) & 0xFF ) ;
  19. }
  20.  
  21. uint8_t combineRow(uint32_t *fst, COLOR_T color, uint8_t treshold){
  22.   uint8_t ret=0;
  23.     for(uint8_t i=0;i<8;++i){
  24.       if(extractColor(&fst[i], color) > treshold)
  25.         ret += (1<<i);
  26.     }
  27.  
  28.   return ret;
  29. }
  30.  
  31. //spi transfer one byte, without latch control
  32. void transfer(uint8_t a){
  33.  
  34.   for(volatile uint8_t ibit=0;ibit<8;++ibit){
  35.     digitalWrite(RGB_DATA, a & (1<<ibit));
  36.     digitalWrite(RGB_CLOCK, HIGH);
  37.     digitalWrite(RGB_CLOCK, LOW);
  38.   }
  39.  
  40. }
  41.  
  42. void display_task(void){
  43.   static uint8_t displayed_row;
  44.  
  45.   displayed_row = (++displayed_row) % SIZE_MATRIX;
  46.   //Serial.print("Sending value: ");
  47.   //Serial.println(++a, HEX);
  48.  
  49.   for(pwm_counter=0;pwm_counter<(1<<(BIT_COLOR_DEPTH-1));++pwm_counter){
  50.     transfer( combineRow(&framebuffer[displayed_row][0*SIZE_MATRIX], CL_BLUE, pwm_counter)); //blue row, columns 0-7
  51.     transfer( combineRow(&framebuffer[displayed_row][0*SIZE_MATRIX], CL_GREEN, pwm_counter)); //green row, columns 0-7
  52.     transfer( combineRow(&framebuffer[displayed_row][0*SIZE_MATRIX], CL_RED, pwm_counter));    //red row, columns 0-7
  53.     transfer((1<<displayed_row));    //row selection :1
  54.     transfer( combineRow(&framebuffer[displayed_row][1*SIZE_MATRIX], CL_BLUE, pwm_counter)); //blue row, columns 0-7
  55.     transfer( combineRow(&framebuffer[displayed_row][1*SIZE_MATRIX], CL_GREEN, pwm_counter)); //green row, columns 0-7
  56.     transfer( combineRow(&framebuffer[displayed_row][1*SIZE_MATRIX], CL_RED, pwm_counter));    //red row, columns 0-7
  57.     transfer((1<<displayed_row));    //row selection :1
  58.     transfer( combineRow(&framebuffer[displayed_row][2*SIZE_MATRIX], CL_BLUE, pwm_counter)); //blue row, columns 0-7
  59.     transfer( combineRow(&framebuffer[displayed_row][2*SIZE_MATRIX], CL_GREEN, pwm_counter)); //green row, columns 0-7
  60.     transfer( combineRow(&framebuffer[displayed_row][2*SIZE_MATRIX], CL_RED, pwm_counter));    //red row, columns 0-7
  61.     transfer((1<<displayed_row));    //row selection :1
  62.     digitalWrite(RGB_LATCH, HIGH);
  63.     digitalWrite(RGB_LATCH, LOW);
  64.     delayMicroseconds(1);
  65.   }
  66.  
  67.  
  68.  
  69. }
  70.  
  71. void setup() {
  72.   // put your setup code here, to run once:
  73.  
  74.   Serial.begin(9600);
  75.   pinMode(RGB_DATA, OUTPUT);
  76.   pinMode(RGB_CLOCK, OUTPUT);
  77.   pinMode(RGB_LATCH, OUTPUT);
  78.   digitalWrite(RGB_DATA, LOW);
  79.   digitalWrite(RGB_CLOCK, LOW);
  80.   digitalWrite(RGB_LATCH, LOW);
  81.  
  82.  
  83.   //         ROWCOL     RRGGBB
  84.   for(uint8_t i=0;i<8;++i){
  85.     /*
  86.     //Effect #1
  87.     framebuffer[0][i]=i;
  88.     framebuffer[0][i+8]=(i<<8);
  89.     framebuffer[0][i+16]=(i<<16);
  90.     */
  91.     //Effect #2
  92.     framebuffer[0][i]=    (i<<0)  +((8-i)<<8);
  93.     framebuffer[0][i+8]=  (i<<8)  +((8-i)<<16);
  94.     framebuffer[0][i+16]= (i<<16) +((8-i)<<0);
  95.   }
  96.  
  97. }
  98.  
  99. void loop() {
  100.   static uint8_t div;
  101.   if((++div % 30) == 0)
  102.   {
  103.     uint32_t temp = framebuffer[0][0];
  104.     for(uint8_t x=0;x<24;++x){
  105.       framebuffer[0][x] = framebuffer[0][x+1 % 24];
  106.      
  107.     }
  108.     framebuffer[0][23] = temp;
  109.     for(uint8_t x=0;x<24;++x){
  110.       framebuffer[1][x] = framebuffer[0][x+1 % 24];
  111.       framebuffer[2][x] = framebuffer[0][x+2 % 24];
  112.       framebuffer[3][x] = framebuffer[0][x+3 % 24];
  113.       framebuffer[4][x] = framebuffer[0][x+4 % 24];
  114.       framebuffer[5][x] = framebuffer[0][x+3 % 24];
  115.       framebuffer[6][x] = framebuffer[0][x+2 % 24];
  116.       framebuffer[7][x] = framebuffer[0][x+1 % 24];
  117.      
  118.     }
  119.  
  120.   }
  121.  
  122.  
  123.  
  124.   display_task();
  125.  
  126. }
  127.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement