2016-10-21 8 views
0

У меня есть вопрос, на который я действительно не смог найти ответ на этот конкретный вопрос.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

+0

Определенно не первый, у вас есть массив указателей, который стоит вам лишней косвенности (потраченные впустую циклы CPU = потерянная мощность), а данные, которые вы пытаетесь сохранить, в любом случае меньше указателя. –

+0

Я уверен, что это полностью зависит от деталей вашего доски. Например. вот интересная информация об управлении питанием Arduino Zero: https://www.arduino.cc/en/Tutorial/ArduinoZeroPowerConsumption – Gene

+0

Спасибо @Gene вся информация, которую я могу получить, поможет. Бен I был в предположении, что использование указателя и 1 целого вместо 3 целых чисел будет меньше места –

ответ

3

Обе эти программы будут имеют примерно равное (и довольно высокое) потребление энергии, так как функция Arduino delay() не переводит процессор в состояние ожидания. Если потребляемая мощность важна, вам нужно будет перевести процессор в режим сна самостоятельно. К сожалению, структура Arduino не раскрывает никакого способа сделать это; вам нужно будет спуститься к соответствующим регистраторам AVR и внутренним требованиям для этого.

Еще одна проблема заключается в том, что для первой программы требуется около 10 КБ ОЗУ для ваших четырех массивов, что значительно больше, чем доступно на большинстве микроконтроллеров AVR. Вообще говоря, на этой платформе следует избегать больших таблиц поиска.

+0

Я не знаю, насколько неэффективна функция analogWrite, возможно, она действительно делает оба равным. Но число операций в коде OP в рабочем цикле (даже не подсчет настроек) намного выше в первой версии. –

+0

Этот код будет работать на ардуине 101 или ноль, в котором оба имеют баран 28-32 КБ. При этом я начинаю думать, что код имеет меньшее влияние по сравнению с тем, какая плата используется. –

+0

@BenVoigt Количество операций здесь не имеет значения. Процессор находится в режиме RUN в 100% случаев, поскольку 'delay()' является spinloop. – duskwuff

 Смежные вопросы

  • Нет связанных вопросов^_^