用树莓派实现RGB LED的颜色控制——C语言版本号
用树莓派实现RGB LED的颜色控制
RGB色彩模式是工业界的一种颜色标准。是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代
表红、绿、蓝三个通道的颜色。这个标准差点儿包含了人类视力所能感知的全部颜色,是眼下运用最广的颜色系统之中的一个。RGB色彩模式使用RGB模型为图像中每个像素的RGB分量分配一个0~255范围内的强度值。
RGB图像仅仅使用三种颜色。就能够使它们依照不同的比例混合,从而得到各种各样的颜色。
在实际的控制中。往往通过PWM来实现LED亮度(颜色深度)的控制。
树莓派仅仅有一路硬件PWM输出(GPIO1),但是要实现RGB
LED的控制。须要3路PWM。事实上。wiringPi库为我们提供了用软件多线程实现的PWM输出,我们能够利用这个库提供的函数非常方便的将随意GPIO配置为PWM输出。在本例中。我将GPIO0,GPIO1。GPIO2配置成了soft
PWM输出。树莓派的引脚分配表例如以下图所看到的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamNkang=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
我用的RGB LED是共阴极的,与树莓派的连接方式例如以下:
Raspberry Pi RGB LED module
GPIO0 --------------------------------------
R
GPIO1 ------------------------------------- G
GPIO2 --------------------------------------
B
GND ---------------------------------------- ‘-’
实物图例如以下:
源码:
#include <wiringPi.h>
#include <softPwm.h>
#include <stdio.h> #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
执行代码:
./rgb
注意:
1,-lwiringPi选项:指明了要链接到wiringpi库,由于softPwm的实现就在此库;
2。-lpthread选项:由于softPwm的实现用了Linux的多线程机制。所以加这个编译选项。
代码和演示视频已分享到360云盘:
点我下载代码 訪问passworde0da
点我下载视频 訪问passwordd6b1
下面是改进后的代码。编译方式同上。
#include <wiringPi.h>
#include <softPwm.h>
#include <stdio.h> #define LedPinRed 0
#define LedPinGreen 1
#define LedPinBlue 2 int colors[] = {0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0x00FFFF, 0xFF00FF, 0xFFFFFF, 0x9400D3}; /******************************************************************************************
* 将一个数从一个区间线性映射到还有一个区间。比方将0~100之间的一个数映射到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;
}
假设你想用Python语言实现RGB的控制,请看还有一篇博文【用树莓派实现RGB
LED的颜色控制——Python版本号】
用树莓派实现RGB LED的颜色控制——C语言版本号的更多相关文章
- arduino 蓝牙控制RGB LED灯
/* 日期:2016.9.2 功能:arduino 蓝牙控制RGB LED灯 元件: 跳线公公头 * 8 rgbled, 220欧电阻 蓝牙模块 接线: 蓝牙模块VCC,GND分别接5V,GND;TX ...
- 云中树莓派(3):通过 AWS IoT 控制树莓派上的 Led
云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 云中树莓派(3):通过 AWS IoT 控制树莓派上的Led 云中树莓派(4):利用声音传感 ...
- 共阳极RGB LED二极管
1)RGB LED二极管有四个引脚,它把3个普通led被封装在其内部,这三个led颜色分别为红.绿.蓝三种颜色,通过控制各个LED的亮度,你可以混合出几乎任何你想要的颜色,如下图: 2)RGB LED ...
- Arduino 各种模块篇 RGB LED灯
示例代码: 类似与这样的led,共阴rgb led,通过调节不同的亮度,组合成不同的颜色. 示例代码: /* 作者:极客工坊 时间:2012年12月18日 IDE版本号:1.0.1 发布地址:www. ...
- 张高兴的 Windows 10 IoT 开发笔记:使用 Lightning 中的软件 PWM 驱动 RGB LED
感觉又帮 Windows 10 IoT 开荒了,所以呢,正儿八经的写篇博客吧.其实大概半年前就想写的,那时候想做个基于 Windows 10 IoT 的小车,但树莓派原生不支持 PWM 啊.百度也搜不 ...
- 基于Android的rgb七彩环颜色采集器
代码地址如下:http://www.demodashi.com/demo/11892.html 一.前言. 在大学期间,看到这个rgb灯,蛮好奇的,这么漂亮的颜色采集,并且可以同步到设备rbg灯颜色, ...
- HTML连载15-文本属性&颜色控制属性
一.文本装饰的属性 1.格式:text-decoration:underline; 2.取值: (1)underline代表下划线 (2)line-through代表删除线 (3)overline代表 ...
- LED调颜色小程序
燧星科技有一个免费的LED调颜色蓝牙小程序,小程序有一个拾色器用来调节颜色.亮度.饱和度,同时显示出RGB的十六进制与十进制数据.还有连接蓝牙模块的功能,可向通用蓝牙模块发送调节后的RGB数据,可为平 ...
- 【蓝桥杯单片机02】LED的基本控制
[蓝桥杯单片机02]LED的基本控制 广东职业技术学院 欧浩源 在CT107D单片机综合训练平台实现LED的基本控制和其他单片机开发平台不一样,不单单是控制几个LED实现跑马灯这么简单.因为在这个平 ...
随机推荐
- C - Football
Problem description Petya loves football very much. One day, as he was watching a football match, he ...
- Java中数组要点总结
1.数组是基本数据类型和字符串类型的容器(引用数据类型),而集合是类数据类型的容器: 2.数组定义的格式: (1)一般格式: 元素类型[] 数组名 = new 元素类型[元素个数或者数组长度]: 其中 ...
- xml之基本操作
XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(Standard Generalized Markup Lang ...
- Php.ini文件位置在哪里 Php.ini文件找不到
转载自:http://www.php100.com/html/php/rumen/2013/0831/26.html [导读] Php ini文件是php的一个配置文件,在windows主机中如果你未 ...
- C#微信公众号的开发——服务配置
最近因为需要用C#开发微信公众号的一些功能,记录一下开发公众号的一些坑..... 首先先介绍一下,微信公众号的官方文档.虽然这个文档我感觉比较糙,但是还是可以借鉴一下让我们摸着石头过河的. 首先我们得 ...
- ie8及其以下版本兼容性问题之input file隐藏上传文件
文件上传时,默认的file标签很难看,而且每个浏览器下都有很大差距.因此我们基本都把真正的file标签给隐藏,然后创建一个标签来替代它.但是由于IE出于安全方面的考虑上传文件时必须点击file的浏览按 ...
- 【PostgreSQL-9.6.3】如何得到psql中命令的实际执行SQL
当我们在psql界面执行以“\”开头的命令时,数据库会立刻返回执行结果,而不会返回命令的实际执行过程.通过两种方式可以实现执行过程的查看: 方法一:启动psql命令时加“-E”参数 postgres@ ...
- 微信小程序,时间戳和日期格式互相转化
微信小程序,时间戳转为日期格式 通常后台传递过来的都是时间戳,但是前台展示不能展示时间戳.就需要转化了. 功能说明: 微信小程序里,时间戳转化为日期格式,支持自定义. 拷贝至项目utils/utils ...
- static关键字的定义与使用
static关键字概述 关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的.也就是说,既然属于类,就可以不靠创建对象来调用了. 1 ...
- jmeter3.1 压测
压测目标:error 为0,线程起到250,服务器配置达到最大 一.Jmeter3.1 压测 JMeter3.1提供一个用于生成HTML页面格式图形化报告的扩展模块.该模块支持通过两种方式生成多维度图 ...