MCP9600:热电偶读数()在很长一段时间内给出相同的值

Posted

技术标签:

【中文标题】MCP9600:热电偶读数()在很长一段时间内给出相同的值【英文标题】:MCP9600 : the thermocouplereading() give the same value during a long time 【发布时间】:2021-09-11 09:55:16 【问题描述】:

我使用 MCP9600 传感器来了解温度。我使用的是 ATmega 2560,并通过我的笔记本电脑与 python 与库序列进行通信。

这是我的arduino

#include <Wire.h>
#include <Adafruit_I2CDevice.h>
#include <Adafruit_I2CRegister.h>
#include "Adafruit_MCP9600.h"
#include <SimpleCLI.h>

#define I2C_ADDRESS (0x67)

Adafruit_MCP9600 mcp;

uint8_t filtcoeff;

// Create CLI Object
SimpleCLI cli;

// Commands
Command type;
Command filter;
Command temp;
Command fanspeed;
Command Tmax;
Command tolerance;


//Call function
void overheat();
void deltatemp();

// Callback function 
void typeCallback();
void filterCallback();
void temperatureCallback();
void FanCallback();
void overheatCallback();
void toleranceCallback();

int broche_PWM = 2; // Déclaration de la Pin 10 Arduino

int Valeur_PWM = 128; // Variable 

int timedelay = 300;

int tempTolerance = 10;

int tempmax = 50;


void setup() 
  // put your setup code here, to run once:

  pinMode(broche_PWM, OUTPUT); // Pin 2 Arduino en sortie PWM

  Serial.begin(115200);
    while (!Serial) 
      delay(10);
    

    cli.setOnError(errorCallback); // Set error Callback

    /* Initialise the driver with I2C_ADDRESS and the default I2C bus. */
    if (! mcp.begin(I2C_ADDRESS)) 
        Serial.println("Sensor not found. Check wiring!");
        while (1);
    

  mcp.setADCresolution(MCP9600_ADCRESOLUTION_12);
  switch (mcp.getADCresolution()) 
    case MCP9600_ADCRESOLUTION_18:   ; break;
    case MCP9600_ADCRESOLUTION_16:   ; break;
    case MCP9600_ADCRESOLUTION_14:   ; break;
    case MCP9600_ADCRESOLUTION_12:   ; break;
  

  mcp.setThermocoupleType(MCP9600_TYPE_K);
  switch (mcp.getThermocoupleType()) 
    case MCP9600_TYPE_K:  ; break;
    case MCP9600_TYPE_J:  ; break;
    case MCP9600_TYPE_T:  ; break;
    case MCP9600_TYPE_N:  ; break;
    case MCP9600_TYPE_S:  ; break;
    case MCP9600_TYPE_E:  ; break;
    case MCP9600_TYPE_B:  ; break;
    case MCP9600_TYPE_R:  ; break;
  

  mcp.setFilterCoefficient(3);

  mcp.setAlertTemperature(1, 30);
  mcp.configureAlert(1, true, true);  // alert 1 enabled, rising temp

  mcp.enable(true);

  type = cli.addBoundlessCommand("type", typeCallback);
  filter = cli.addBoundlessCommand("filter", filterCallback);
  temp = cli.addBoundlessCommand("temp", temperatureCallback);
  fanspeed = cli.addBoundlessCommand("fanspeed", FanCallback);
  Tmax = cli.addBoundlessCommand("Tmax", overheatCallback);
  tolerance = cli.addBoundlessCommand("Tolerance", toleranceCallback);

  Serial.println("I am ready"); // avoid to have a void monitor (avoiding blocking in python code) 


void loop() 
  // put your main code here, to run repeatedly:

  // Check if user typed something into the serial monitor
    if (Serial.available()) 
        // Read out string from the serial monitor
        String input = Serial.readStringUntil('\n');

        // Parse the user input into the CLI
        cli.parse(input);
    

  if (cli.errored()) 
        CommandError cmdError = cli.getError();

        Serial.print("ERROR: ");
        Serial.println(cmdError.toString());

        if (cmdError.hasCommand()) 
            Serial.print("Did you mean \"");
            Serial.print(cmdError.getCommand().toString());
            Serial.println("\"?");
        
    

    if (mcp.readThermocouple() > tempmax)
      overheat();
    

    if (abs(mcp.readThermocouple()-mcp.readAmbient())> tempTolerance)
      //deltatemp();
    
    
    analogWrite(broche_PWM,Valeur_PWM); // Envoi du signal PWM sur la sortie numérique 10

    delay(timedelay);



void temperatureCallback(cmd* c)
    Command cmd(c);               // Create wrapper object
    
    Serial.print("Hot Junction: ");
    Serial.print("x");
    Serial.print(mcp.readThermocouple());
    Serial.print("x");
    Serial.print("Cold Junction: ");
    Serial.print("x");
    Serial.print(mcp.readAmbient());
    Serial.print("x");
    Serial.print("ADC (uV): ");
    Serial.print("x");
    Serial.println(mcp.readADC() * 2);


    


void filterCallback(cmd* c)
    Command cmd(c);               // Create wrapper object
    Argument arg;

    String argValue = "";
    int i=0;
    int IntValue;

    arg = cmd.getArg(i);
    argValue = arg.getValue();
    IntValue   = argValue.toInt();
    mcp.setFilterCoefficient(IntValue);
    Serial.print("Filter coefficient value set to: ");
    Serial.println(mcp.getFilterCoefficient());
    

还有python代码,我用来从ATmega中提取数据

import numpy as np
import serial
import time

    def get_temperature(serial_port):
    phrase = b'temp'
    # print("str.encode(phrase)",str.encode(phrase))
    serial_port.write(phrase)
    exitloop = 0
    while exitloop == 0:
        if serial_port.inWaiting() > 0:
            arduino_data = serial_port.readline()
            print(arduino_data)
            serial_port.flushOutput()
            exitloop = 1
    serial_port.flushOutput()
    serial_port.flushInput()

    return arduino_data

热电偶为 K 型。问题是当我从 arduino 串行监视器和我的 python 代码中看到时,来自传感器的值在很长一段时间内都是恒定的。通常,当我与另一台设备比较时,该值必须不断变化,但长时间给出相同的值,例如 5 分钟。

有人可以给出解决方案吗?

【问题讨论】:

【参考方案1】:

我发现了问题。它来自 ADC_resolution,我在 18 岁时返回。

谢谢

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于MCP9600:热电偶读数()在很长一段时间内给出相同的值的主要内容,如果未能解决你的问题,请参考以下文章

MCP9600 不更改热电偶类型设置

如何在很长一段时间内逐步向浏览器显示 HTML?

Android - 如何记录加速度计在很长一段时间内超过+低于阈值的时间量

用PHP去实现数据库查询结果缓存

前端用iframe要等待很长一段时间有啥解决方案吗?

程序猿的产品思考:2C与2B产品思维的区别