• Source
    1. // this library is public domain. enjoy!
    2. // www.ladyada.net/learn/sensors/thermocouple
    3.  
    4. #ifdef __AVR
    5. #include <avr/pgmspace.h>
    6. #elif defined(ESP8266)
    7. #include <pgmspace.h>
    8. #endif
    9. #include <util/delay.h>
    10. #include <stdlib.h>
    11. #include "max6675.h"
    12.  
    13. MAX6675::MAX6675(int8_t SCLK, int8_t CS, int8_t MISO) {
    14. sclk = SCLK;
    15. cs = CS;
    16. miso = MISO;
    17.  
    18. //define pin modes
    19. pinMode(cs, OUTPUT);
    20. pinMode(sclk, OUTPUT);
    21. pinMode(miso, INPUT);
    22.  
    23. digitalWrite(cs, HIGH);
    24. }
    25. double MAX6675::readCelsius(void) {
    26.  
    27. uint16_t v;
    28.  
    29. digitalWrite(cs, LOW);
    30. _delay_ms(1);
    31.  
    32. v = spiread();
    33. v <<= 8;
    34. v |= spiread();
    35.  
    36. digitalWrite(cs, HIGH);
    37.  
    38. if (v & 0x4) {
    39. // uh oh, no thermocouple attached!
    40. return NAN;
    41. //return -100;
    42. }
    43.  
    44. v >>= 3;
    45.  
    46. return v*0.25;
    47. }
    48.  
    49. double MAX6675::readFahrenheit(void) {
    50. return readCelsius() * 9.0/5.0 + 32;
    51. }
    52.  
    53. byte MAX6675::spiread(void) {
    54. int i;
    55. byte d = 0;
    56.  
    57. for (i=7; i>=0; i--)
    58. {
    59. digitalWrite(sclk, LOW);
    60. _delay_ms(1);
    61. if (digitalRead(miso)) {
    62. //set the bit to 0 no matter what
    63. d |= (1 << i);
    64. }
    65.  
    66. digitalWrite(sclk, HIGH);
    67. _delay_ms(1);
    68. }
    69.  
    70. return d;
    71. }
    72.