【Arduino】【アイロンビーズ】温度の見えるコースター

LED

はじめに

温度センサーとLEDテープとアイロンビーズを使って、温度が見えるコースターを作ります。以前から、アイロンビーズを電子工作に使ってみたいと思っていました!

アイロンビーズでコースターを作り、そこに温度センサーを取り付け、コップの温度を測定します。測定した温度はLEDライトに出力し、色で温度を表したいと思います。

構成

温度センサーをコースターの中心につけ、その周りにLEDテープを設置します。

温度と色の関係

センサーで検知した温度は、次の通りの色で表示したいと思います。

グラフに表すと次のようになります。そこから近似式を求めプログラムに使います。(計算がしやすいよう、きりの良い数値に変えました。)

使用部品

・Arduino uno

・温度センサー(DS18B20)1個

・抵抗 5KΩ

・LEDテープ(WS2812B) 20個

・ブレッドボード

・アイロンビーズ 透明





回路図

LEDテープと温度センサーはコースター側に、抵抗はブレッドボード側に配置しました。

構成

アイロンビーズでコースターを作ります。

センサーを付ける場所と、配線を取り出せる場所を作ります。

接着はすべてグルーガンで行いました。

真ん中に温度センサーを付けるため一個開けています。
高さを出すため3段重ねます。開いているところは配線を出すところです。
こちらも3段に重ね周りにLEDを巻き付けます。
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));
  }
}

結果

温度に応じて色が変わりました!

ただ、センサー位置が悪かったのか検知が鈍く、コップを置いてからゆっくり検知しまた。

センサーも直接コップに触れていない為、コップの温度自体が測れませんでした。。。

氷入りコーラ 計測温度:約15℃
しばらく置いた状態 計測温度:約13℃
ホットコーヒー 計測温度:約37℃

まだまだ改善の余地ありますが、今回はこんな感じでした~





コメント

タイトルとURLをコピーしました