Щиток приборов с NeoPixel оптимизация.

infyniti
Offline
Зарегистрирован: 15.07.2017

Хочу увеличить количество светодиодов для подсветки всего салона а также сделать такойже как тахометр https://www.youtube.com/watch?v=i_6H_sUqn7w спидометр.

 

Можно ли как-то оптимизировать скетчь или библиотеку чтобы уменьшить размер.

 

#include <Adafruit_NeoPixel.h>
 byte Hall2 = 4;
 byte Hall1 = 5;                                      
#define PIN 2                                         
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(24, PIN, NEO_GRB + NEO_KHZ800);
 unsigned long lastflash;
 int RPM;
 byte state; 
 int taho;
void setup() {
  pinMode(Hall1, INPUT);
  pinMode(Hall2, OUTPUT);
//  Serial.begin(9600);  //открыть порт  
  attachInterrupt(1,sens,FALLING);                    
  pixels.begin();                                     
}
void sens() {
  RPM=60/((float)(millis()-lastflash)/2000);          
  lastflash=millis();                                
}
void loop() {
  state = digitalRead(Hall1);       
  digitalWrite(Hall2, state); 
//float filter_RPM=filter(RPM);  
  if ((millis()-lastflash)>500){                     
    RPM=0;                                            
  }  
  taho = RPM;
//Serial.println(taho);  
  if (taho == 0)                                       
  {
    pixels.setPixelColor(0, pixels.Color(15,0,1));
    pixels.setPixelColor(1, pixels.Color(0,0,0));
    pixels.setPixelColor(17, pixels.Color(0,0,100));
    pixels.setPixelColor(18, pixels.Color(0,0,100));
    pixels.setPixelColor(19, pixels.Color(0,0,100));
    pixels.setPixelColor(20, pixels.Color(0,0,100));
    pixels.setPixelColor(21, pixels.Color(0,0,100));
    pixels.setPixelColor(22, pixels.Color(0,0,100));
    pixels.setPixelColor(23, pixels.Color(0,0,100));
  }  
  if (taho >= 500)                                    
  {
    pixels.setPixelColor(0, pixels.Color(15,0,1));
    pixels.setPixelColor(1, pixels.Color(15,0,1));
     }    else  if (taho < 500)                          
           {
             pixels.setPixelColor(1, pixels.Color(0,0,0));
           }      
  if (taho >= 750)                                    
  {
    pixels.setPixelColor(0, pixels.Color(0,20,0));
    pixels.setPixelColor(1, pixels.Color(0,20,0));
    pixels.setPixelColor(2, pixels.Color(0,0,255));
       } else  if (taho < 750 && taho < 1000)             
           {            
             pixels.setPixelColor(2, pixels.Color(1,1,20)); 
           }          
  if (taho >= 1000)                                  
  {
    pixels.setPixelColor(2, pixels.Color(0,25,0));
     }     
  if (taho >= 1500)                                  
  {
    pixels.setPixelColor(3, pixels.Color(0,25,0));
      }    else  if (taho < 1500)                        
           {
             pixels.setPixelColor(3, pixels.Color(1,1,20));                          
           }
  if (taho >= 2000)                                  
  {
    pixels.setPixelColor(4, pixels.Color(0,25,0));
      }    else  if (taho < 2000)                        
           {
             pixels.setPixelColor(4, pixels.Color(1,1,20));                          
           }
  if (taho >= 2500)                                  
  {
    pixels.setPixelColor(5, pixels.Color(0,25,0));
      }    else  if (taho < 2500)                        
           {
             pixels.setPixelColor(5, pixels.Color(1,1,20));                          
           }  
  if (taho >= 3000)                                  
  {
    pixels.setPixelColor(6, pixels.Color(0,25,0));
     }    else  if (taho < 3000)                        
           {
             pixels.setPixelColor(6, pixels.Color(1,1,20));                          
           }  
  if (taho >= 3500)                                  
  {
    pixels.setPixelColor(7, pixels.Color(0,25,0));
   }    else  if (taho < 3500)                        
           {
             pixels.setPixelColor(7, pixels.Color(1,1,20));                          
           }
  if (taho >= 4000)                                  
  {
    pixels.setPixelColor(8, pixels.Color(0,25,0));
          }    else  if (taho < 4000)                        
           {
             pixels.setPixelColor(8, pixels.Color(1,1,20));                          
           }
  if (taho >= 4500)                                  
  {
    pixels.setPixelColor(9, pixels.Color(0,25,0));
              }    else  if (taho < 4500)                       
           {
             pixels.setPixelColor(9, pixels.Color(1,1,20));                          
           }
  if (taho >= 5000)                                  
  {
    pixels.setPixelColor(10, pixels.Color(0,25,0));
             }    else  if (taho < 5000)                        
           {
             pixels.setPixelColor(10, pixels.Color(1,1,20));                          
           }
  if (taho >= 5500)                                  
  {
    pixels.setPixelColor(11, pixels.Color(0,25,0));
             }    else  if (taho < 5500)                        
           {
             pixels.setPixelColor(11, pixels.Color(1,1,20));                          
           }
  if (taho >= 6000)                                  
  {
    pixels.setPixelColor(12, pixels.Color(50,0,0));
              }    else  if (taho < 6000)                        
           {
             pixels.setPixelColor(12, pixels.Color(1,1,20));                          
           }
  if (taho >= 6500)                                  
  {
    pixels.setPixelColor(13, pixels.Color(50,0,0));
               }    else  if (taho < 6500)                        
           {
             pixels.setPixelColor(13, pixels.Color(1,1,20));                          
           }
  if (taho >= 7000)                                  
  {
    pixels.setPixelColor(14, pixels.Color(50,0,0));
             }    else  if (taho < 7000)                        
           {
             pixels.setPixelColor(14, pixels.Color(1,1,20));                          
           }
  if (taho >= 7500)                                  
  {
    pixels.setPixelColor(15, pixels.Color(50,0,0));
              }    else  if (taho < 7500)                        
           {
             pixels.setPixelColor(15, pixels.Color(1,1,20));                          
           }
  if (taho >= 8000)                                  
  {
    pixels.setPixelColor(16, pixels.Color(50,0,0));
    pixels.setPixelColor(17, pixels.Color(0,0,100));
    pixels.setPixelColor(18, pixels.Color(0,0,100));
    pixels.setPixelColor(19, pixels.Color(0,0,100));
    pixels.setPixelColor(20, pixels.Color(0,0,100));
    pixels.setPixelColor(21, pixels.Color(0,0,100));
    pixels.setPixelColor(22, pixels.Color(0,0,100));
    pixels.setPixelColor(23, pixels.Color(0,0,100));            
  }    else  if (taho < 8000)                        
           {
             pixels.setPixelColor(16, pixels.Color(1,1,20));                          
           }
    pixels.show();                                     
 }
