Щиток приборов с NeoPixel оптимизация.
- Войдите на сайт для отправки комментариев
Пт, 29/12/2017 - 18:45
Хочу увеличить количество светодиодов для подсветки всего салона а также сделать такойже как тахометр 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 байт.
*/
Можно.
Можно ли как-то оптимизировать скетчь или библиотеку чтобы уменьшить размер
попробуйте использовать функцию 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
попробуйте использовать функцию map для определения какие неопиксели нужно включать,
спасибо за подсказку я как-то не задумывался о map или соnstrain можно прилично на ифах сэкономить
Если позволите, то...
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(); /*выводим цвета на ленте*/Если позволите, то...
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(); /*выводим цвета на ленте*/Я не совсем это имел в виду ?: но за одно просветился спасибо
Подставьте вместо 0x00FF00 какой-нибудь colors[i], а этот массив заранее заполните хоть rainbow эффектом, хоть предустановленными цветами, которые на шиме не мерцают, хоть посекторно зеленый/желтый/красный. Тогда всё будет по новогоднему.