ESP32

Connection of Thermocouple (K-Type) to ESP8266/ESP32/Arduino

기하 2021. 8. 23. 21:17

열전대온도센서  연결 하기 위해 여러 유형의 변환기를 사용할 수 있습니다 . 

열전대는 매우 낮은 온도와 매우 높은 온도를 측정할 수 있습니다.

K-타입 열전대온도센서를 마이크로컨트롤러 SPI 버스에 연결하기 위한 MAX6675 모듈

 

저렴한 MAX6675모듈은 SPI 버스를 통해 열전대에서 가져온 데이터를 전송합니다. 

보드에 12비트 ADC가 있습니다. 

0 ~ + 700 ℃의 온도만 측정하고 열전대의 파손을 감지할 수 있습니다. 가격은 약 1.5 USD입니다.

K-타입 열전대온도센서를 SPI 버스의 마이크로컨트롤러에 연결하기 위한 MAX31855 모듈

 

MAX6675를 대체하는 보다 고가의 최신 모듈인 MAX31855 도 SPI 버스를 통해 데이터를 전송합니다. 

기능은 MAX6675보다 우수합니다.

  • 14비트 ADC.
  • 파손의 정의the definition of the breakage와는 별도로
    열전대 출력은 VCC 또는 GND에 의해 추가로 결정됩니다.
  • 측정된 온도 범위 -270 ~ +1768 ℃(최대 범위).
  • 가격은 약 1.9 USD이며 러시아로부터 배송됩니다.

열전대에 MAX31855 연결

 

그 판에는 한 가지 문제가 있습니다. 나사 커넥터는 개발자가 의도한 대로 열전대 단자를 고정할 수 없습니다. 

터미널 절반의 나사를 조여야 하지만 정상적으로 유지됩니다.

 

 Aliexpress 가능 적어도 세 MAX31855와 보드의 변형. 가장 비싼 것은 광범위한 스트랩과 함께 제공됩니다. 비용은 약 8 USD입니다. 저렴한 옵션의 차이점을 몰랐습니다. 3V와 Vin 입구가 따로 있다는 점만 빼면. 나는 1.9 USD 보드를 사용했고 3.3V를 공급했습니다. 중국산 비교 설명에서는 예산이 비싼 보드를 찾지 못했다.

 

기사 중 하나 에서 자동 치즈 요리를 위한 회로에 대해 썼습니다 . 우유의 온도와 증기욕의 액체 온도를 측정하기 위해 방금 열전대를 사용했습니다.

Wemos D1 min 및 MAX6675K

MAX6675K 위모스 D1 미니
Vcc 3.3V(저는 BP를 사용했습니다)
접지 접지 (BP 및 Wemos D1 Mini에서)
그래서 D6(GPIO12)
SS/CS D7(GPIO13)
Csk D8(GPIO15)

Earth (GND) MAX6675 및 (GND) Wemos D1 Mini는 MAX6675가 별도의 전원으로 구동되는 경우 연결되어야 합니다.

 

SPI 인터페이스는 데이터 교환을 위해 4개의 라인을 사용합니다.

  • SCLK-직렬 클럭: 클럭 신호(리드에서) 기타
    명칭: SCK, CLK
  • MOSI-마스터 출력, 슬레이브 입력: Vedomo
    mudrugie 표기법으로 이어지는 데이터 : SDI, DI, SI
  • MISO — 마스터 입력, 슬레이브 출력: Vedushhemudrug
    즉 구동 표기법의 데이터: SDO, do, SO
  • SS-슬레이브 선택: 슬레이브 선택; 에 의해 설립
    NCS, CS, CSB, CSN, NSS, STE : 다른 명칭

https://github.com/YuriiSalimov/MAX6675_Thermocouple 라이브러리가 사용됩니다. d MAX6675 카드에서 열전쌍 데이터를 제거합니다. A dafruit Max6675 라이브러리 의 이전 라이브러리를 기반으로 합니다.

#include "MAX6675_열전대. H"//https://github.com/YuriiSalimov/MAX6675_Thermocouple

 

#define SCK_PIN 15//D8

#define CS_PIN 13//D7

#define SO_PIN 12//D6

 

