2015年12月25日 星期五

Arduino收集溫度數據並分析

用Arduino加上溫度計,進行熱與溫度的實驗,收集數據並分析。可以輕易的獲取大量的數據,長時間收集數據後,再把數據交給學生分析討論也沒問題。數據收集中的畫面,可以用PLX-daq即時收集起來,畫成圖。就是每蒐集一個點,excel的圖就會長出一個點這樣...



然後把電腦的畫面,用AirParrot2, 或是miracast等方式投影到大螢幕上,就可以讓全班看到然後討論了。

如果可以架個webcam,就可以同時把實驗的實況和數據同時都從電腦投出來給全班看。應該也是不錯的實驗觀察方式。

本來是要看冰塊融化時的溫度的,不過這還需要更多麻煩的設備,就算了,看沸騰就好。把比較低溫的部份數據切掉就變成下面這張圖。



橘色的線是另一個溫度計,測室溫。

Arduino溫度計的作法:by 阿簡

p.s. 從34度到沸騰這條線,很直對吧。這是R2>0.99的直線,怎麼弄這麼直呢?酒精燈火給它開大一點就行了!(提供熱的速度遠大於散熱速度)



code
//從阿簡那邊拿到的code, 將LCD部分做了調整。包括 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE)
//把 lcd.init; 改成 lcd.begin(16, 2); LCD就可以運作了



#include <Wire.h>  // Arduino IDE 內建
// LCD I2C Library,從這裡可以下載:
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
#include <LiquidCrystal_I2C.h>

// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // 設定 LCD I2C 位址


// 匯入程式庫標頭檔
//from http://playground.arduino.cc/Learning/OneWire
#include <OneWire.h>

//from https://github.com/milesburton/Arduino-Temperature-Control-Library
#include <DallasTemperature.h>
#include <Wire.h>

// from http://arduino-info.wikispaces.com/file/view/LiquidCrystal_I2C1602V1.zip

int row =0;

// Arduino數位腳位2接到1-Wire裝置
#define ONE_WIRE_BUS 2

// 運用程式庫建立物件
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);





void setup(void)
{

  sensors.begin();
  lcd.begin(16, 2);
  lcd.backlight();

  // 初始化
  Serial.begin(9600);
}

void loop(void)
{
  // 要求匯流排上的所有感測器進行溫度轉換
  sensors.requestTemperatures();

  // 參數0代表匯流排上第0個1-Wire裝置

  Serial.print("DATA,TIME");
  Serial.print(",");
  Serial.print("TIMER");
  Serial.print(",");
  Serial.print(sensors.getTempCByIndex(0));
  Serial.print(",");
  Serial.print(sensors.getTempCByIndex(1));
  Serial.println(",");

  row ++;

  //超過1000行資料後就覆蓋舊資料
  /*
  if (row > 1000)
  {
    row=0;
    Serial.println("ROW,SET,2");
  }
  */


  lcd.setCursor(0, 0);
  lcd.print("T1:");
  lcd.print(sensors.getTempCByIndex(0));
  lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print("T2:");
  lcd.print(sensors.getTempCByIndex(1));
  lcd.print("C");


  delay(100);
}


沒有留言: