2007.8.18

  • 色変えるプログラム
デキター! キタコレ! 泣きそう。
/***
  呼吸-LED1
  pwmを用いない → 赤/青LEDだけ用いる
  平均値の出し方を随時に変えてみたバージョン
  LEDは2色だけ
  b_led_re_re4_noheikin_redをpwm用いないように書き換えた
  b_led_re_re4_noheikin_red1を参考にした(←LED1個verの)。
  b_led_re_re4_noheikin_red2の、pwmを[赤/青LEDだけ]に変更
  b_led_re_re4_noheikin_red3に、how_to_38kHzの赤外線LED追加
  ***/
 
 
//sekibun
  int i = 0;
  int h[70] = { 0 };
  long sum = 0;
  int heikin1, heikin2;
  int now;
 
//maxx
  int maxx;
  int widthh[4] = { 8, 8, 8, 8 };
  char line1, line2;
  long t = 0;
  long time1, time2;
  int widadd = 8;
 
//Yellow_LED
  int ledPin3 = 11;   // LED connected to digital pin 11
//  int YPW1 = 1;
  int YPW2 = 4;
  int k1 = 0;
 
//Red_LED
  int ledPin2 = 12;   // LED connected to digital pin 12
  int RPW1 = 0;
  int RPW2 = 1;
//  int k2 = 0;
  int k3 = 0;
 
//Blue_LED
  int ledPin1 = 10;   // LED connected to digital pin 10
  int BPW1 = 0;
  int BPW2 = 1;
 
//赤外線LED
  int IRPin = 2;
  int pulsos[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
  int cont = 0;
  int cont2 = 0;
 
//赤外線受信モジュール
  int sekimoju;
 
//同期LED
  int ledPin4 = 9;
  int douki = 0;
 
 
//LEDその他
  int sokudo = 0;
/*  k1, k2, k3 について
 *  ** k1 **
 *    k1 = 0  // 上向きのベクトルのとき(温度上昇時)
 *    k1 = 1  // 下向きのベクトルのとき(温度下降時)
 *  ** k2 **
 *    k2 = 0  // 振幅が350(基準値)より小のとき
 *    k2 = 1  // 振幅が350(基準値)より大のとき
 *  ** k3 **
 *    k3 = 0  // 連続で出るYPW2=150の、150が最初に出たとき
 *    k3 = 1  // 2個目以降の150のとき
 */
 
void setup()
{
  Serial.begin(9600);
  pinMode(ledPin1, OUTPUT); 
  pinMode(ledPin2, OUTPUT); 
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT); 
  pinMode(IRPin, OUTPUT);
}
 
