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

 找回密码
 立即注册
楼主: evantalk

[智能音箱] 低成本DIY离线语音助手完结【已上传展示视频】

  [复制链接]

24

主题

579

帖子

2683

积分

金牌会员

Rank: 6Rank: 6

积分
2683
金钱
2104
HASS币
0
发表于 2023-12-11 16:38:34 | 显示全部楼层
bhc1365 发表于 2023-12-11 08:43
已经换过几gpio脚试过了,还是这样。

好吧 你试试我的配置
esphome:
  includes:
    - my_custom_component_8266.h

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:

captive_portal:

uart:
  id: uart_bus
  tx_pin: GPIO5
  rx_pin: GPIO4
  baud_rate: 9600

text_sensor:
  - platform: custom
    lambda: |-
      auto my_custom = new MyCustomComponent(id(uart_bus));
      App.register_component(my_custom);
      return {my_custom->uart_text_sensors};
    text_sensors:
      name: "UartSensor"

h文件
#include "esphome.h"
using namespace esphome;

class MyCustomComponent : public Component, public uart::UARTDevice {
 protected:
  unsigned char telegram[100];
  char data[100];

  bool read_message() {
    int i = 0;
    if (available()) {
      while (available()) {
        telegram[i] = read();
        data[i] = (char) telegram[i];
        ESP_LOGD("DmsrCustom", "0x%x", telegram[i]);
        i++;
      }
      data[i] = 0;
      uart_text_sensors->publish_state(data);
      //延迟3秒
//      delay(3000);
      //发布固定状态为off 配合需要重复触发的情况
//      uart_text_sensors->publish_state("off");
    }
    return false;
  }
 public:
  MyCustomComponent(UARTComponent *parent) : UARTDevice(parent) {}
  TextSensor *uart_text_sensors = new TextSensor();

  void setup() override {
    // nothing to do here
  }
  void loop() override {
    // Use Arduino API to read data, for example
    if (available()) {
      ESP_LOGD("DmsrCustom", "loop start");
      read_message();
    }
  }
};



回复

使用道具 举报

23

主题

243

帖子

2319

积分

金牌会员

Rank: 6Rank: 6

积分
2319
金钱
2076
HASS币
0
发表于 2023-12-11 19:11:23 | 显示全部楼层
kjjuhfv 发表于 2023-12-11 16:38
好吧 你试试我的配置h文件

使用你的文件有语音信号输入时就断网了。也有空信号输出。感谢
回复

使用道具 举报

23

主题

243

帖子

2319

积分

金牌会员

Rank: 6Rank: 6

积分
2319
金钱
2076
HASS币
0
发表于 2023-12-12 15:54:44 | 显示全部楼层
没办法,只能用ardunio的了,就是多用了一个8266模块,本来想语音和实体使用一个esp8266的,看来还是不行。
回复

使用道具 举报

24

主题

579

帖子

2683

积分

金牌会员

Rank: 6Rank: 6

积分
2683
金钱
2104
HASS币
0
发表于 2023-12-12 17:42:06 | 显示全部楼层
本帖最后由 kjjuhfv 于 2023-12-12 17:44 编辑
bhc1365 发表于 2023-12-11 19:11
使用你的文件有语音信号输入时就断网了。也有空信号输出。感谢

你的语音模块是什么?供电共地了吗?
或者你可以使用另外的esp8266作为发射端 看看能不能正常接收
这是代码
刷进去后 tx接另一个8266的rx

uart:
  id: uart_bus
  tx_pin: GPIO5
  rx_pin: GPIO4
  baud_rate: 9600

button:
  - platform: template
    name: "aaaaa"
    on_press:
    - uart.write: 'a wo cao ni ma'

  - platform: template
    name: "bbbbb"
    on_press:
      - uart.write: "a wo yao hui jia"

  - platform: template
    name: "ccccc"
    on_press:
      - uart.write: [0x75, 0x70]

  - platform: template
    name: "ddddd"
    on_press:
      - uart.write: [0x64, 0x6F, 0x77, 0x6E]

  - platform: template
    name: "Test Button 5"
    on_press:
      - uart.write: "a zhe shi jie hao ke pa wo yao hui jia"

回复

使用道具 举报

23

主题

243

帖子

2319

积分

金牌会员

Rank: 6Rank: 6

