GY-63_MS5611/libraries/MAX6675/README.md

287 lines
9.0 KiB
Markdown
Raw Normal View History

2022-01-12 08:49:49 -05:00
[![Arduino CI](https://github.com/RobTillaart/MAX6675/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
[![Arduino-lint](https://github.com/RobTillaart/MAX6675/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/MAX6675/actions/workflows/arduino-lint.yml)
[![JSON check](https://github.com/RobTillaart/MAX6675/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/MAX6675/actions/workflows/jsoncheck.yml)
2023-11-12 04:18:34 -05:00
[![GitHub issues](https://img.shields.io/github/issues/RobTillaart/MAX6675.svg)](https://github.com/RobTillaart/MAX6675/issues)
2022-01-12 08:49:49 -05:00
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/MAX6675/blob/master/LICENSE)
[![GitHub release](https://img.shields.io/github/release/RobTillaart/MAX6675.svg?maxAge=3600)](https://github.com/RobTillaart/MAX6675/releases)
2023-11-12 04:18:34 -05:00
[![PlatformIO Registry](https://badges.registry.platformio.org/packages/robtillaart/library/MAX6675.svg)](https://registry.platformio.org/libraries/robtillaart/MAX6675)
2022-01-12 08:49:49 -05:00
# MAX6675
2022-04-21 03:17:40 -04:00
Max6675 is an Arduino library for MAX6675 chip with a K type thermocouple.
2022-01-12 08:49:49 -05:00
The library is based upon (stripped and adapted version of) the https://github.com/RobTillaart/MAX31855_RT library.
2022-04-21 03:17:40 -04:00
Currently the library is experimental, so use with care.
2022-11-16 07:14:42 -05:00
Hardware has finally arrived (April 2022) and I had time to do my first round of tests with an UNO @ 16 MHz.
The library works and it reads temperatures well, both with HW SPI and SW SPI.
2022-04-21 03:17:40 -04:00
2022-01-12 08:49:49 -05:00
## Description
2022-04-21 03:17:40 -04:00
The MAX6675 is a chip to convert the reading of a K-type thermocouple to a temperature.
The MAX6675 only supports positive degrees Celsius.
The values are read with an precision of **0.25°C.**
Typical noise seen during usage are **± 0.5°C**, so using a low pass filter on the temperature might be a good idea.
2022-01-12 08:49:49 -05:00
The working of thermocouples (TC) is based upon Seebeck effect.
2022-04-21 03:17:40 -04:00
Different TC's have a different Seebeck Coefficient (SC) expressed in µV/°C.
2022-01-12 08:49:49 -05:00
See http://www.analog.com/library/analogDialogue/archives/44-10/thermocouple.html
2023-11-12 04:18:34 -05:00
#### Breakout
2022-04-21 03:17:40 -04:00
The library is tested with a breakout board with following pins:
2022-01-12 08:49:49 -05:00
2022-04-21 03:17:40 -04:00
```
+---------------------+
| signal out | --> MISO
| - chip select | <-- SELECT
TC here | clock | <-- CLOCK processor side
| + VCC | --- VCC
| GND | --- GND
+---------------------+
2022-01-12 08:49:49 -05:00
```
2023-11-12 04:18:34 -05:00
#### Related
- https://github.com/RobTillaart/MAX6675
- https://github.com/RobTillaart/MAX31850
- https://github.com/RobTillaart/MAX31855_RT
2022-01-12 08:49:49 -05:00
## Hardware SPI vs software SPI
2022-04-21 03:17:40 -04:00
2023-11-12 04:18:34 -05:00
#### Pins
2022-04-21 03:17:40 -04:00
2022-01-12 08:49:49 -05:00
Default pin connections. ESP32 can overrule with **setGPIOpins()**.
| HW SPI | UNO | ESP32 VSPI | ESP32 HSPI | Notes
|:---------|:-----:|:-----------:|:-----------:|:----------|
2022-04-21 03:17:40 -04:00
| CLOCK | 13 | 18 | 14 |
| MISO | 12 | 19 | 12 |
| MOSI | 11 | 23 | 13 | *not used...*
2022-01-12 08:49:49 -05:00
| SELECT | eg. 4 | 5 | 15 | *can be others too.*
2023-11-12 04:18:34 -05:00
#### Performance
2022-04-21 03:17:40 -04:00
Performance read() function, timing in us.
- UNO @ 16 MHz
- TODO ESP32 @ 240 MHz
2022-01-12 08:49:49 -05:00
2022-04-21 03:17:40 -04:00
| mode | clock | timing UNO | timing ESP32 | Notes
2022-01-12 08:49:49 -05:00
|:-------|---------:|-----------:|-------------:|:----------|
2022-04-21 03:17:40 -04:00
| HW SPI | 4000000 | 36 | | highest supported.
| HW SPI | 3500000 | 40 | |
| HW SPI | 3000000 | 40 | |
| HW SPI | 2500000 | 40 | |
| HW SPI | 2000000 | 40-44 | |
| HW SPI | 1500000 | 48 | |
| HW SPI | 1000000 | 48-52 | |
| HW SPI | 500000 | 64-68 | |
| SW SPI | bit bang | 276 | |
2022-01-12 08:49:49 -05:00
2022-04-21 03:17:40 -04:00
Note the UNO micros() has a 4 us precision, but it is clear that
4 Mb is not even twice the speed of 0.5 Mb.
Tested with **MAX6675_test_HWSPI.ino**
2022-01-12 08:49:49 -05:00
## Interface
2023-11-12 04:18:34 -05:00
```cpp
#include "MAX6675.h"
```
2022-01-12 08:49:49 -05:00
2023-11-12 04:18:34 -05:00
#### Constructor
2022-01-12 08:49:49 -05:00
- **MAX6675()** create object.
- **void begin(const uint8_t select)** set select pin => hardware SPI
2022-04-21 03:17:40 -04:00
- **void begin(const uint8_t sclk, const uint8_t select, const uint8_t miso)**
set CLOCK, SELECT and MISO pin => software SPI
2022-01-12 08:49:49 -05:00
2023-11-12 04:18:34 -05:00
#### Hardware SPI
2022-01-12 08:49:49 -05:00
To be used only if one needs a specific speed.
- **void setSPIspeed(uint32_t speed)** set SPI transfer rate.
- **uint32_t getSPIspeed()** returns SPI transfer rate.
2022-04-21 03:17:40 -04:00
- **void setSWSPIdelay(uint16_t del = 0)** for tuning SW SPI signal quality.
Del is the time in micros added per bit. Even numbers keep the duty cycle of the clock around 50%.
2022-01-12 08:49:49 -05:00
- **uint16_t getSWSPIdelay()** get set value in micros.
2023-11-12 04:18:34 -05:00
#### ESP32 specific
2022-01-12 08:49:49 -05:00
- **void selectHSPI()** must be called before **begin()**
- **void selectVSPI()** must be called before **begin()**
- **bool usesHSPI()**
- **bool usesVSPI()**
- **void setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select)** to overrule ESP32 default hardware pins.
2023-11-12 04:18:34 -05:00
#### Reading
2022-01-12 08:49:49 -05:00
To make a temperature reading call **read()**.
It returns the status of the read which is a value between 0..7
The function **getStatus()** returns the same status value.
Table: values returned from **uint8_t read()** and **uint8_t getStatus()**
2022-04-21 03:17:40 -04:00
Note: this list is a subset of MAX31855 errors.
2022-01-12 08:49:49 -05:00
| value | Description | Action |
|:-----:|:--------------------------|:-------------|
| 0 | OK | |
| 4 | Thermocouple short to VCC | check wiring |
| 128 | No read done yet | check wiring |
| 129 | No communication | check wiring |
2022-04-21 03:17:40 -04:00
After a **uint8_t read()** you can get the temperature with **float getTemperature()**.
2022-01-12 08:49:49 -05:00
Repeated calls to **getTemperature()** will give the same value until a new **read()**.
The latter fetches a new value from the sensor. Note that if the **read()** fails
the value of **getTemperature()** can become incorrect. So it is important to check
the return value of **read()**.
2023-11-12 04:18:34 -05:00
#### Offset
2022-01-12 08:49:49 -05:00
The library supports a fixed offset to calibrate the thermocouple.
For this the functions **float getOffset()** and **void setOffset(float offset)** are available.
This offset is "added" in the **getTemperature()** function.
2022-04-21 03:17:40 -04:00
Notes
- the offset used is a float, so decimals can be used.
A typical usage is to call **setOffset(273.15)** to get ° Kelvin.
- the offset can cause negative temperatures.
2022-01-12 08:49:49 -05:00
2023-11-12 04:18:34 -05:00
#### Delta analysis
2022-01-12 08:49:49 -05:00
As the **tc** object holds its last known temperature it is easy to determine the delta
with the last known temperature, e.g. for trend analysis.
```cpp
float last = tc.getTemperature();
int state = tc.read();
if (state == STATUS_OK)
{
float new = tc.getTemperature();
float delta = new - last;
// process data
}
```
2023-11-12 04:18:34 -05:00
#### Last time read
2022-01-12 08:49:49 -05:00
The **tc** object keeps track of the last time **read()** is called in the function **uint32_t lastRead()**.
The time is tracked in **millis()**. This makes it easy to read the sensor at certain intervals.
```cpp
if (millis() - tc.lastRead() >= interval)
{
int state = tc.read();
if (state == STATUS_OK)
{
float new = tc.getTemperature();
// process read value.
}
else
{
// handle error
}
}
```
2023-11-12 04:18:34 -05:00
#### GetRawData
2022-01-12 08:49:49 -05:00
The function **uint32_t getRawData()** allows you to get all the 32 bits raw data from the board,
after the standard **uint8_t tc.read()** call.
Example code can be found in the examples folder.
```cpp
int state = thermocouple.read();
uint32_t value = thermocouple.getRawData(); // Read the raw Data value from the module
```
This allows one to compact the measurement e.g. for storage or sending over a network.
## Pull Up Resistor
To have proper working of the MAX6675 board, you need to add a pull-up resistor
(e.g. 4K7 - 1K depending on wire length) between the MISO pin (from constructor call) and the
2022-04-21 03:17:40 -04:00
VCC (5 Volt). This improves the signal quality and will allow you to detect if there is
2022-01-12 08:49:49 -05:00
proper communication with the board. Without pull-up one might get random noise that could
look like real data.
**Note:** the MISO pin can be different from each board, please refer to your board datasheet.
If the MAX6675 board is not connected **tc.read()** will return **STATUS_NO_COMMUNICATION**.
You can verify this by **tc.getRawData()** which will give 16 HIGH bits or 0xFFFF).
You can use a simple code to detect connection error board:
```cpp
uint8_t status = thermocouple.read();
if (status == STATUS_NO_COMMUNICATION)
{
Serial.println("NO COMMUNICATION");
}
```
or
```cpp
uint8_t status = thermocouple.read();
if (thermocouple.getRawData() == 0xFFFF)
{
Serial.println("NO COMMUNICATION");
}
```
## Operation
See examples
## Future
2023-11-12 04:18:34 -05:00
#### Must
#### Should
2022-01-12 08:49:49 -05:00
- update and verify documentation (as it is copied from MAX31855 lib)
- keep interface in sync with MAX31855 if possible.
2023-11-12 04:18:34 -05:00
#### Could
- create example to distinguish between MAX6675 and MAX31855
- https://github.com/RobTillaart/MAX6675/issues/5
#### Wont
## Support
If you appreciate my libraries, you can support the development and maintenance.
Improve the quality of the libraries by providing issues and Pull Requests, or
donate through PayPal or GitHub sponsors.
Thank you,
2022-01-12 08:49:49 -05:00