/*
Скетч использует 4604 байт (14%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 53 байт (2%) динамической памяти, оставляя 1995 байт для локальных переменных. Максимум: 2048 байт.

*/

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Можно.

NickSan
NickSan аватар
Offline
Зарегистрирован: 28.12.2017

infyniti пишет:

Можно ли как-то оптимизировать скетчь или библиотеку чтобы уменьшить размер

попробуйте использовать функцию map для определения какие неопиксели нужно включать,

к примеру, на тахометре мы получаем значения от 1 до 8000, пикселей допустим у нас от 1 до 50,

значит пишем


for(int i = 0; i < 50; i++){ /*Ставим дефолтный цвет пикселей*/
     pixels.setPixelColor(i, pixels.Color(50,50,50));
}
int pixelMax = map(taho, 0, 50, 0, 8000); /*вычисляем конечный активный пиксель*/
for(int i = 0; i < pixelMax; i++) { /*Ставим активный цвет пикселей*/
     pixels.setPixelColor(i, pixels.Color(255,0,0));
}
strip.show(); /*выводим цвета на ленте*/

Подробнее о функции map

Можно круче придумать с радугой и всякими фишками, всё ограничено вашей фантазией) Даже порядок пикселей изменить или сделать спидометр как в "Назад будущее" и подсветку капота как у "Рыцаря дорог" и всё влезет на 8 кб, я почему то уверен)

библиотеку adafruit не надо оптимизировать, она и так dats cool

infyniti
Offline
Зарегистрирован: 15.07.2017

NickSan пишет:

 

попробуйте использовать функцию map для определения какие неопиксели нужно включать,

 

спасибо за подсказку я как-то не задумывался о map или соnstrain можно прилично на ифах сэкономить

sadman41
Offline
Зарегистрирован: 19.10.2016

Если позволите, то...

int pixelMax = map(taho, 0, 50, 0, 8000); /*вычисляем конечный активный пиксель*/
for(int i = 0; i < 50; i++){ 
    // Color in GRB, 0x00FF00 - max Red
    pixels.setPixelColor(i, (i < pixelMax) ? 0x00FF00 : 0x111111));
}
strip.show(); /*выводим цвета на ленте*/

 

infyniti
Offline
Зарегистрирован: 15.07.2017

sadman41 пишет:

Если позволите, то...

int pixelMax = map(taho, 0, 50, 0, 8000); /*вычисляем конечный активный пиксель*/
for(int i = 0; i < 50; i++){ 
    // Color in GRB, 0x00FF00 - max Red
    pixels.setPixelColor(i, (i < pixelMax) ? 0x00FF00 : 0x111111));
}
strip.show(); /*выводим цвета на ленте*/

 

Я не совсем это имел в виду ?: но за одно просветился спасибо

sadman41
Offline
Зарегистрирован: 19.10.2016

Подставьте вместо 0x00FF00 какой-нибудь colors[i], а этот массив заранее заполните хоть rainbow эффектом, хоть предустановленными цветами, которые на шиме не мерцают, хоть посекторно зеленый/желтый/красный. Тогда всё будет по новогоднему.