Arduino(C?基于)能源效率编程
Arduino (C? Based) Programming for Energy Efficiency
我有一个问题,我还没有真正找到这个具体问题的答案。
我最近开始了一个项目来设置一个 Arduino 板来控制各种 LED 从红色到黄色、黄色到绿色的光谱过渡,
绿色到青色,青色到蓝色,蓝色到洋红色,洋红色到红色。
使用指针映射全光谱的每个 RGB 值,基于
off 255 索引数组。
我的问题是关于编写节能代码。我需要它尽可能高效,因为我的项目将 运行 关闭 4 节可充电 AA 电池(每节 1.5V AA)。
如何编写节能代码?或者这是一个徒劳的问题?
我运行假设(可能非常不准确)设置完成后,循环过程中消耗的能量会更少。
有问题的代码如下:
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);
}
谢谢,
布雷特
这两个程序的能耗大致相等(而且相当高),因为 Arduino delay()
函数不会使处理器进入睡眠状态。如果功耗很重要,您需要自己将处理器置于睡眠模式。不幸的是,Arduino 框架没有公开任何方法来做到这一点;您需要下拉到适当的 AVR 寄存器和内在函数才能执行此操作。
另一个问题是第一个程序需要大约 10 KB 的 RAM 用于您的四个阵列,这比大多数 AVR 微控制器上可用的要多得多。一般来说,在这个平台上应该避免使用大的查找表。
我有一个问题,我还没有真正找到这个具体问题的答案。
我最近开始了一个项目来设置一个 Arduino 板来控制各种 LED 从红色到黄色、黄色到绿色的光谱过渡, 绿色到青色,青色到蓝色,蓝色到洋红色,洋红色到红色。 使用指针映射全光谱的每个 RGB 值,基于 off 255 索引数组。
我的问题是关于编写节能代码。我需要它尽可能高效,因为我的项目将 运行 关闭 4 节可充电 AA 电池(每节 1.5V AA)。
如何编写节能代码?或者这是一个徒劳的问题?
我运行假设(可能非常不准确)设置完成后,循环过程中消耗的能量会更少。
有问题的代码如下:
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);
}
谢谢, 布雷特
这两个程序的能耗大致相等(而且相当高),因为 Arduino delay()
函数不会使处理器进入睡眠状态。如果功耗很重要,您需要自己将处理器置于睡眠模式。不幸的是,Arduino 框架没有公开任何方法来做到这一点;您需要下拉到适当的 AVR 寄存器和内在函数才能执行此操作。
另一个问题是第一个程序需要大约 10 KB 的 RAM 用于您的四个阵列,这比大多数 AVR 微控制器上可用的要多得多。一般来说,在这个平台上应该避免使用大的查找表。