void loop()
{
  sum = 0;
  heikin1 = heikin2;
  // ここで70幅分の平均値をずらしながら計算
  for(i=69 ; i>=1 ; i--){
    h[i] = h[i-1];
    sum += h[i];
  }
  h[0] = analogRead(0);
  sum += h[0];
  heikin2 = sum/70;
 
  t++;
  if(t >= 2147483647){
    t = 0;
  }
 
  //LED_Yellow and Red  
      if(k1 == 1){ // 下向きのベクトルのとき(温度下降時)
        if(YPW2 > 1){
            YPW2 = YPW2 - 2 ; // LEDだんだん暗く
        }
        if(YPW2 <= 1){
          YPW2 = 1;
        }
      }
      if(k1 == 0){ // 上向きのベクトルのとき(温度上昇時)
         if(YPW2 < 150){
           k3 = 0;
           YPW2 = YPW2 + 2;// LEDだんだん明るく
         }
         if(YPW2 >= 150){
           YPW2 = 150;
           if(k3 == 0){  //要はLEDがmaxのとき
             time1 = time2;
             time2 = t;
             widthh[0] = time2 - time1;   // 振幅
 
             if(widthh[0] >= 400){ 
          // 振幅が増加するとき だんだん青に
               if(sokudo >= -4) sokudo++;
             }
             else if(widthh[0] <= 250){
          // 振幅が減少するとき だんだん赤に
               if(sokudo <= 4)  sokudo--;
             }
             else if(widthh[0]>250 && widthh[0]<400){ 
          // 振幅基準値
               if(sokudo >= 1)  sokudo--;
               if(sokudo <= -1) sokudo++;
             }
             k3 = 1;
           }
           //赤外線LED
           for(cont=0;cont<28;cont++){
            if(pulsos[cont]==1){
	      for(cont2=0;cont2<38;cont2++){ 
	        digitalWrite(IRPin,HIGH);
	        delayMicroseconds(13);
	        digitalWrite(IRPin, LOW);
	        delayMicroseconds(13);
	      } 
            }else{
	      digitalWrite(IRPin, LOW);
	      delay(1);
            }
          }
         }
      }
      analogWrite(ledPin3, YPW2);   // sets the LED on
 
//LED_Red and Blue
  if(sokudo <= 1 && sokudo >= -1){ // 振幅基準値 (LED黄色)
  // LED明るさ0に
    RPW1 = BPW1 = 0;
    RPW2 = BPW2 = 1;
  }
  if(sokudo == 2){ // 振幅が増加するとき だんだん青に
    RPW1 = 0;    RPW2 = 1;
    BPW1 = 1;    BPW2 = 10;
  }
  if(sokudo == 3){ // 振幅が増加するとき だんだん青に
    RPW1 = 0;    RPW2 = 1;
    BPW1 = 1;    BPW2 = 5;
  }
  if(sokudo == 4){ // 振幅が増加するとき だんだん青に
    RPW1 = 0;    RPW2 = 1;
    BPW1 = 2;    BPW2 = 4;
  }
  if(sokudo == 5){ // 振幅が増加するとき だんだん青に
    RPW1 = 0;    RPW2 = 1;
    BPW1 = 2;    BPW2 = 1;
  }
  //
  if(sokudo == -2){ // 振幅が増加するとき だんだん赤に
    RPW1 = 1;    RPW2 = 10;
    BPW1 = 0;    BPW2 = 1;
  }
  if(sokudo == -3){ // 振幅が増加するとき だんだん赤に
    RPW1 = 1;    RPW2 = 5;
    BPW1 = 0;    BPW2 = 1;
  }
  if(sokudo == -4){ // 振幅が増加するとき だんだん赤に
    RPW1 = 2;    RPW2 = 4;
    BPW1 = 0;    BPW2 = 1;
  }
  if(sokudo == -5){ // 振幅が増加するとき だんだん赤に
    RPW1 = 2;    RPW2 = 1;
    BPW1 = 0;    BPW2 = 1;
  }
 
  // Red LED
  digitalWrite(ledPin2, HIGH);   // sets the LED on Red
  delay(RPW1);
  digitalWrite(ledPin2, LOW);    // sets the LED off Red
  delay(RPW2);
  // Blue LED
  digitalWrite(ledPin1, HIGH);   // sets the LED on Blue
  delay(BPW1); 
  digitalWrite(ledPin1, LOW);    // sets the LED off Blue
  delay(BPW2);
 
 
  //* Down *//
  if(heikin1 > heikin2){
    if((line1 == 'U' && line2 == 'F') || 
    (line1 == 'F' && line2 == 'U') ||
    (line1 == 'U' && line2 == 'U')){
    line1 = line2;
    line2 = 'D';
 
    k1 = 1;
    }
 
    else if(line1 == 'F' && line2 == 'F'){
      line1 = line2;
      line2 = 'D';
 
      k1 = 1;
    }
    else{
      line1 = line2;
      line2 = 'F';
    }
  }
 
  //* Up *//
  else if(heikin1 < heikin2){
    if((line1 == 'D' && line2 == 'F') || 
    (line1 == 'F' && line2 == 'D') ||
    (line1 == 'D' && line2 == 'D') ||
    (line1 == 'F' && line2 == 'F')){
      line1 = line2;
      line2 = 'U';
      k1 = 0;
    }
    else{
      line1 = line2;
      line2 = 'F';
    }
  }
 
  //* Flat *//
  else {
    line1 = line2;
    line2 = 'F';
  }
 
  //* 赤外線受信モジュール *//
  sekimoju = analogRead(1);
 
  if(sekimoju <= 1 && k3 == 0){
    for(i=0 ; i<=10 || douki>=250 ; i++){
      douki = douki + 4;
      analogWrite(ledPin4, douki);
    }
  }else{
    douki = 0;
    analogWrite(ledPin4, douki);
  }
  Serial.println(heikin2);
}
 
振幅(赤と青に変わる程度)の値は要検討。


コメント
名前:
コメント:





today: -
yesterday: -
最終更新:2007年08月23日 23:21