网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
03月07日漏签0天
arduino吧 关注:75,634贴子:230,883
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 7回复贴,共1页
<<返回arduino吧
>0< 加载中...

RGB混色、单旋转编码器调光、UNO双中断通道触发小学生寒假实践

  • 只看楼主
  • 收藏

  • 回复
  • vanezip
  • 颇具名气
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
为了给上三年级的孩子做的寒假社会实践作业的作品,对于平衡车和寻迹车都感觉娱乐意义大于教育意义,所以想了又想,不如做一个这个RGB混色实验装置的教育意义更大,由于使用了UNO板只支持2个中断通道,所以没有使用太多的编码器,此处为硬件限制。本着开源的思想,把源码都已经进行了详细的解释备注。初学者可以参考,高手批评指正,编码器有是那种最便宜的,所以源码看着有点怪,对于这种2元钱的5脚没正反输出口的编码器,好处是很多LCD屏上都使用过,作为输入,初学者可以参考
不多说了,上源码吧
/****************************************************************************************************************************************************************
《RGB混色实验装置》——小学生寒假社会实践作业作品
本实验是为了给上三年级的孩子做的寒假社会实践作业的作品,对于平衡车和寻迹车都感觉娱乐意义大于教育意义,所以想了又想,不如做一个这个RGB混色实验装置的教育意义更大
由于使用了UNO板只支持2个中断通道,所以没有使用太多的编码器,此处为硬件限制
代码测试完毕,然后使用ArduBlock图形化(插件)工具教给孩子使用,但是由于ArduBlock没有条件中断,所以对于中断的写法,只能自己加上
实验装置目的在于让孩子们了解RGB混色的颜色合成原理,同时培养孩子对于单片机控制的兴趣
实验器材:1、ArduinoUNO(1个约88元or其他兼容产品约18元);2、360度 旋转编码器KY-040 FOR 模块(1个约2元钱);3、RGB模块 三色LEDD模块 (1个约1元钱);4、导线若干
实验器材马云家都有,但我选用的RGB模块比较便宜,光束不是很好,所以实验效果一般,器材酌情自行更换(完)
******************************************************************************************************************************************************************/


  • vanezip
  • 颇具名气
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#define pinRed 9 //宏:红色LED接口9针
#define pinGreen 5 //宏:绿色LED接口5针
#define pinBlue 6 //宏:蓝色LED接口6针
#define pinCLK 2 //宏:按钮编码器CLKD接口2针*************************注释:使用外部中断函数在ArduinoUNO板子上,只能使用pin2或者pin3作为中断接口,中断接口的pin2=int0,pin3=int1,
#define pinDT 3 //宏:按钮编码器DT接口3针***************************所以使用中断函数attachInterrupt(interrupt, function, mode);//interrupt为你中断通道编号,function为中断函数,mode为中断触发模式,这里正向使用int0、即0;反向使用int1、即1
#define ChangeButter 7 //宏:按钮编码器SW接口3针,编码器旋钮下按,改变调试的R、G、B通道
int ChangeButVal = 0; //定义变量ChangeButVal存贮编码器旋钮下按状态,此处使用的编码器不下按的时候输出为“HIGH”,下按时候为“LOW”,初始化为0
byte RedVal = 0; //定义变量RedVal存贮红色通道的PWM调制的值,初始化为0
byte GreeneVal = 0; //定义变量GreeneVal存贮绿色通道的PWM调制的值,初始化为0
byte BlueVal = 0; //定义变量BlueVal存贮蓝色通道的PWM调制的值,初始化为0
byte ControlState = 1; //定义变量ControlState存贮控制状态的值,初始化为1;控制状态为1、2、3三种,即输出指向R、G、B通道的其中一个,初始化为1、即指向红色
void setup() { //setup()函数开始
// Serial.begin(9600); //打开串口
pinMode(pinRed,OUTPUT); //红色LED通道为输出
pinMode(pinGreen,OUTPUT); //绿色LED通道为输出
pinMode(pinBlue,OUTPUT); //蓝色LED通道为输出
pinMode(pinCLK,INPUT); //编码器为CLK针脚为输入
pinMode(pinDT,INPUT); //编码器为DT针脚为输入
pinMode(ChangeButter,INPUT); //编码器为SW针脚为输入
} //setup()函数结束
void loop() { //主循环开始
digitalRead(ChangeButter); //数字量读取ChangeButter、即针脚7
analogWrite(pinRed,RedVal); //模拟量写入红色LED通道,PWM调制值(0~255)
analogWrite(pinGreen,GreeneVal); //模拟量写入绿色LED通道,PWM调制值(0~255)
analogWrite(pinBlue,BlueVal); //模拟量写入蓝色LED通道,PWM调制值(0~255)
if(digitalRead(ChangeButter) == HIGH){ //if条件函数,当数字量读取ChangeButter、即针脚7的返回值等于高电平
ChangeButVal = 1; //ChangeButVal存贮编码器旋钮下按状态,此时为不按的状态,赋值为1
} else{ ChangeButVal = 0;} //否则ChangeButVal按下时候,赋值为0
if( ControlState <= 3 && ChangeButVal == 0){ ControlState ++; } //if条件函数,当ControlState控制状态小于等于3的时候,执行每按下一次都让控制状态 +1
if( ControlState == 4 && ChangeButVal == 0){ ControlState = 1;} //if条件函数,当ControlState控制状态等于4的时候,返回1的状态,由于初始化为1,所以上句加本句就是每按下一次由1~3循环
attachInterrupt(0, LedChangeHigh, CHANGE); //中断函数,由于编码器没有正向反向输出的指示针脚,只能判断pinCLK与pinDT中哪个先变成低电平来判断方向,写在一个中断函数有控制问题,所以这个地方分开写2个中断函数
attachInterrupt(1, LedChangeLow, CHANGE); //中断函数,上一句触发由中断通道编号0触发,即pin2、条件是“CHANGE”,中断后立刻执行LedChangeHigh()函数;本句触发由中断通道编号1触发,即pin3、条件是“CHANGE”,中断后立刻执行LedChangeLow()函数


2026-03-07 07:18:06
广告
不感兴趣
开通SVIP免广告
  • vanezip
  • 颇具名气
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
///////////////////////////////////////////////////////////////////////监听段,本段没有实际意义,调试时做监听使用的/////////////////////////////////////////////////////////////////////////////
/*
Serial.print(RedVal);
Serial.print("---------------------");
Serial.print(ChangeButVal);
Serial.print("---------------------");
Serial.println(ControlState);
*/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
delay(200); //延时200毫秒
} ////////////////////////////////////////////主循环结束


  • vanezip
  • 颇具名气
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
void LedChangeHigh() { //LedChangeHigh()中断函数开始 : 顺时针增加输出值(High),分为ControlState == 1 ;ControlState == 2 ;ControlState == 3 三种控制状态
if(ControlState == 1 && digitalRead(pinCLK) == LOW && digitalRead(pinDT) == HIGH && RedVal <= 254){ //if()条件函数,当控制状态ControlState == 1(即红色通道的时候),{ 布尔运算“与”digitalRead(pinCLK) == LOW ,布尔运算“与”digitalRead(pinDT) == HIGH,}花括号内为判断旋转方向为顺时针
// 布尔运算“与”RedVal <= 254 ;当控制状态为红色通道 并且 {digitalRead(pinCLK) == LOW 并且 digitalRead(pinDT) == HIGH }顺时针旋转 并且 红色通道PWM调制值小于等于245的时候
RedVal ++; //执行红色通道PWM调制值RedVal ++
delay(20); //延时20毫秒
} //if()条件函数结束,以下两段 else if 是分别在当控制状态ControlState == 2 或者 当控制状态 ControlState == 3 的时候,其他的含义相同
else if (ControlState == 2 && digitalRead(pinCLK) == LOW && digitalRead(pinDT) == HIGH && GreeneVal <= 254){ //
GreeneVal ++; //
delay(20); //
} //
else if( ControlState == 3 && digitalRead(pinCLK) == LOW && digitalRead(pinDT) == HIGH && BlueVal <= 254){ //
BlueVal ++; //
delay(20); //
} //
} //LedChangeHigh()中断函数结束,结束后返回主循环函数


  • vanezip
  • 颇具名气
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
void LedChangeLow() { //LedChangeLow()中断函数开始 : 逆时针减少输出值(Low),分为ControlState == 1 ;ControlState == 2 ;ControlState == 3 三种控制状态
if( ControlState == 1 && digitalRead(pinCLK) == HIGH && digitalRead(pinDT) == LOW && RedVal >= 1){ //if()条件函数,当控制状态ControlState == 1(即红色通道的时候),{ 布尔运算“与”digitalRead(pinCLK) == HIGH ,布尔运算“与”digitalRead(pinDT) == LOW,}花括号内为判断旋转方向为逆时针
// 布尔运算“与”RedVal >= 1 ;当控制状态为红色通道 并且 {digitalRead(pinCLK) == HIGH 并且 digitalRead(pinDT) == LOW }逆时针旋转 并且 红色通道PWM调制值大于等于1的时候
RedVal --; //执行红色通道PWM调制值RedVal --
delay(20); //延时20毫秒
} //if()条件函数结束,以下两段 else if 是分别在当控制状态ControlState == 2 或者 当控制状态 ControlState == 3 的时候,其他的含义相同
else if( ControlState == 2 && digitalRead(pinCLK) == HIGH && digitalRead(pinDT) == LOW && GreeneVal >= 1){ //
GreeneVal --; //
delay(20); //
} //
else if( ControlState == 3 && digitalRead(pinCLK) == HIGH && digitalRead(pinDT) == LOW && BlueVal >= 1){ //
BlueVal --; //
delay(20); //
} //
} //LedChangeHigh()中断函数结束,结束后返回主循环函数


  • vanezip
  • 颇具名气
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
未标注的源码:
#define pinRed 9
#define pinGreen 5
#define pinBlue 6
#define pinCLK 2
#define pinDT 3
#define ChangeButter 7
int ChangeButVal = 0;
byte RedVal = 0;
byte GreeneVal = 0;
byte BlueVal = 0;
byte ControlState = 1;
void setup() {
// Serial.begin(9600);
pinMode(pinRed,OUTPUT);
pinMode(pinGreen,OUTPUT);
pinMode(pinBlue,OUTPUT);
pinMode(pinCLK,INPUT);
pinMode(pinDT,INPUT);
pinMode(ChangeButter,INPUT);
}
void loop() {
digitalRead(ChangeButter);
analogWrite(pinRed,RedVal);
analogWrite(pinGreen,GreeneVal);
analogWrite(pinBlue,BlueVal);
if(digitalRead(ChangeButter) == HIGH){
ChangeButVal = 1;
} else{ ChangeButVal = 0;}
if( ControlState <= 3 && ChangeButVal == 0){ ControlState ++; }
if( ControlState == 4 && ChangeButVal == 0){ ControlState = 1;}
attachInterrupt(0, LedChangeHigh, CHANGE);
attachInterrupt(1, LedChangeLow, CHANGE);
// Serial.print(RedVal);
// Serial.print("---------------------");
// Serial.print(ChangeButVal);
// Serial.print("---------------------");
// Serial.println(ControlState);
delay(200); //延时200毫秒
}
void LedChangeHigh() {
if(ControlState == 1 && digitalRead(pinCLK) == LOW && digitalRead(pinDT) == HIGH && RedVal <= 254){
RedVal ++;
delay(20);
}
else if (ControlState == 2 && digitalRead(pinCLK) == LOW && digitalRead(pinDT) == HIGH && GreeneVal <= 254){
GreeneVal ++;
delay(20);
}
else if( ControlState == 3 && digitalRead(pinCLK) == LOW && digitalRead(pinDT) == HIGH && BlueVal <= 254){
BlueVal ++;
delay(20);
}
}
void LedChangeLow() {
if( ControlState == 1 && digitalRead(pinCLK) == HIGH && digitalRead(pinDT) == LOW && RedVal >= 1){
RedVal --;
delay(20);
}
else if( ControlState == 2 && digitalRead(pinCLK) == HIGH && digitalRead(pinDT) == LOW && GreeneVal >= 1){
GreeneVal --;
delay(20);
}
else if( ControlState == 3 && digitalRead(pinCLK) == HIGH && digitalRead(pinDT) == LOW && BlueVal >= 1){
BlueVal --;
delay(20);
}
}


  • elf-32
  • 大名鼎鼎
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
小学生嫩好理解吗


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 7回复贴,共1页
<<返回arduino吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示