/**

평균 온도를 결정하기 위해 얼마나 많은 판독값을 취했는지.

값이 많을수록 보정이 더 오래 수행되고,

그러나 판독 값이 더 정확할 것입니다.

*/

#define READINGS_NUMBER 20

 

/**

온도 판독 사이의 지연 시간

온도 센서(ms)에서.

*/

#define DELAY_TIME 20

 

 

MAX6675_Thermocouple * 열전쌍 = NULL ;

 

무효 설정 ()

{

연속물. 시작 ( 9600 ) ;

 

써모커플 = 새로운 MAX6675_Thermocouple ( SCK_PIN, CS_PIN, SO_PIN, Readings_number, DELAY_TIME ) ;

}

 

무효 루프 ()

{

Const 이중 섭씨 = 열전쌍- > readCelsius () ;

Const DOUBLE Kelvin = 열전대- > readKelvin () ;

Const 이중 화씨 = 열전쌍- > readFahrenheit () ;

연속물. 인쇄 ( "온도:" ) ;

연속물. Print ( 문자열 ( 섭씨 ) + "C," ) ;

연속물. Print ( String ( Kelvin ) + "K," ) ;

연속물. println ( 문자열 ( 화씨 ) + "F" ) ;

지연 ( 500 ) ;

}

프로그램 결과:

19 : 14 : 01.820 - > 온도 : 28.50 C, 301.65 K, 83.30 F

19 : 14 : 05.538 - > 온도 : 28.75 C, 301.90 K, 83.75 F

19 : 14 : 09.278 - > 온도 : 28.50 C, 301.65 K, 83.30 F

19 : 14 : 13.025 - > 온도 : 28.50 C, 301.65 K, 83.30 F

19 : 14 : 16.730 - > 온도 : 28.75 C, 301.90 K, 83.75 F

실내 온도가 28.5 Oc가 아니라 더 낮기 때문에 센서를 보정해야 합니다.

ESP32 DevKit 및 MAX6675K

이 요금은 ESP32 보드로 사용 됩니다.

MAX6675K ESP32 데브킷
Vcc 3.3V(저는 BP를 사용했습니다)
접지 접지 (BP 및 Wemos D1 Mini에서)
그래서 12 (IO12)
SS/CS 13 (IO13)
Csk 15 (IO15)

변경되지 않은 코드는 ESP32에서 작동합니다.

#include "MAX6675_열전대. H"//https://github.com/YuriiSalimov/MAX6675_Thermocouple

 

#SCK_PIN 15 정의

#CS_PIN 13 정의

#SO_PIN 12 정의

 

/**

평균 온도를 결정하기 위해 얼마나 많은 판독값을 취했는지.

값이 많을수록 보정이 더 오래 수행되고,

그러나 판독 값이 더 정확할 것입니다.

*/

#define READINGS_NUMBER 20

 

/**

온도 판독 사이의 지연 시간

온도 센서(ms)에서.

*/

#define DELAY_TIME 20

 

 

MAX6675_Thermocouple * 열전쌍 = NULL ;

 

무효 설정 ()

{

연속물. 시작 ( 9600 ) ;

 

써모커플 = 새로운 MAX6675_Thermocouple ( SCK_PIN, CS_PIN, SO_PIN, Readings_number, DELAY_TIME ) ;

}

 

무효 루프 ()

{

Const 이중 섭씨 = 열전쌍- > readCelsius () ;

Const DOUBLE Kelvin = 열전대- > readKelvin () ;

Const 이중 화씨 = 열전쌍- > readFahrenheit () ;

연속물. 인쇄 ( "온도:" ) ;

연속물. Print ( 문자열 ( 섭씨 ) + "C," ) ;

연속물. Print ( String ( Kelvin ) + "K," ) ;

연속물. println ( 문자열 ( 화씨 ) + "F" ) ;

지연 ( 500 ) ;

}

결과:

21 : 16 : 42.882 - > 온도 : 26.25 C, 299.40 K, 79.25 F

21 : 16 : 46.554 - > 온도 : 26.75 C, 299.90 K, 80.15 F

21 : 16 : 50.256 - > 온도 : 26.50 C, 299.65 K, 79.70 F

21 : 16 : 53.926 - > 온도 : 26.25 C, 299.40 K, 79.25 F

21 : 17 : 30.707 - > 온도 : 26.50 C, 299.65 K, 79.70 F

