STM32 + MAX6675 — терморегулятор (Arduino)

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

Добавить комментарий

Войти с помощью: