読者です 読者をやめる 読者になる 読者になる

6/4

 温度によりLEDの色を変化させるプログラム。

 

 

 ----------------------------------------------------------------

const float RefV=1.1;
float temp1, temp2, temp3, temp4, temp5;

void setup(){
// シリアル通信の設定
Serial.begin(9600);
// AD変換の参照電圧を内部参照(1.1V)とする。
analogReference(INTERNAL);
}
void loop(){

// 使用変数の宣言
int i1, i2, i3; // 各LEDの電流値

// 温度データの取得
int indata=analogRead(0);
float temp = (RefV/1024)*indata/0.01;

temp5 = temp4;
temp4 = temp3;
temp3 = temp2;
temp2 = temp1;
temp1 = temp;

temp = (temp1+temp2+temp3+temp4+temp5) / 5;

// 青色(blue)用の電流値設定
/* f
低温領域(T<Tc1)のみ値をとるようにする
*/
float currmax1 = 255;
float currmin1 = 10;
float Tmin1 = 22;
float Tc1 = 26;


if (temp < Tc1)
{
if (temp < Tmin1)
{
i1=int(currmax1);
}
else
{
i1=int( (currmin1-currmax1)*(temp-Tc1)/(Tc1-Tmin1)+currmin1);
}
}
else
{
i1=int(currmin1);
}

// 緑色(green)用の電流値設定
/*
中温領域(Tmin2<T<Tmax2)のみ値をとるようにする
*/

float currmax2 = 255;
float currmin2 = 10;
float Tmin2 = 22;
float Tc2 = 26;
float Tcw2 = 1;
float Tmax2 = 30;

if (temp > Tmin2) {
if (temp < Tmax2) {
if (temp < Tc2 - Tcw2) {
i2=int( (currmax2-currmin2)*(temp-Tmin2)/( (Tc2-Tcw2)-Tmin2)+currmin2);
}
else {
if (temp > Tc2 + Tcw2) {
i2=int( (currmin2-currmax2)*(temp-Tmax2)/(Tmax2-(Tc2+Tcw2))+currmin2);
}
else {
i2=int(currmax2);
}
}
}
else{
i2=int(currmin2);
}
}
else{
i2=int(currmin2);
}
if (i2>255) {
i2=255;
}

// 赤色(red)用の電流値設定
/*
高温領域(Tc3<T)のみ値をとるようにする
*/
float currmax3 = 255;
float currmin3 = 10;
float Tc3 = 26;
float Tmax3 = 30;

if (temp > Tc3) {
if (temp < Tmax3) {
i3=int( (currmax3-currmin3)*(temp-Tc3)/(Tmax3-Tc3)+currmin3);
}
else {
i3=int(currmax3);
}
}
else{
i3=int(currmin3);
}

// 設定電流値のシリアル出力
Serial.print("T=");
Serial.print(temp);
Serial.print(" C, blue = ");
Serial.print(i1);
Serial.print(", green = ");
Serial.print(i2);
Serial.print(", red= ");
Serial.print(i3);
Serial.print(", sum= ");
Serial.println(i1+i2+i3);

// 設定電流値の電流出力
analogWrite(9,i1);
analogWrite(10,i2);
analogWrite(11,i3);
}

------------------------

Arduino 日本語リファレンス

このサイトを参考に学習した。