이상하지만 ESP32는 ESP8266보다 정확한 온도를 읽습니다. 방의 온도는 약 26.5 Oc입니다.

ESP32 및 MAX31855

ESP32는 Adafrui t C 소프트웨어 에뮬레이션 에서 라이브러리를 얻었습니다 . GPIO는 MAX6675의 예와 동일하게 사용되었습니다.

#포함 < SPI. 시간.

#include "Adafruit_MAX31855. H"//https://github.com/adafruit/Adafruit-MAX31855-library/

 

기본 연결되어 사용하여 소프트웨어 SPI,하지만 주석 의 주석 하나

소프트웨어 SPI 하드웨어 SPI 사이 전환하는 아래의 두 가지 예 :

 

3개에서 소프트웨어 SPI를 사용하여 Thermocouple 인스턴스를 생성하는 예

디지털 IO 핀.

#MAXDO 12 정의

#MAXCS 13 정의

#MAXCLK 15 정의

 

열전대 초기화

Adafruit_MAX31855 열전대 ( MAXCLK, MAXCS, MAXDO ) ;

 

하드웨어 SPI로 Thermocouple 인스턴스를 생성하는 예

주어진 CS 핀에서.

#MAXCS 10 정의

Adafruit_MAX31855 열전대 ( MAXCS ) ;

 

무효 설정 () {

연속물. 시작 ( 115200 ) ;

 

연속물. println ( "MAX31855 테스트" ) ; 대기 에 대한 MAX 칩 안정

지연 ( 500 ) ;

}

 

무효 루프 () {

기본 판독 테스트, 현재 온도만 인쇄

연속물. 인쇄 ( "온도:" ) ;

 

더블 c = 열전대. 섭씨 읽기 () ;

 

if ( isNaN ( c )) {

연속물. println ( "열전쌍에 문제가 있습니다!" ) ;

또 다른

연속물. 인쇄 ( 문자열 ( c ) + "C," ) ;

연속물. Print ( 문자열 ( 열전대. readFarenheit ()) + "F," ) ;

연속물. println ( 문자열 ( 열전대. readInternal ()) + "C (내부)" ) ;

}

지연 ( 1000 ) ;

}

결과:

15시 39분 : 44.805 - > 온도 : 24.25 C, 77.90 F, 25.94 C ( 내부 )

15시 39분 : 45.977 - > 온도 : 24.25 C, 77.45 F, 25.88 C ( 내부 )

15:39 : 47.190 - > 온도 : 25.50 C, 77.90 F, 25.94 C ( 내부 )

15:39 : 48.396 - > 온도 : 25.25 C, 77.90 F, 25.94 C ( 내부 )

15시 39분 : 49.618 - > 온도 : 25.00 C, 78.35 F, 25.94 C ( 내부 )

하드웨어 SPI로 라이브러리를 실행해 보겠습니다.

  • SPI MOSI-GPIO23
  • SPI 미소-GPIO19
  • SPI SCK-GPIO18
  • SPI SS(CS)-GPIO5

코드는 훨씬 간단하지만 모든 것이 잘 작동합니다.

#포함 < SPI. 시간.

#include "Adafruit_MAX31855. H"//https://github.com/adafruit/Adafruit-MAX31855-library/

 

#MAXCS 5 정의

Adafruit_MAX31855 열전대 ( MAXCS ) ;

 

무효 설정 () {

연속물. 시작 ( 115200 ) ;

 

연속물. println ( "MAX31855 테스트" ) ; 대기 에 대한 MAX 칩 안정

지연 ( 500 ) ;

}

 

무효 루프 () {

기본 판독 테스트, 현재 온도만 인쇄

연속물. 인쇄 ( "온도:" ) ;

 

더블 c = 열전대. 섭씨 읽기 () ;

 

if ( isNaN ( c )) {

연속물. println ( "열전쌍에 문제가 있습니다!" ) ;

또 다른

연속물. 인쇄 ( 문자열 ( c ) + "C," ) ;

연속물. Print ( 문자열 ( 열전대. readFarenheit ()) + "F," ) ;

연속물. println ( 문자열 ( 열전대. readInternal ()) + "C (내부)" ) ;

}

지연 ( 1000 ) ;

}

