AT999BGA 发表于 2014-6-5 21:48:27

【教程】诗朗诵定时器---从此音乐和领诵无缝对接。

当我在进行诗朗诵配乐制作时,音乐和人的配合让我很恼火。
我于是花了3小时做了这个定时器。
这个装置是红外遥控的。
它可以以一个全彩LED的颜色变化记录排练诗朗诵的过程,可以遥控重放(以颜色变化)也可以按一个键把记录的数据通过串口发回电脑。

硬件如下:
arduino pro mini
红外接收头
面包板
共阳极全彩LED
电阻3个(自己配吧,配到20mA)
灯罩(选装)
红外遥控板(3x7键盘这种)

连接如下:
   RED 9
   GRE 10
   BLUE 11
   红外 2

建议像我一样给遥控板上贴一层纸,写上字。

注:跳线是为了接电源方便

使用方法:
在这里,我把键盘按做下角为(1,1)这样叫坐标。
1.记录:
   按键(3,5)再按最右上角的键(3,7)确认
   (按其他键返回)
   等待EEPROM清除(红》》》紫)这时按键(3,6)开始计时
   按数字1-7来定时。
我的设置如下:
                  case 1:Serial.print("leader1red");break;
                  case 2:Serial.print("leader2yellow");break;
                  case 3:Serial.print("leader3blue");break;
                  case 4:Serial.print("leader4purple");break;
                  case 5:Serial.print("all      green");break;
                  case 6:Serial.print("boysblue");break;
                  case 7:Serial.print("girls    white");break;
   2.重放:
   通电后按键(3,6)开始(默认为绿色)
   他就会按照上一次的重现颜色(可以当信号灯)
   3.导出:
   链接电脑后按最左上角键(1,7)
   灯变蓝,串口上会出现记录
1.【时间】【人】
2.【时间】【人】
3.【时间】【人】
   。。。。。。。。

ctrl+c复制进剪贴板,粘贴到文档中

你一下子就会发现合成背景音乐是多么愉快。
O(∩_∩)O谢谢

程序如下:
#include <EEPROM.h>

#include <IRremote.h>
#define RED 9
#define GRE 10
#define BLUE 11
#define takef(X) (256-X)

#define arrynum 80

int RECV_PIN = 2;

IRrecv irrecv(RECV_PIN);

decode_results results;

unsigned char red=0;
unsigned char gre=0;
unsigned char blue=0;
char main_mode=0;

void upled(void){
analogWrite(9,red);
analogWrite(10,gre);
analogWrite(11,blue);
}
unsigned long times;//begin
unsigned long timen;

union data {
int v;
unsigned char dchar;
} dvalue;

/****************/
void writeint(unsigned int va,unsigned int add){
dvalue.v = va;
unsigned char *dpointer;
dpointer = dvalue.dchar;
for(int i = 0; i < 2; i++) {
    EEPROM.write(i+add,*dpointer);
    dpointer++;
}
}
/************************/
unsigned int readint(unsigned int add){
for(int i = 0; i < 2; i++) dvalue.dchar = EEPROM.read(i+add);
return dvalue.v;
}
/***************/
unsigned int timeee;
unsigned char statuse;
unsigned int position=0;
////////////////////
void writelog(unsigned char statu)
{
if(position>arrynum*3){
    position=arrynum*3;
          red=200;
          gre=255;
          blue=255;
          upled();
}
unsigned int timep=int(timen/100);
writeint(timep,position);
EEPROM.write(position+2,statu);
position+=3;
}
void readlog(void)
{
for(int i=0;i<=arrynum;i++)
{
    timeee=readint(i*3);
    statuse=EEPROM.read(i*3+2);
}
}
void loadled(unsigned char statu)
{
switch(statu)
   {
      case 1:    //1
          red=0;
          gre=255;
          blue=255;
          upled();
          break;
      case 2:    //2
          red=0;
          gre=0;
          blue=255;
          upled();
          break;
       case 3:    //3
          red=255;
          gre=0;
          blue=0;
          upled();
          break;
       case 4:    //4
          red=0;
          gre=255;
          blue=0;
          upled();
          break;
       case 5:    //5
          red=255;
          gre=0;
          blue=255;
          upled();
          break;
       case 6:    //6
          red=255;
          gre=255;
          blue=0;
          upled();
          break;
       case 7:    //7
          red=60;
          gre=40;
          blue=0;
          upled();
          break;
      
    }
}

