尝试将Oled显示器与MLX90614红外传感器连接

时间:2018-11-12 12:02:50

标签: c

嗨,我正在做一个学校项目,应该在Oled显示器上输出温度值。

我已经设法使用Arduino Code做到了这一点,所以我知道传感器和显示器都可以工作,但是该代码必须在该项目的纯嵌入式C语言的Atmel Studio中编写。

我不确定我在做什么错,我在做什么正确。 我正在努力使用C代码和I2C协议。

我已经对该主题进行了大量研究,但是每次我似乎都只能找到arduino教程或与理论相关的帖子。

我是编程新手。

无论如何,这是我到目前为止提出的代码。

显示我为显示器编写的txt。除温度值外,一切都应正常工作:

#define F_CPU 16000000UL

#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "OLED.h"
#include "ATmega_Init.h"
#include "i2c_master.h"

//From Arduino Adafruit_MLX90614 lib
// RAM
#define MLX90614_RAWIR1 0x04
#define MLX90614_RAWIR2 0x05        //Important for reading out
#define MLX90614_TA 0x06
#define MLX90614_TOBJ1 0x07
#define MLX90614_TOBJ2 0x08

// EEPROM
#define MLX90614_TOMAX 0x20
#define MLX90614_TOMIN 0x21
#define MLX90614_PWMCTRL 0x22
#define MLX90614_TARANGE 0x23
#define MLX90614_EMISS 0x24
#define MLX90614_CONFIG 0x25
#define MLX90614_ADDR 0x0E
#define MLX90614_ID1 0x3C
#define MLX90614_ID2 0x3D
#define MLX90614_ID3 0x3E
#define MLX90614_ID4 0x3F

#define SLAVE_ADDRESS 0x5A



int main(void)
{

    //uint8_t test_recieve[2];

    uint16_t test_recieve_high;     //To receive the high byte

    uint16_t test_recieve_low;      //To receive the low byte


    init_atmega_setup();

    initDisplay();

    i2c_init();

    clsDisplay();

    strFont5XY("Floor Unit",25,3);

    _delay_ms(2000);

    clsDisplay();

    //uint8_t receive_command = 0x00;   //Needs the receive command, 
    definitely not just 0x00

        while(1){

            i2c_start(SLAVE_ADDRESS);

            i2c_write(MLX90614_TOBJ1);

            i2c_start(SLAVE_ADDRESS);

            test_recieve_high = i2c_read_ack();

            i2c_start(MLX90614_TOBJ1);

            test_recieve_high = ((uint8_t)i2c_read_ack())<<8;

            test_recieve_high |= i2c_read_ack();

            i2c_stop();


            i2c_start(SLAVE_ADDRESS);

            i2c_write(MLX90614_TOBJ1);*/

            i2c_start(MLX90614_TOBJ1);

            test_recieve_low = ((uint8_t)i2c_read_ack())<<8;

            test_recieve_low |= i2c_read_ack();

            i2c_stop();

            intFont5XY(test_recieve_low,1,0);

            intFont5XY(test_recieve_high,1,1);

            _delay_ms(1000);
        };
    };

0 个答案:

没有答案