树莓派c语言led,用树莓派实现RGB LED的颜色控制——C语言版本号
用樹莓派實現(xiàn)RGB LED的顏色控制
RGB色彩模式是工業(yè)界的一種顏色標準。是通過對紅(R)、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代
表紅、綠、藍三個通道的顏色。這個標準差點兒包含了人類視力所能感知的全部顏色,是眼下運用最廣的顏色系統(tǒng)之中的一個。RGB色彩模式使用RGB模型為圖像中每個像素的RGB分量分配一個0~255范圍內(nèi)的強度值。
RGB圖像僅僅使用三種顏色。就能夠使它們依照不同的比例混合,從而得到各種各樣的顏色。
在實際的控制中。往往通過PWM來實現(xiàn)LED亮度(顏色深度)的控制。
樹莓派僅僅有一路硬件PWM輸出(GPIO1),但是要實現(xiàn)RGB
LED的控制。須要3路PWM。事實上。wiringPi庫為我們提供了用軟件多線程實現(xiàn)的PWM輸出,我們能夠利用這個庫提供的函數(shù)非常方便的將隨意GPIO配置為PWM輸出。在本例中。我將GPIO0,GPIO1。GPIO2配置成了soft
PWM輸出。樹莓派的引腳分配表例如以下圖所看到的:
我用的RGB LED是共陰極的,與樹莓派的連接方式例如以下:
Raspberry Pi ? ? ? ? ? ? ? ? RGB LED module
GPIO0--------------------------------------R
GPIO1-------------------------------------G
GPIO2--------------------------------------B
GND----------------------------------------‘-’
實物圖例如以下:
源碼:
#include
#include
#include
#define uchar unsigned char
#define LedPinRed 0
#define LedPinGreen 1
#define LedPinBlue 2
void ledInit(void)
{
softPwmCreate(LedPinRed, 0, 100);
softPwmCreate(LedPinGreen,0, 100);
softPwmCreate(LedPinBlue, 0, 100);
}
void ledColorSet(uchar r_val, uchar g_val, uchar b_val)
{
softPwmWrite(LedPinRed, r_val);
softPwmWrite(LedPinGreen, g_val);
softPwmWrite(LedPinBlue, b_val);
}
int main(void)
{
int i;
if(wiringPiSetup() == -1){ //when initialize wiring failed,print message to screen
printf("setup wiringPi failed !");
return 1;
}
ledInit();
while(1){
ledColorSet(0xff,0x00,0x00); //red
delay(500);
ledColorSet(0x00,0xff,0x00); //green
delay(500);
ledColorSet(0x00,0x00,0xff); //blue
delay(500);
ledColorSet(0xff,0xff,0x00); //yellow
delay(500);
ledColorSet(0xff,0x00,0xff); //pick
delay(500);
ledColorSet(0xc0,0xff,0x3e);
delay(500);
ledColorSet(0x94,0x00,0xd3);
delay(500);
ledColorSet(0x76,0xee,0x00);
delay(500);
ledColorSet(0x00,0xc5,0xcd);
delay(500);
}
return 0;
}
將此代碼保存為rgb.c。
編譯代碼:
gcc ?rgb.c ?-o ?rgb ?-lwiringPi ?-lpthread
執(zhí)行代碼:
./rgb
注意:
1,-lwiringPi選項:指明了要鏈接到wiringpi庫,由于softPwm的實現(xiàn)就在此庫;
2。-lpthread選項:由于softPwm的實現(xiàn)用了Linux的多線程機制。所以加這個編譯選項。
代碼和演示視頻已分享到360云盤:
訪問passworde0da
訪問passwordd6b1
下面是改進后的代碼。編譯方式同上。
#include
#include
#include
#define LedPinRed 0
#define LedPinGreen 1
#define LedPinBlue 2
int colors[] = {0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0x00FFFF, 0xFF00FF, 0xFFFFFF, 0x9400D3};
/******************************************************************************************
* 將一個數(shù)從一個區(qū)間線性映射到還有一個區(qū)間。比方將0~100之間的一個數(shù)映射到0~255之間
******************************************************************************************/
int map(int x, int in_min, int in_max, int out_min, int out_max)
{
return (x -in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
void ledInit(void)
{
softPwmCreate(LedPinRed, 0, 100); //create a soft pwm, original duty cycle is 0Hz, range is 0~100
softPwmCreate(LedPinGreen,0, 100);
softPwmCreate(LedPinBlue, 0, 100);
}
void ledColorSet(int color) //set color, for example: 0xde3f47
{
int r_val, g_val, b_val;
r_val = (color & 0xFF0000) >> 16; //get red value
g_val = (color & 0x00FF00) >> 8; //get green value
b_val = (color & 0x0000FF) >> 0; //get blue value
r_val = map(r_val, 0, 255, 0, 100); //change a num(0~255) to 0~100
g_val = map(g_val, 0, 255, 0, 100);
b_val = map(b_val, 0, 255, 0, 100);
softPwmWrite(LedPinRed, 100 - r_val); //change duty cycle
softPwmWrite(LedPinGreen, 100 - g_val);
softPwmWrite(LedPinBlue, 100 - b_val);
}
int main(void)
{
int i;
if(wiringPiSetup() == -1){ //when initialize wiringPi failed, print message to screen
printf("setup wiringPi failed !\n");
return 1;
}
ledInit();
while(1){
for(i = 0; i < sizeof(colors)/sizeof(int); i++){
ledColorSet(colors[i]);
delay(500);
}
}
return 0;
}假設(shè)你想用Python語言實現(xiàn)RGB的控制,請看還有一篇博文【用樹莓派實現(xiàn)RGB
LED的顏色控制——Python版本號】
總結(jié)
以上是生活随笔為你收集整理的树莓派c语言led,用树莓派实现RGB LED的颜色控制——C语言版本号的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言程序设计0004,C语言程序设计0
- 下一篇: c语言链表查找的代码与题目,链表的C语言