void setup()
{
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
upled();
while(1){
if (irrecv.decode(&results))
{
    Serial.println(results.value, HEX);
    switch(results.value)
    {
      case 0xFF906F:    //EQ
      irrecv.resume();
         main_mode=1;   //settinng
          red=0;
          gre=160;
          blue=255;
          upled();
          break;
       case 0xFFE21D:    //CH+
         if(main_mode==1){
          irrecv.resume();
          red=0;
          gre=255;
          blue=255;
          upled();
          for (int i = 0; i < 3*arrynum+3; i++)
               EEPROM.write(i, 0);
          red=0;
          gre=255;
          blue=125;
          upled();
          goto redelay;
         }
         break;
      case 0xFFC23D:    //start/stop
      irrecv.resume();
         main_mode=0;   //playing
          red=255;
          gre=0;
          blue=255;
          upled();
          readlog();
         goto start;
       case 0xFFA25D:    //CH-
      irrecv.resume();
         main_mode=0;   //playing
          red=255;
          gre=255;
          blue=0;
          upled();
          readlog();
          for(int i=0;i<=arrynum;i++)
            {   if(timeee!=0){
                Serial.println("");
                Serial.print(i);
                Serial.print("==");
                Serial.print("time:");
                int j=timeee/600;
                Serial.print(j,DEC);
                Serial.print(":");
                j=(timeee%600)/10;
                Serial.print(j,DEC);
                Serial.print(".");
                j=timeee%10;
                Serial.print(j,DEC);
                Serial.print("person:");
                  switch(statuse)
                  {
                  case 1:Serial.print("leader1red");break;
                  case 2:Serial.print("leader2yellow");break;
                  case 3:Serial.print("leader3blue");break;
                  case 4:Serial.print("leader4purple");break;
                  case 5:Serial.print("all      green");break;
                  case 6:Serial.print("boys");break;
                  case 7:Serial.print("girls");break;
                  }
            }
            }
         break;
      case 0xFFFFFFFF:
         break;
       default:
         main_mode=0;   //playing
          red=0;
          gre=0;
          blue=0;
          upled();
    }
   
    irrecv.resume();
   }
}
redelay:;
while(1){
if (irrecv.decode(&results))
{
    Serial.println(results.value, HEX);
    if(results.value==0xFFC23D)   ////start/stop
      {
          red=255;
          gre=0;
          blue=255;
          upled();
      irrecv.resume();
      goto start;
      }
    irrecv.resume();
   }
}
start:;
times=millis();
}

void loop() {
timen=millis()-times;
unsigned char status=0;
if(main_mode==1)    //logging
{
    if (irrecv.decode(&results))
    {
    Serial.println(results.value, HEX);
    switch(results.value)
    {
      case 0xFF30CF:    //1
      status=1;
      writelog(status);
      loadled(status);
          break;
      case 0xFF18E7:    //2
      status=2;
      writelog(status);
      loadled(status);
          break;
       case 0xFF7A85:    //3
      status=3;
      writelog(status);
      loadled(status);
          break;
       case 0xFF10EF:    //4
      status=4;
      writelog(status);
      loadled(status);
          break;
       case 0xFF38C7:    //5
      status=5;
      writelog(status);
      loadled(status);
          break;
      case 0xFF5AA5:    //6
      status=6;
      loadled(status);
      writelog(status);
          break;
      case 0xFF42BD:    //7
      status=7;
      loadled(status);
      writelog(status);
          break;
      case 0xFFFFFFFF:
          break;
       default:
          red=255;
          gre=255;
          blue=255;
          upled();
          break;
    }
    irrecv.resume(); // Receive the next value
   }
   
}
else if(main_mode==0)   //playing
{
    unsigned int timeq=int(timen/100);
    if(timeee==timeq)
    {
      loadled(statuse);
      position++;
    }
}
}

shenhaiyu 发表于 2014-6-6 12:48:06

没看懂干什么用的。。。。

yyy_zc 发表于 2014-6-6 13:08:14

做自己爱做的事。

humhumhum 发表于 2014-6-9 11:16:20

请问您那灯罩去哪买的????可给我链接吗???谢谢~~~

friskit 发表于 2014-6-9 11:39:16

humhumhum 发表于 2014-6-9 11:16 static/image/common/back.gif
请问您那灯罩去哪买的????可给我链接吗???谢谢~~~

那是个人体红外传感器的外壳……

humhumhum 发表于 2014-6-9 12:33:51

friskit 发表于 2014-6-9 11:39 static/image/common/back.gif
那是个人体红外传感器的外壳……

非常感谢~~~~~我去找找
页: [1]
查看完整版本: 【教程】诗朗诵定时器---从此音乐和领诵无缝对接。