https: //github.com/SV-Zanshin/MAX31855/Library 는 SPI 하드웨어에서 잘 작동합니다.

#포함 < MAX31855. h >//https://github.com/SV-Zanshin/MAX31855/

/**************************************************** *********************************************** ****************

* * 모든 프로그램 상수 선언 * *

************************************************** *********************************************** ***************/

Const uint32_t SERIAL_SPEED = 115200; < 전송 속도 설정 을위한 직렬 I / O를

Const uint8_t SPI_CHIP_SELECT = 5; < SPI 칩 선택 PIN

Const uint8_t SPI_MISO = MISO; < SPI Master-In, Slave-Out PIN

Const uint8_t SPI_SYSTEM_CLOCK = SCK; < SPI 시스템 클록 PIN

 

/**************************************************** *********************************************** ****************

* * 전역 변수 선언 및 클래스 인스턴스화 * *

************************************************** *********************************************** ***************/

MAX31855_클래스 MAX31855; < MAX31855의 인스턴스 생성

 

/**************************************************** ************************************************** *********/ /*!

* @brief Arduino 메서드는 시작 시 시스템을 초기화하기 위해 한 번 호출됩니다.

* @details 부팅 또는 재시작 시 가장 먼저 호출되는 Arduino IDE 메서드입니다. 한 번만 호출됩니다.

* 그런 다음 제어는 메인 "loop()"로 이동합니다. 컨트롤이 반환되지 않는 메서드

* @반환 무효

************************************************** *********************************************** ***************/

무효 설정 ()

{

연속물. 시작 ( SERIAL_SPEED ) ;

#ifdef __Avr_atmegea32u4__//이것이 32U4 프로세서인 경우 인터페이스가 초기화될 때까지 3초 동안 기다립니다.

지연 ( 3000 ) ;

#endif

연속물. println ( F ( " MAX31855 소프트웨어 SPI 데모 프로그램 시작 하기 " )) ;

연속물. Print ( F ( "MAX31855 ensorn 초기화 중" )) ;

/**************************************************** *******************************************

* * 사용 중인 하드웨어 또는 소프트웨어 SPI 호출의 주석 해제 * *

************************************************** **********************************************/

while ( ! MAX31855. 시작 ( SPI_CHIP_SELECT )) // MAX31855 하드웨어 SPI

while ( ! MAX31855. Begin ( SPI_CHIP_SELECT, SPI_MISO, SPI_SYSTSEM_CLOCK )) // MAX31855 소프트웨어 SPI

{

연속물. println ( F ( "MAX31855를 시작할 수 없습니다. 3초 동안 대기 중입니다." )) ;

지연 ( 3000 ) ;

}//기기를 찾을 때까지 루프

연속물. println () ;

}//메소드 설정()

 

/**************************************************** ************************************************** *********/ /*!

* 메인 프로그램 루프를 위한 @brief Arduino 메소드

* @details 아두이노 IDE의 메인 프로그램으로 무한루프이고 계속 반복됩니다.

* @반환 무효

************************************************** *********************************************** ***************/

무효 루프 ()

{

int32_t 주변 온도 = MAX31855. readAmbient () ; MAX31855 다이 검색 주변 온도

int32_t 프로브 온도 = MAX31855. 읽기 프로브 () ; 열전대 프로브 온도 검색

uint8_t 오류 코드 = MAX31855. 오류 () ; 오류 코드 검색

if ( faultCode )//있는 경우 오류 코드 표시

{

연속물. 인쇄 ( "오류 코드" ) ;

연속물. 인쇄 ( faultCode ) ;

연속물. println ( "반환되었습니다." ) ;

}

또 다른

{

연속물. 인쇄 ( "주변 온도는" ) ;

연속물. 인쇄 (( float ) ambientTemperature/1000,3 ) ;

연속물. println ( "xC2xB0" "C" ) ;

연속물. 인쇄 ( "프로브 온도는" ) ;

연속물. 인쇄 (( float ) probeTemperature/1000,3 ) ;

연속물. println ( "xC2xB0" "Cn" ) ;

}//If-then-else 오류가 발생했습니다.

지연 ( 5000 ) ;

}//Of 메서드 루프()

유용한 링크

 

[출처] https://www.bizkit.ru/en/2019/03/13/13547/