积分
2319
金钱
2076
HASS币
0
发表于 2023-12-12 22:28:13 | 显示全部楼层
kjjuhfv 发表于 2023-12-12 17:42
你的语音模块是什么?供电共地了吗?
或者你可以使用另外的esp8266作为发射端 看看能不能正常接收
这是代码

用的是SU-03T语音模块,可以接收到语音数据,就是与hass里始终显示连接与离线。还是esphome的自定义UART的问题。
回复

使用道具 举报

0

主题

3

帖子

70

积分

注册会员

Rank: 2

积分
70
金钱
67
HASS币
0
发表于 2024-2-21 11:24:53 | 显示全部楼层
本帖最后由 f8fengh 于 2024-2-21 11:40 编辑

亲,感谢教程,很有帮助!!
这里遇到问题,为什么HA里text_sensor实体始终显示未知?
调试输出正常,能收到自定义的信息:
[11:21:48][D][uart_debug:158]: <<< "\xAAU\x03U\xAA"
[11:21:51][D][uart_debug:158]: <<< "\xAAU\x02U\xAA"
我的配置yaml文件如下:
    
uart:
  id: uart_bus
  tx_pin: D0
  rx_pin: D1
  baud_rate: 9600
  debug:
    direction: BOTH
    dummy_receiver: false
    after:
      delimiter: "\n"
    sequence:
      - lambda: UARTDebug::log_string(direction, bytes);

text_sensor:
- platform: custom
  lambda: |-
    auto my_custom_sensor = new UartReadLineSensor(id(uart_bus));
    App.register_component(my_custom_sensor);
    return {my_custom_sensor};
  text_sensors:
    name: "命令"

回复

使用道具 举报

10

主题

141

帖子

1038

积分

金牌会员

Rank: 6Rank: 6

积分
1038
金钱
897
HASS币
0
发表于 2024-5-16 13:52:32 | 显示全部楼层
我让chatGPT优化了一下.h文件部分的代码,供参考。

#include "esphome.h"

class UartReadLineSensor : public Component, public UARTDevice, public TextSensor {
public:
    UartReadLineSensor(UARTComponent *parent) : UARTDevice(parent) {}

    void setup() override {
        // nothing to do here
    }

    void loop() override {
        static std::string line_buffer;  // 用于存储一行数据的缓冲区

        while (available()) {
            char c = read();  // 读取一个字符
            if (c == '\n') {
                // 当读取到换行符时,发布状态并清空缓冲区
                publish_state(line_buffer.c_str());
                line_buffer.clear();
            } else if (c >= 32 && c <= 126) {
                // 只有当字符是可打印的时候才添加到缓冲区
                line_buffer += c;
            }
        }
    }
};

回复

使用道具 举报

1

主题

138

帖子

2850

积分

金牌会员

Rank: 6Rank: 6

积分
2850
金钱
2712
HASS币
0
发表于 2024-9-19 21:28:40 | 显示全部楼层
imwyh 发表于 2024-5-16 13:52
我让chatGPT优化了一下.h文件部分的代码,供参考。


感谢大神提供的代码,我借用修改了哈,发送关键词后发送空白内容,可以实现重复触发,多次发送关键词用于node-red检测。

#include "esphome.h"

class UartReadLineSensor : public Component, public UARTDevice, public TextSensor 
{
public:
    UartReadLineSensor(UARTComponent *parent) : UARTDevice(parent) {}

    void setup() override
     {
        // nothing to do here
    }

    void loop() override 
    {
        static std::string line_buffer;  // 用于存储一行数据的缓冲区

        while (available()) 
        {
            char c = read();  // 读取一个字符
            if (c == '\n') 
            {
                // 当读取到换行符时,发布状态并清空缓冲区
                publish_state(line_buffer.c_str());
                line_buffer.clear();
                delay(100);
                publish_state(line_buffer.c_str());
            } else if (c >= 32 && c <= 126) 
            {
                // 只有当字符是可打印的时候才添加到缓冲区
                line_buffer += c;
            }
        }
    }
};
回复

使用道具 举报

10

主题

141

帖子

1038

积分

金牌会员

Rank: 6Rank: 6

积分
1038
金钱
897
HASS币
0
发表于 2024-10-27 22:57:44 | 显示全部楼层
chenlang2361239 发表于 2024-9-19 21:28
感谢大神提供的代码,我借用修改了哈,发送关键词后发送空白内容,可以实现重复触发,多次发送关键词用 ...

时间太久远了,不太记得代码了,您这样目的是什么?
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-23 05:10 , Processed in 0.073963 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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