/***
呼吸-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);
}