У меня есть вопрос, на который я действительно не смог найти ответ на этот конкретный вопрос.Arduino (C? Based) Программирование для энергоэффективности
Я недавно начал проект по настройке платы Arduino для управления различными светодиодами для перехода по спектру от красного до желтого, от желтого до зеленого, от от зеленого до тиана, от синего до синего, от синего до пурпурного, от пурпурного до красного. Использует указатели для отображения каждого значения RGB для полного спектра, на основе с 255 индексированным массивом.
Мой вопрос касается написания кода, который является энергоэффективным. Мне нужно, чтобы это было настолько эффективно, насколько это возможно, потому что мой проект будет работать с 4 перезаряжаемыми батареями АА (по 1,5 В АА каждый).
Как написать энергоэффективный код? Или это вопрос бесполезности?
Я убегаю от предположения (может быть очень неточным), что после завершения установки будет меньше энергии, потребляемой во время цикла.
Код в вопросе ниже:
int const RED = 3 /* Pin 3 */, BLUE = 5 /* Pin 5 */, GREEN = 6 /* Pin 6 */;
int* _RED[1536];
int* _GREEN[1536];
int* _BLUE[1536];
int RGB[256];
void setup() {
for (int i = 0; i<256;++i){
RGB[i] = i;
}
//RED TO YELLOW
for (int i = 0 ; i<256;++i){
_RED[i] = &RGB[255];
_GREEN[i] = &RGB[i];
_BLUE[i] = &RGB[0];
}
//YELLOW TO GREEN
for (int i = 256;i < 512; ++i){
_RED[i] = &RGB[511-i];
_GREEN[i] = &RGB[255];
_BLUE[i] = &RGB[0];
}
//GREEN TO TEAL
for (int i = 512; i <768;++i){
_RED[i] = &RGB[0];
_GREEN[i] = &RGB[255];
_BLUE[i] = &RGB[255+(i-767)];
}
//TEAL TO BLUE
for (int i = 768; i < 1024; ++i){
_RED[i] = &RGB[0];
_GREEN[i] = &RGB[1023-i];
_BLUE[i] = &RGB[255];
}
//BLUE TO MAGENTA
for (int i = 1024; i < 1280; ++i){
_RED[i] = &RGB[(255+(i-1279))];
_GREEN[i] = &RGB[0];
_BLUE[i] = &RGB[255];
}
//MAGENTA TO RED
for (int i = 1280; i < 1536; ++i){
_RED[i] = &RGB[255];
_GREEN[i] = &RGB[0];
_BLUE[i] = &RGB[1535-i];
}
//COMPLETES FULL SPECTRUM EXCLUDING WHITE AND BLACK
}
void loop(){
for(int i = 0; i <1536; ++i){
analogWrite(RED,*_RED[i]);
analogWrite(GREEN,*_GREEN[i]);
analogWrite(BLUE,*_BLUE[i]);
delay(100);
}
}
или было бы лучше использовать код следующим образом:
int const Red = 3, /* Pin 3 */ Blue = 5, /* Pin 5 */ Green = 6; /* Pin 6 */
void RGB(int R, int G, int B) {
analogWrite(Red,R); analogWrite(Green,G); analogWrite(Blue,B); delay(25);}
void setup() {}
void loop() {
int r=0,g=0,b=0;
r = 255;g = 0;b = 0; for (int i = 0; i < 256; ++i){RGB(r,i,b);}
r = 255; g = 255;b = 0; for (int i = 255; i >= 0; --i){RGB(i,g,b); }
r = 0;g = 255;b = 0; for (int i = 0; i < 256; ++i){RGB(r,g,i);}
r = 0;g = 255;b = 255; for (int i = 255; i >= 0; --i){RGB(r,i,b);}
r = 0;g = 0;b = 255; for (int i = 0; i < 256; ++i){RGB(i,g,b);}
r = 255;g = 0;b = 255; for (int i = 255; i >= 0; --i){RGB(r,g,i);}
delay(1000);
}
Спасибо, Brett
Определенно не первый, у вас есть массив указателей, который стоит вам лишней косвенности (потраченные впустую циклы CPU = потерянная мощность), а данные, которые вы пытаетесь сохранить, в любом случае меньше указателя. –
Я уверен, что это полностью зависит от деталей вашего доски. Например. вот интересная информация об управлении питанием Arduino Zero: https://www.arduino.cc/en/Tutorial/ArduinoZeroPowerConsumption – Gene
Спасибо @Gene вся информация, которую я могу получить, поможет. Бен I был в предположении, что использование указателя и 1 целого вместо 3 целых чисел будет меньше места –