『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 8636|回复: 8

ESP8266输入ESPHOME,怎么添加自定义I2C设备

[复制链接]

4

主题

58

帖子

227

积分

论坛积极会员

积分
227
金钱
169
HASS币
0
发表于 2019-7-16 21:36:45 | 显示全部楼层 |阅读模式
淘宝上买了一个非接触式红外温度传感器,想检测煤气灶是否开着,看了custom I2C sensor,没有头绪啊,或者刷什么固件容易接入自定义传感器,求大神帮助。
附传感器的示例代码
#ifndef __MLX90615_H__
#define __MLX90615_H__

#include <Arduino.h>
#include "SoftI2CMaster.h"

/* which pin to use. For example, if you use digital pin 2 for
 * SDA and digital pin 3 for SCL you have to use the following
 * definitions: 
 * #define SDA_PIN 2 
 * #define SDA_PORT PORTB 
 * #define SCL_PIN 3
 * #define SCL_PORT PORTB
 *
 */

#define MLX90615_OBJECT_TEMPERATURE     0x27
#define MLX90615_AMBIENT_TEMPERATURE    0x26
#define AccessEEPROM                    0x13
#define Default_Emissivity              0x4000
#define DEVICE                          0x5B



class MLX90615 {
public:
        void init()        {
                i2c_init();
        }
        
        /**************************************************************** 
         * Function Name: crc8_msb
         * Description:  CRC8 check to compare PEC data  
         * Parameters: poly - x8+x2+x1+1, data - array to check, array size
         * Return: 0 – data right; 1 – data Error
        ****************************************************************/ 
        uint8_t crc8Msb(uint8_t poly, uint8_t* data, int size)        {
                uint8_t crc = 0x00;
                int bit;

                while (size--) 
                {
                        crc ^= *data++;
                        for (bit = 0; bit < 8; bit++) 
                        {
                                if (crc & 0x80) {
                                        crc = (crc << 1) ^ poly;
                                } else {
                                        crc <<= 1;
                                }
                        }
                }

                return crc;
        }
        
        /**************************************************************** 
         * Function Name: Print_Temperature
         * Description: receive and print out temperature in Celcius and fahrenheit
         * Parameters: Temperature_kind - choose ambient or object Temperature
         * Return: 
        ****************************************************************/ 
        void printTemperature(int Temperature_kind) {
                int dev = DEVICE<<1;
                int dataLow = 0;
                int dataHigh = 0;
                int pec = 0;
                
                i2c_start(dev+I2C_WRITE);
                i2c_write(Temperature_kind);  
                // read
                i2c_rep_start(dev+I2C_READ);
                dataLow = i2c_read(false); 
                dataHigh = i2c_read(false); 
                pec = i2c_read(true);
                i2c_stop();
                
                //This converts high and low bytes together and processes temperature, MSB is a error bit and is ignored for temps
                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)(((dataHigh & 0x007F) << 8) + dataLow);
                tempData = (tempData * tempFactor)-0.01;
                
                float celcius = tempData - 273.15;
                float fahrenheit = (celcius*1.8) + 32;    
         
                //Serial.print("Celcius: ");
                Serial.println(celcius);

                //Serial.print("Fahrenheit: ");
                //Serial.println(fahrenheit); 
        }
        
        /**************************************************************** 
         * Function Name: readEEPROM
         * Description:  read from eeprom to see what data in it.
         * Parameters: 
         * Return:
        ****************************************************************/
        int readEEPROM() {
                int dev = DEVICE<<1;
                int dataLow = 0;
                int dataHigh = 0;
                int pec = 0;
                
                delay(500);
                i2c_start(dev+I2C_WRITE);
                i2c_write(AccessEEPROM);  
                // read
                i2c_rep_start(dev+I2C_READ);
                dataLow = i2c_read(false); //Read 1 byte and then send ack
                dataHigh = i2c_read(false); //Read 1 byte and then send ack
                pec = i2c_read(true);
                i2c_stop();
                
                uint16_t eepromData = 0x0000; // zero out the data
                
                eepromData = (uint16_t)(((dataHigh & 0x007F) << 8) + dataLow);
         
                Serial.print("eepromData: 0x");
                Serial.println(eepromData, HEX);
                
                return 0;
        }
        
        /**************************************************************** 
         * Function Name: WriteEEPROM
         * Description:  write EEPROM at address 0x13 to adjust emissivity
         * Parameters: emissivity – data to write into EEPROM
         * Return: 0 - success; -1 - crc8 check err.
        ****************************************************************/ 
        int writeEEPROM(uint16_t emissivity) {
                char  buffer[6] = {0};
           char *write = buffer + 0;
           char *cmd = buffer + 1;
           char *data = buffer + 2;
           
           int dev = 0x5B<<1;
           
           *write = dev;
           *cmd = AccessEEPROM;
           *(data++) = emissivity & 0xff;
           *(data++) = (emissivity >> 8) & 0xff;
           *data = crc8Msb(0x07, (uint8_t*)buffer, 4);
           
           Serial.println(*data, HEX);
                   
           if(crc8Msb(0x07,(uint8_t*)buffer, 5)) 
           {
                 Serial.println("CRC8 Check Err...");
                 return -1;
           }
           Serial.println("CRC8 Check OK...");
           
           i2c_start(dev+I2C_WRITE);  
           i2c_write(AccessEEPROM);
           i2c_write( emissivity & 0xff );
           i2c_write( (emissivity >> 8) & 0xff );     
           i2c_write(data[0]);   
           i2c_stop(); 
           
           return 0;
        }

};

