AskSin++
Max6675.h
1 //- -----------------------------------------------------------------------------------------------------------------------
2 // AskSin++
3 // 2020-01-09 jp112sdl Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
4 //- -----------------------------------------------------------------------------------------------------------------------
5 
6 #ifndef MAX6675_H_
7 #define MAX6675_H_
8 
9 #include <Sensors.h>
10 
11 namespace as {
12 
13 template <uint8_t SCK, uint8_t CS, uint8_t SO>
14 class MAX6675 : public Temperature {
15  private:
16  uint8_t spiread() {
17  uint8_t d = 0;
18  for (uint8_t i = 0x80; i != 0; i >>= 1) {
19  digitalWrite(SCK, LOW);
20  _delay_ms(1);
21  if (digitalRead(SO)) {
22  d |= i;
23  }
24  digitalWrite(SCK, HIGH);
25  _delay_ms(1);
26  }
27  return d;
28  }
29 
30  uint16_t readCelsius() {
31  uint16_t v;
32 
33  digitalWrite(CS, HIGH);
34  _delay_ms(750);
35  digitalWrite(CS, LOW);
36  _delay_ms(1);
37 
38  v = spiread();
39  v <<= 8;
40  v |= spiread();
41 
42  if (v & 0x4) {
43  DPRINTLN(F("thermocouple is unconnected"));
44  return 0xFFFF;
45  }
46 
47  v >>= 3;
48  //DPRINT("C ");DDECLN(v*0.25);
49 
50  return v * 0.25;
51  }
52 
53  public:
54  MAX6675 () {}
55 
56  bool init () {
57  pinMode(SO, INPUT);
58  pinMode(CS, OUTPUT);
59  pinMode(SCK, OUTPUT);
60 
61  _present = (readCelsius() != 0xFFFF);
62  return _present;
63  }
64 
65  bool measure (__attribute__((unused)) bool async = false) {
66  if ( present() == true ) {
67  uint16_t t = readCelsius();
68  if (t != 0xFFFF) {
69  _temperature = t * 10;
70  return true;
71  } else {
72  return false;
73  }
74  }
75  return false;
76  }
77 
78  int16_t temperature() {
79  return _temperature;
80  }
81 };
82 
83 }
84 
85 #endif /* MAX6675_H_ */
as::MAX6675
Definition: Max6675.h:14
as::Temperature
Definition: Sensors.h:30