简体   繁体   中英

Multiple MLX90614 (temperature sensor) on Arduino Uno code

I have been assigned with a task to create a temperature based fan controlling over the PWM output. I am using Arduino Uno with AVRISPmkII programmer and ATmega328 controller. Now the task is to connect 4 MLX90614 sensors on a I²C wire (I have assigned the different slave addresses to each sensor as I cannot connect them on I²C, each having the same address).

I am able to read the temperature of each sensor and get the maximum temperature as well. But the problem comes when controlling the four fans over PWM. I have to get the temperature reading from each sensor, get the maximum temperature, and then control the fans' speed according to the set temperature range over PWM output. What is the matter with the code?

#include <i2cmaster.h>

int PWMoutput=0;
int Temp[4];
int sensor[4]={0xAC<<1, 0xCC<<1, 0xC0<<1, 0xB0<<1};  // Array with address of four mlx90614 sensors
int Maxtemp;

int fan = 9;      // FAN connected to digital pin 9

//------------------------------------------------//
//------------------SETUP-------------------------//
//------------------------------------------------//

void setup()
{
    Serial.begin(9600);                       // Start serial communication at 9600 bit/s.
    i2c_init();                               // Initialise the I²C bus.
    PORTC = (1 << PORTC4) | (1 << PORTC5);    // Enable pullups.

    // Initialize the digital pin as an output.
    pinMode(fan, OUTPUT);
}

//------------------------------------------------//
//-------------------MAIN-------------------------//
//------------------------------------------------//

void loop()
{
    Maxtemp=readtemp(0);
    setfanmode(Maxtemp);
                      // Prints all readings in the serial port
    i=0;

    /*while(i<1)
    {
        Serial.print("Sensor");
        Serial.println(i,DEC);
        Serial.print("Celcius: ");
        Serial.println(Temp[i],DEC);
        i++;

    }*/

    Serial.print("Maximum: Celcius: ");
    Serial.println(Maxtemp);
}

void setfanmode(int degree)  // Setting the fan speed modes according to
                             // the temperature in Celcius
                             // with PWM Duty cycle to 0%, 50% and 100%.
{
    if (degree<=30)
        PWMoutput=0;
    else if(degree<=60)
        PWMoutput=127;
    else if(degree<=80)
        PWMoutput=255;
}

int maxtemp()             // Reading max temperature
{
    int i=1;
    int temperature;
    while (i<4)
    {
        if (Temp[i-1]<Temp[i])
            temperature=Temp[i];
        i++;
    }
    return(temperature);
}

float readtemp(int sensornumb)
{
    int data_low = 0;
    int data_high = 0;
    int pec = 0;

    // Write
    i2c_start_wait(sensor[sensornumb]+I2C_WRITE);
    i2c_write(0x07);

    // Read
    i2c_rep_start(sensor[sensornumb]+I2C_READ);
    data_low = i2c_readAck();       // Read 1 byte and then send ack.
    data_high = i2c_readAck();      // Read 1 byte and then send ack.
    pec = i2c_readNak();
    i2c_stop();

    // This converts high and low bytes together and processes temperature,
    // MSB is a error bit and is ignored for temperatures.
    double tempFactor = 0.02;       // 0.02 degrees per LSB (measurement
                                    // resolution of the MLX90614).
    double tempData = 0x0000;       // Zero out the data.
    int frac;                       // Data past the decimal point.

    // This masks off the error bit of the high byte, then moves it left
    // 8 bits and adds the low byte.
    tempData = (double)(((data_high & 0x007F) << 8) + data_low);
    tempData = (tempData * tempFactor)-0.01;
    float celcius = tempData - 273.15;

    // Returns temperature in Celcius.
    return celcius;
}

I did not read all your code, but it looks like you're not commanding your fans at all.

/* setting the fan speed modes according to
 * the temperature in celcius
 * with PWM Duty cycle to 0%, 50% & 100%
 */
void setfanmode(int degree)   
{
  int PWMoutput;

  if (degree<=30)
    PWMoutput=0;
  else if(degree<=60)
    PWMoutput=127;    
  else if(degree<=80)
    PWMoutput=255;
  analogWrite(fan, PWMoutput);
}

Will make your 'setfanmode' function do something. I did not check for errors in the rest of your code, though. If you have got several fan to control, you may want to change your function to the following:

void setfanmode(int degree, int fanpin)
{
  int PWMoutput;

  if (degree<=30)
    PWMoutput=0;
  else if(degree<=60)
    PWMoutput=127;    
  else if(degree<=80)
    PWMoutput=255;
  analogWrite(fanpin, PWMoutput);
}

and I'm letting you imagine how you can transform your code for controlling several fans.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM