MAX6675 в комплекте с термопарой типа К рассчитан на измерение температуры в диапазоне от 0 до 1024 ºС, с разрешением 0.25 ºС. Для передачи данных используется SPI интерфейс.
При совместном использовании MAX6675 и отладочной платы STM32 (базе микроконтроллера STM32F103C8T6) можно сделать простой терморегулятор (0…999.0 °С). Управление температурой регулирования осуществляется при помощи энкодера ky-040. Температура регулирования сохраняется в энергонезависимой памяти.
#define pinA PB6 #define pinB PB5 #define SO PB7 #define CS PB9 #define CLK PB8 #include <STM32_MAX6675.h> //http://forum.rcl-radio.ru/misc.php?action=pan_download&item=410&download=1 #include <STM32_TM1637.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=403&download=1 #include <EEPROM.h> // Библиотека Arduino_STM32-master.zip #include <STM32_Encoder.h> // http://rcl-radio.ru/wp-content/uploads/2020/01/STM32_Encoder.zip STM32_Encoder encoder(pinA, pinB); STM32_TM1637 tm(PB0,PB1);// CLK, DIO STM32_MAX6675 max6675(CLK, CS, SO); int position = -999; byte w,i; int reg; const float gis = 1.0;// гистерезис unsigned long times; float celsius,sum; void setup() { Serial.begin(9600); tm.brig(7); // ЯРКОСТЬ 0...7 EEPROM.init(0x801F000,0x801F800,0x400);// 1024 byte encoder.begin(); attachInterrupt(digitalPinToInterrupt(pinA),Read,CHANGE); attachInterrupt(digitalPinToInterrupt(pinB),Read,CHANGE); pinMode(PB7,OUTPUT);// выход управления реле reg = EEPROM.read(10); delay(500); } void loop() { if(millis()-times>3000){ for(i=0;i<3;i++){ celsius = max6675.readCelsius(); sum = sum + celsius; delay(500);}celsius = sum/3;sum=0;} if(position != encoder.getPosition()){position = encoder.getPosition(); reg = reg + encoder.getPosition();encoder.setPosition(0);position = 0; w=1;times = millis();if(reg>999){reg=999;}if(reg<0){reg=0;}} if(millis()-times<3000){tm.print_float(reg,0, 0b01010000,0,0,0);} else{tm.print_float(celsius,1, 0,0,0,0);} if(celsius>999||celsius<0){tm.print_float(celsius,0, 0b01000000,0b01000000,0b01000000,0b01000000);} if(reg >= celsius + gis){digitalWrite(PB7,HIGH);} if(reg <= celsius - gis){digitalWrite(PB7,LOW);} if(millis()-times>1000&&w==1){w=0;EEPROM.update(10, reg);} } void Read(){encoder.readAB();}
В скетче указан гистерезис значение которого Вы можете изменить:
const float gis = 1.0;// гистерезис
Погрешность измерений по результатам тестирования не превышает 1 %
Результаты измерений:
Показания прибора, °С | Полученное значение, °С |
100 | 100.3 |
200 | 201.5 |
300 | 302.5 |
400 | 400.3 |
500 | 497.8 |
600 | 595.2 |
700 | 690.5 |
800 | 790.3 |
900 | 892.8 |
990 | 985.0 |
Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=1031#p1031