#endif // __MLX90615_H__


回复

使用道具 举报

27

主题

2143

帖子

8934

积分

论坛元老

Rank: 8Rank: 8

积分
8934
金钱
6786
HASS币
30

论坛元老

发表于 2019-7-17 09:26:26 | 显示全部楼层
https://esphome.io/components/i2c.html
不知道这个官网链接有没有帮助
回复

使用道具 举报

4

主题

58

帖子

227

积分

论坛积极会员

积分
227
金钱
169
HASS币
0
 楼主| 发表于 2019-7-17 13:00:50 | 显示全部楼层
这个是配置已经支持I2C部件的
回复

使用道具 举报

5

主题

322

帖子

1345

积分

金牌会员

Rank: 6Rank: 6

积分
1345
金钱
1023
HASS币
0
发表于 2019-7-18 10:49:06 | 显示全部楼层
看看这个,https://esphome.io/custom/i2c.html
再参考这个,https://esphome.io/components/sensor/custom.html

esphome很灵活的!
回复

使用道具 举报

5

主题

322

帖子

1345

积分

金牌会员

Rank: 6Rank: 6

积分
1345
金钱
1023
HASS币
0
发表于 2019-7-18 10:53:01 | 显示全部楼层
本帖最后由 netsnake 于 2019-7-18 11:02 编辑

如果设备直接有I2C管脚,试试在yaml中直接定义,参考https://esphome.io/components/sensor/am2320.html?highlight=i2c

还有这个:https://esphome.io/custom/i2c.html?highlight=i2c

主要步骤:

1、建立 ????.h文件,完成类定义
     包含初始化、如何取值,使用sensor的publish发布取到的值之类
2、建立yaml文件,完成自定义基于I2C的sensor定义

类似这种(我用的串口)-yaml:
uart:
  - id: utonecommand
    tx_pin: GPIO1
    rx_pin: GPIO3
    baud_rate: 115200


sensor:
  - platform: custom
    lambda: |-
      auto tonecommand = new ToneCommand(id(utonecommand));
      App.register_component(tonecommand);
      return {tonecommand->index};
    sensors:
      - name: "command index"
        id: "commandindexid"




回复

使用道具 举报

22

主题

303

帖子

1071

积分

金牌会员

Rank: 6Rank: 6

积分
1071
金钱
763
HASS币
20
发表于 2019-11-18 22:29:30 | 显示全部楼层
手头上有个MCP23017的16IO扩展板,还不知道怎么应用呢
回复

使用道具 举报

4

主题

57

帖子

277

积分

论坛分享达人

积分
277
金钱
220
HASS币
10
发表于 2020-5-18 23:54:55 | 显示全部楼层
又学习一下,很多要学习的
回复

使用道具 举报

4

主题

57

帖子

277

积分

论坛分享达人

积分
277
金钱
220
HASS币
10
发表于 2020-5-19 18:28:32 | 显示全部楼层
试试这个简单的实例,https://bbs.hassbian.com/thread-7646-1-1.html
回复

使用道具 举报

0

主题

7

帖子

74

积分

注册会员

Rank: 2

积分
74
金钱
67
HASS币
0
发表于 2020-12-8 00:43:43 | 显示全部楼层
不知道有没有人遇到过。串联两个iic 设备后,只有一个能使用。 另外一个就连接失败。 两个单独又都可以用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-26 16:24 , Processed in 0.164886 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表