wiki:MAX6675Sketch

Version 5 (modified by maris, 12 years ago) ( diff )

--

MAX6675 K型熱電対温度センサのスケッチ

どんなスケッチ(ソフトウェア)で使うのかを説明します。

すでにモジュールが完成していて、Arduino Duemilanoveのデジタル8番~13番の位置に差し込んであるものとします。

手っ取り早い方法

このページの添付ファイル「MAX6675.zip」をダウンロードして、展開します。 展開してできたフォルダを、Arduinoのスケッチブックのフォルダに移動します。 スケッチブックのフォルダは、ウィンドウズでは標準は「マイドキュメント」(XPの場合)または「ドキュメント」(Vistaの場合)の中にある、「Arduino」というフォルダです。

Arduino統合環境を起動して、「ファイル」メニューの「スケッチブック」から「MAX6675」を探して開いてください。

あとは、普通にArduinoに書き込んで実行します。 「シリアルモニタ」を有効にすると、定期的に温度が表示されます。 「-1000.00」と表示された場合は、熱電対がきちんとつながっていません。 また、モジュールが壊れている場合も同様の表示になります。

スケッチの先頭に、以下の定義があります。

#define VCC  8
#define GND  9
#define SLAVE  10

モジュールをデジタルの8番~13番に直結しない場合は、これらの定義を変更してください。

VCCおよびGNDの定義は、デジタルの8番および9番からモジュールに電源供給を行うためです。 こんなずるをしないで、ちゃんと電源に接続する場合は、この2行を削除してください。

SLAVEの定義は、SPIで言うところのスレーブセレクトにデジタルの何番を使うかを決めています。

2011/12/17 追記 Arduino IDE付属のSPIライブラリ対応版をMAX6675_10.zipとしてアップロードしました。 Arduino 1.0で動作を確認していますが、Arduino 0021あたり以降でも使えると思います。

手っ取り早くない方法

慣れている方なら、こっちの方が手っ取り早いかもしれません。

  • 適当な名前でスケッチを新規作成します。
  • 下記の「MAX6675.pde」のソースをコピーして、先ほど作成したスケッチのウィンドウに貼り付けます。
  • ウィンドウの上部右端の「→」のアイコンをクリックするとメニューが現れます。
  • このメニューから「新規タブ」をクリック。
  • 画面下部でファイル名を聞かれます。「SPI.cpp」と入力します。
  • 現れたタブに、下記の「SPI.cpp」の内容をコピーペーストします。
  • 同様に「SPI.h」のタブを作り、「SPI.h」の内容を貼り付けます。

MAX6675.pde

#include "SPI.h"

#define VCC  8
#define GND  9
#define SLAVE  10

void
setup()
{
#ifdef GND
  pinMode(GND, OUTPUT);
  digitalWrite(GND, LOW); 
#endif
#ifdef VCC
  pinMode(VCC, OUTPUT);
  digitalWrite(VCC, HIGH);
#endif

  Serial.begin(9600);
  SPI_Master.begin(SLAVE);
}

void
loop()
{
  int value;

  delay(500);
  SPI_Master.enable(SLAVE);
  value = SPI_Master.read() << 8;
  value |= SPI_Master.read();
  SPI_Master.disable();
  
  if ((value & 0x0004) != 0)
    Serial.println("Error");
  else
    Serial.println((value >> 3) * 0.25);
}

SPI.cpp

#include "SPI.h"

boolean SPI_Master_Class::initialized_ = false;
int SPI_Master_Class::enabled_ = -1;

void
SPI_Master_Class::begin(int slaveselecter) {
  if (!initialized_) {
    initialized_ = true;
    enabled_ = -1;
    pinMode(SS, OUTPUT);  // Must be set as OUTPUT before SPE is asserted.
    pinMode(MOSI, OUTPUT);
    pinMode(MISO, INPUT);
    digitalWrite(MISO, HIGH);  // Pull-up
    pinMode(SCK, OUTPUT);
    SPCR = (1<<SPE)|(1<<MSTR);  // SPE: SPI Enable; MSTR: Master
    byte garbage;
    garbage = SPSR;
    garbage = SPDR;
  }

  if (slaveselecter != SS)
    pinMode(slaveselecter, OUTPUT);
  digitalWrite(slaveselecter, HIGH);  // Disable
}

void
SPI_Master_Class::enable(int slaveselecter) {
  disable();
  digitalWrite(slaveselecter, LOW);
  enabled_ = slaveselecter;
}

void
SPI_Master_Class::disable() {
  if (enabled_ >= 0) {
    digitalWrite(enabled_, HIGH);
    enabled_ = -1;
  }
}

byte
SPI_Master_Class::write_and_read(byte data) const {
  SPDR = data;
  while (!(SPSR & (1<<SPIF)))
    ;
  return SPDR;
}

void
SPI_Master_Class::write(byte data) const {
  write_and_read(data);
}

byte
SPI_Master_Class::read() const {
  return write_and_read(0x00);
}

SPI_Master_Class SPI_Master;

SPI.h

#ifndef __SPI_H__
#define __SPI_H__

#include "WProgram.h"

class SPI_Master_Class {
public:
  static void begin(int slaveselecter);
  void enable(int slaveselecter);
  void disable();
  byte write_and_read(byte data) const;
  void write(byte data) const;
  byte read() const;

private:
  static boolean initialized_;
  static const int SS = 10;
  static const int MOSI = 11;
  static const int MISO = 12;
  static const int SCK = 13;
  static int enabled_;
};

extern SPI_Master_Class SPI_Master;

#endif //__SPI_H__

MAX6675_10.pde (Arduino 1.0付属SPIライブラリ対応版)

#include "SPI.h"

#define VCC  8
#define GND  9
#define SLAVE  10

byte enabled = 255;

void SPI_disable() {
  if (enabled != 255) {
    digitalWrite(enabled, HIGH);
    enabled = 255;
  }
}

void SPI_enable(byte slaveselecter) {
  SPI_disable();
  digitalWrite(slaveselecter, LOW);
  enabled = slaveselecter;
}

byte SPI_read(){
   return SPI.transfer(0x00);
}

void setup() {
#ifdef GND
  pinMode(GND, OUTPUT);
  digitalWrite(GND, LOW); 
#endif
#ifdef VCC
  pinMode(VCC, OUTPUT);
  digitalWrite(VCC, HIGH);
#endif
  pinMode(SLAVE, OUTPUT);
  digitalWrite(SLAVE, HIGH);

  Serial.begin(9600);
//  SPI_Master.begin(SLAVE);
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV4);
  SPI.setDataMode(SPI_MODE0);
}

void loop() {
  int value;

  delay(500);
  SPI_enable(SLAVE);        //  SPI_Master.enable(SLAVE);
  value = SPI_read() << 8;  //  value = SPI_Master.read() << 8;
  value |= SPI_read();      //  value |= SPI_Master.read();
  SPI_disable();            //  SPI_Master.disable();
  
  if ((value & 0x0004) != 0){
    Serial.println("Error");
  } else {
    Serial.println((value >> 3) * 0.25);
  }
}

Attachments (4)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.