|
|
- // -----------------------------------------------------------------------------
- // MAX6675 Sensor
- // Uses MAX6675_Thermocouple library
- // Copyright (C) 2017-2019 by Xose Pérez <andrade dot luciano at gmail dot com>
- // -----------------------------------------------------------------------------
-
- #if SENSOR_SUPPORT && MAX6675_SUPPORT
-
- #pragma once
-
- #include <Arduino.h>
- #include <MAX6675.h>
-
- #include <vector>
-
- #include "BaseSensor.h"
-
- #define MAX6675_READ_INTERVAL 3000
-
- class MAX6675Sensor : public BaseSensor {
-
- public:
-
- // ---------------------------------------------------------------------
- // Public
- // ---------------------------------------------------------------------
-
- MAX6675Sensor() {
- _sensor_id = SENSOR_MAX6675_ID;
- _count = 1;
- }
-
- ~MAX6675Sensor() {
- }
-
- // ---------------------------------------------------------------------
- // ---------------------------------------------------------------------
-
- void setCS(unsigned char pin_cs) {
- if (_pin_cs == pin_cs) return;
- _pin_cs = pin_cs;
- _dirty = true;
- }
-
- void setSO(unsigned char pin_so) {
- if (_pin_so == pin_so) return;
- _pin_so = pin_so;
- _dirty = true;
- }
-
- void setSCK(unsigned char pin_sck) {
- if (_pin_sck == pin_sck) return;
- _pin_sck = pin_sck;
- _dirty = true;
- }
-
- // ---------------------------------------------------------------------
- // Sensor API
- // ---------------------------------------------------------------------
-
- // Initialization method, must be idempotent
- void begin() {
-
- if (!_dirty) return;
-
- //// MAX6675
- int units = 1; // Units to readout temp (0 = raw, 1 = ˚C, 2 = ˚F)
- if (_max) delete _max;
- _max = new MAX6675(_pin_cs, _pin_so, _pin_sck, units);
-
- _ready = true;
- _dirty = false;
-
- }
-
- // Loop-like method, call it in your main loop
- void tick() {
- static unsigned long last = 0;
- if (millis() - last < MAX6675_READ_INTERVAL) return;
- last = millis();
- last_read = _max->read_temp();
- }
-
- // Descriptive name of the sensor
- String description() {
- char buffer[20];
- //snprintf(buffer, sizeof(buffer), "MAX6675 @ CS %d", _gpio);
- snprintf(buffer, sizeof(buffer), "MAX6675");
- return String(buffer);
- }
-
- String address(unsigned char index) {
- return String("@ address");
- }
-
- // Address of the device
- // Descriptive name of the slot # index
- String slot(unsigned char index) {
- if (index < _count) {
- // char buffer[40];
- // uint8_t * address = _devices[index].address;
- // snprintf(buffer, sizeof(buffer), "%s (%02X%02X%02X%02X%02X%02X%02X%02X) @ GPIO%d",
- // chipAsString(index).c_str(),
- // address[0], address[1], address[2], address[3],
- // address[4], address[5], address[6], address[7],
- // _gpio
- // );
- return description();
- }
- return String();
- }
-
- // Type for slot # index
- unsigned char type(unsigned char index) {
- if (index < _count) return MAGNITUDE_TEMPERATURE;
- return MAGNITUDE_NONE;
- }
-
- // Pre-read hook (usually to populate registers with up-to-date data)
- void pre() {
- _error = SENSOR_ERROR_OK;
- }
-
- // Current value for slot # index
- double value(unsigned char index) {
- return last_read;
- }
-
- protected:
-
- // ---------------------------------------------------------------------
- // Protected
- // ---------------------------------------------------------------------
-
- unsigned int _pin_cs = MAX6675_CS_PIN;
- unsigned int _pin_so = MAX6675_SO_PIN;
- unsigned int _pin_sck = MAX6675_SCK_PIN;
- bool _busy = false;
- double last_read = 0;
- MAX6675 * _max = NULL;
-
-
- };
-
- #endif // SENSOR_SUPPORT && MAX6675_SUPPORT
|