はじめに
温度センサーとLEDテープとアイロンビーズを使って、温度が見えるコースターを作ります。以前から、アイロンビーズを電子工作に使ってみたいと思っていました!
アイロンビーズでコースターを作り、そこに温度センサーを取り付け、コップの温度を測定します。測定した温度はLEDライトに出力し、色で温度を表したいと思います。
構成
温度センサーをコースターの中心につけ、その周りにLEDテープを設置します。
温度と色の関係
センサーで検知した温度は、次の通りの色で表示したいと思います。
グラフに表すと次のようになります。そこから近似式を求めプログラムに使います。(計算がしやすいよう、きりの良い数値に変えました。)
使用部品
・Arduino uno
・温度センサー(DS18B20)1個
・抵抗 5KΩ
・LEDテープ(WS2812B) 20個
・ブレッドボード
・アイロンビーズ 透明
回路図
LEDテープと温度センサーはコースター側に、抵抗はブレッドボード側に配置しました。
構成
アイロンビーズでコースターを作ります。
センサーを付ける場所と、配線を取り出せる場所を作ります。
接着はすべてグルーガンで行いました。
プログラム
#include <Adafruit_NeoPixel.h> //LEDテープ用ライブラリ
#include <OneWire.h> //温度センサー用ライブラリ
#include <DallasTemperature.h> //温度センサー用ライブラリ
#define PIN 6 //Arduinoで使うピン
#define NUMPIXELS 20 //LEDの数
#define ONE_WIRE_BUS 2 //データを取得するピン番号
#define SENSER_BIT 10 //計測精度を設定するbit数
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int tblue = 0; //青最終出力用変数初期化
int tgreen = 0; //緑最終出力用変数初期化
int tred = 0; //赤最終出力用変数初期化
int tbrightness = 0; //明るさ変数初期化
float R_value; //赤数値計算用
float R_value_temp; //赤数値計算用
float G_value; //緑数値計算用
float G_value_temp; //緑数値計算用
float B_value; //青数値計算用
float B_value_temp; //青数値計算用
float t; //温度格納用変数
void setup() {
pixels.begin(); // ライブラリ使用開始
Serial.begin(9600);
color(0,0,0,100); //LED出力初期化
sensors.setResolution(SENSER_BIT); //温度センサー取得初期設定
}
void loop() {
sensors.requestTemperatures(); //温度取得
t=sensors.getTempCByIndex(0); //温度をiに格納
//Redの計算
if(t<=30){ //グラフに沿った係数をかける
R_value_temp=t*3.3;
}else{
R_value_temp=t*31-830;
}
if(R_value_temp<=255){
R_value=R_value_temp;
}else if(R_value_temp>255){ //255を超えた場合255固定
R_value=255;
}else if(R_value_temp<=0){ //0以下は0に固定
R_value=0;
}
//Blueの計算
if(t<=30){ //グラフに沿った係数をかける
B_value_temp=t*-35+1305;
}else{
B_value_temp=t*-3.2+192;
}
if(B_value_temp<=255){
B_value=B_value_temp;
}else if(B_value_temp>255){ //255を超えた場合255固定
B_value=255;
}else if(B_value_temp<=0){ //0以下は0に固定
B_value=0;
}
//Greenの計算
if(t<=30){ //グラフに沿った係数をかける
G_value_temp=t*6.6;
}else{
G_value_temp=t*-6.6+400;
}
if(G_value_temp<=255){
G_value=G_value_temp;
}else if(G_value_temp>255){ //255を超えた場合255固定
G_value=255;
}else if(G_value_temp<=0){ //0以下は0に固定
G_value=0;
}
Serial.print("温度:");
Serial.print(t); //取得した温度データを表示
Serial.println("℃");
Serial.print("R:");
Serial.println(R_value);
Serial.print("G:");
Serial.println(G_value);
Serial.print("B:");
Serial.println(B_value);
Serial.println("");
tred= R_value;
tgreen=G_value;
tblue=B_value;
tbrightness=70; //明るさ(上げすぎ注意)
color(tred,tgreen,tblue, tbrightness); //LEDに出力
pixels.show();
delay(500);
}
//LED表示用関数
void color(int cred, int cgreen, int cblue, int brightness) {
pixels.setBrightness(brightness);
for(int i=0; i < NUMPIXELS; i++){
pixels.setPixelColor(i,pixels.Color(cred,cgreen,cblue));
}
}
結果
温度に応じて色が変わりました!
ただ、センサー位置が悪かったのか検知が鈍く、コップを置いてからゆっくり検知しまた。
センサーも直接コップに触れていない為、コップの温度自体が測れませんでした。。。
まだまだ改善の余地ありますが、今回はこんな感じでした~
コメント