MAX6675 Module + K Type Thermocouple Sensor - не правильная температура
- Войдите на сайт для отправки комментариев
Ср, 09/03/2016 - 20:58
купил "MAX6675 Module + K Type Thermocouple Sensor" все вроде работает, знаю, что на низких температурах (менее +400с) эта термопара показывает не точно, по этому при тестировании на комнотной температуре она показывала от 20 до 30 грдусов, что вполне обьяснимо...
но вот на высоких температурах она показывает фигню... показываеть 1000с хотя реально где то от 500 до 700 (в муфеле нет свечения)...
может дело в том, что я обрезал (укоротил) термопару? если да - то как калибровать?
скетч использую такой (скомуниздил из библиотеки), может кто пользует проверит???
//*************************************************************************************************
// две процедуры, для получения данных с термопары
//*************************************************************************************************
double readCelsius() {
uint16_t v;
digitalWrite(thermoCS, LOW);
_delay_ms(1);
v = spiread();
v <<= 8;
v |= spiread();
digitalWrite(thermoCS, HIGH);
if (v & 0x4) {
// uh oh, no thermocouple attached!
//return NAN;
return -101;
}
v >>= 3;
return v*0.25;
}
byte spiread() {
int i;
byte d = 0;
for (i=7; i>=0; i--)
{
digitalWrite(thermoCLK, LOW);
_delay_ms(1);
if (digitalRead(thermoDO)) {
//set the bit to 0 no matter what
d |= (1 << i);
}
digitalWrite(thermoCLK, HIGH);
_delay_ms(1);
}
return d;
}
Я читал такой прогой. С усреднением значений. И на низких показывает точно
#include "max6675.h" int thermoDO = 2; //он же SO int thermoCS = 3;//он же SCK int thermoCLK = 4; // MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO); int vccPin = 5; //пин для питания int gndPin = 6; //пин для земли const byte averageFactor = 5; // коэффициент сглаживания показаний (0 = не сглаживать) // чем выше, тем больше "инерционность" int sensorValue = 0; // считанное значение #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // установка LCD address to 0x27 for a 16 chars and 2 line display void setup() { // Serial.begin(9600); //активируем питание и землю pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH); pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW); //Serial.println("MAX6675 test"); //ждем стабилизации чипа MAX delay(500); lcd.init(); // Инициализируем lcd //lcd.begin(); // Печать приветствия на LCD. lcd.backlight(); lcd.setCursor(1, 0); lcd.print("MAX6675 test"); lcd.setCursor(4, 1); lcd.print("NOVO.SU"); delay(5000); lcd.clear(); } void loop() { int newSensorValue = thermocouple.readCelsius(); if (averageFactor > 0) // усреднение показаний для устранения "скачков" { sensorValue = (sensorValue * (averageFactor - 1) + newSensorValue) / averageFactor; // <новое среднее> = (<старое среднее>*4 + <текущее значение>) / 5 я тут немного поправил } else { sensorValue=newSensorValue; // не делаем усреднений, что прочитали то и считаем выводом } //Serial.print("sensor = " ); //Serial.println(sensorValue); lcd.setCursor(0, 0); lcd.print("Temperat: "); lcd.print(sensorValue); //Коррекция температуры на 3 градуса lcd.print("C "); delay(2000); }У меня без всяких усреднений железно, иногда десятые доли изменяются, Недалеко датчик LM75, отличия в десятых долях. Опрос раз в несколько секунд.
может я чего сделал не так когда обрезал термопару?
делал так
1. клемники (похоже из алюминия) разогнул
2. термопару обрезал и зачистил от стекловолокна на 5мм
3. вставил в клемники буквой П и зажал
может я клемники перепутал или в бубен не постучал?