본문으로 건너뛰기

응용 프로그램 개발 - AI Chatbot

Arduino-TuyaOpen는 완전한 AI chatbot 응용 프로그램을 예 발송합니다. 사용 방법YourChatBotTUYA-T5AI 시리즈 발달 널을 가진 표본 부호, 당신은 음성 상호 작용, 원본 대화, MCP 공구 invocation 및 더 많은 것을 지원하는 똑똑한 chatbot를 건설합니다.

Project 파일 구조

YourChatBot/
├── YourChatBot.ino # Main program entry; includes setup/loop, AI event callback, IoT event callback
├── appButton.cpp/.h # Button interaction module; handles single click, double click, long press, etc.
├── appDisplay.cpp/.h # UI display module; supports built-in WeChat-style UI and custom LVGL UI
├── appMCP.cpp/.h # MCP tool registration module; demonstrates photo capture, volume, mode switch, device info tools
├── appStatus.cpp/.h # Status monitoring module; periodically updates WiFi signal and system heap memory info
└── appAudioRecord.cpp/.h # Audio recording module; supports saving MIC and TTS data to SD card

공급 업체

시작하기 전에 개발 환경 설정이 설명되었습니다.빠른 시작.

  1. 컴퓨터에 T5AI 개발 보드를 연결, Arduino IDE를 열고,TUYA_T5AI보드, 올바른 업로드 포트를 선택합니다.

    노트

T5AI 시리즈 발달 널은 이중 직렬 포트 커뮤니케이션을 제공합니다. 컴퓨터에 연결될 때, 2개의 직렬 포트 수는 검출됩니다. UART0은 펌웨어 번쩍기를 위해 사용됩니다. Arduino IDE에서 올바른 업로드 포트를 선택하십시오. :::

  1. Arduino IDE에서 클릭File -> Examples -> AI components -> YourChatBot예제 코드를 엽니다.

  2. 인증 코드 및 제품 PID를 자신의 자격 증명을 가진 예 파일로 대체하십시오.

    // Device authorization code (replace with your own)
    #define TUYA_DEVICE_UUID "uuidxxxxxxxxxxxxxxxx"
    #define TUYA_DEVICE_AUTHKEY "keyxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    // Product PID (replace with the PID created on the Tuya IoT platform)
    #define TUYA_PRODUCT_ID "xxxxxxxxxxxxxxxx"
  3. (선택) 오디오 레코딩 기능을 활성화하기 위해 (MIC 및 TTS 오디오 데이터를 SD 카드에 저장), 설정ENABLE_AUDIO_RECORDING으로1:

    #define ENABLE_AUDIO_RECORDING 1 // Default is 0 (off); set to 1 to enable audio recording
  4. Arduino IDE의 왼쪽 상단 모서리에서 업로드 버튼을 클릭하여 코드를 플래시합니다. 터미널의 다음 메시지는 성공적인 플래시를 나타냅니다.

    [INFO]: Write flash success
    [INFO]: CRC check success
    [INFO]: Reboot done
    [INFO]: Flash write success.

장치 연결 및 상호 작용

장치 연결

펌웨어를 깜박임 후, 개발 보드는 네트워크에 연결하고 원격 통신을 활성화하기 위해 클라우드로 등록합니다. 일단 제공되면, 3방향 통신Phone, Tuya Cloud·Device설치

장치 제공 가이드의 경우, 참조Device Network 구성.

:::tip 빠른 재제작 Quick Succession에서 리셋 버튼을 3번 누르면 저장된 네트워크 구성을 제거하고 프로비저닝 상태를 다시 입력합니다. :::

장치 상호 작용

전화 앱을 통해 성공한 후 다음 두 가지 방법으로 AI Agent와 상호 작용할 수 있습니다.

텍스트 상호 작용

Arduino IDE 내장 직렬 모니터 (보통 속도 115200), 입력 상자에 입력 텍스트를 열고 Enter를 눌러 보내주세요. 직렬 포트에 AI 에이전트와 텍스트 대화를 할 수 있습니다. 예제 코드는 직렬 포트에서 클라우드 기반 대형 언어 모델로 받은 텍스트를 보냅니다.TuyaAI.sendText(), 그리고 AI의 응답은 직렬 감시자와 스크린 둘 다에 표시됩니다.

음성 상호 작용

Voice Interactive는 기본 설정과 함께 4개의 대화 모드를 지원합니다.Wakeup모드. 버튼의 더블 클릭으로 모드를 통해 사이클**.

Wake word: H (Hey Tuya)

모드 ID형태 이름이름 *
0홀 (HOLD)음성 입력을 시작하려면 버튼을 누르고 유지하십시오. 버튼 끝 음성 입력
11열 (ONE SHOT)장치는 힘 위로에 대기를 입력합니다; 짧은 압박은 단 하나 음성 대화를 위한 듣는 국가로 장치를 끼워넣습니다
2웨이크업 (WAKEUP)Wake the device with the Wake word, 그 후 하나의 대화를 수행 — 스마트 스피커 상호 작용과 유사
3무료 (FREE)깨진 단어로 장치를 waking 한 후 연속 대화가 활성화됩니다. 대화가 깨진 후 30 초 이내에 발생하면 장치가 대기로 돌아갑니다.

신청 예 walkthrough

전체 기능 데모로 더 많은 간결을 시작할 수 있습니다.AI 예제AI 개발 워크플로우에 익숙한 것.

AI 개발

AI 모듈의 초기화

// 1. Configure and initialize AI core
AIConfig_t aiConfig = {AI_CHAT_MODE_WAKEUP, 70, aiEventCallback, aiStateCallback, NULL};
TuyaAI.begin(aiConfig);

// 2. Initialize audio subsystem
TuyaAI.Audio.begin();

// 3. Initialize UI subsystem
appDisplayInit(UI_TYPE);

** 모수 묘사: **

제품 설명이름 *
AI_CHAT_MODE_WAKEUP초기 대화 모드, 옵션:AI_CHAT_MODE_HOLD(0) / AI_CHAT_MODE_ONE_SHOT(1) / AI_CHAT_MODE_WAKEUP(2) / AI_CHAT_MODE_FREE(3)
70초기 볼륨 (범위 0-100)
aiEventCallbackAI 이벤트 콜백 기능 ASR, TTS, 텍스트 스트림 등 모든 AI 이벤트 데이터를 수신
aiStateCallback장치 상태 변경 알림 받기를 위한 AI 국가 콜백 기능
NULL사용자 정의 데이터 포인터, 일반적으로 설정NULL

TuyaAI.Audio.begin()장치의 오디오 시스템을 초기화하여 마이크, 스피커 및 오디오 코덱을 가능하게 합니다.

UI 초기화는UI_TYPE로그인appDisplay.h:

#define UI_TYPE BOT_UI_WECHAT // Modify in appDisplay.h
  • BOT_UI_WECHAT: 내장 WeChat-style UI, 상자에서 사용할 준비가되었습니다.
  • BOT_UI_USER: LVGL을 초기화; LVGL API를 통해 UI를 직접 디자인합니다.

AI 이벤트 콜백

static void aiEventCallback(AI_USER_EVT_TYPE_E event, uint8_t *data, uint32_t len, void *arg);

AI 작업 중, 이벤트 및 데이터의 풍부한 세트가 생성됩니다. 모든 AI 사건은 파견되고 획일하게 취급됩니다aiEventCallback. 주요 행사 유형은 다음과 같습니다.

(주)이름 *Callback 데이터
AI_USER_EVT_ASR_OKASR 음성 인식 성공본문내용 바로가기
AI_USER_EVT_ASR_EMPTYASR 결과가 비어 있습니다 (사용자가 말하지 않았다)이름 *
AI_USER_EVT_ASR_ERRORASR 인식 실패이름 *
AI_USER_EVT_MIC_DATA마이크 원시 PCM 오디오 데이터PCM 오디오 바이트 스트림
AI_USER_EVT_TTS_PRETTS는 놀기 시작에 관하여 입니다이름 *
AI_USER_EVT_TTS_STARTTTS 시작이름 *
AI_USER_EVT_TTS_DATATTS 오디오 데이터 펑크 (MP3 형식)MP3 오디오 바이트 스트림
AI_USER_EVT_TTS_STOPTTS 재생 완료 일반적으로이름 *
AI_USER_EVT_TTS_ABORTTTS가 중단되었습니다.이름 *
AI_USER_EVT_TEXT_STREAM_STARTLLM 텍스트 응답 스트림 시작텍스트 데이터의 첫 번째 세그먼트
AI_USER_EVT_TEXT_STREAM_DATALLM 텍스트 응답 스트림 데이터텍스트 데이터 chunk
AI_USER_EVT_TEXT_STREAM_STOPLLM 텍스트 응답 스트림 끝이름 *
AI_USER_EVT_SKILLSkill data (예를 들어, 음악 재생)cJSON* 기술 자료
AI_USER_EVT_EMOTIONEmotion는 텍스트 태그에서 패AI_AGENT_EMO_T*감정 struct
AI_USER_EVT_LLM_EMOTIONLLM의 사용자 감정AI_AGENT_EMO_T*감정 struct
AI_USER_EVT_SERVER_VADServer-side 음성 활동 탐지 종료이름 *
AI_USER_EVT_MODE_SWITCH대화 모드 전환새로운 모드 번호 (int)
AI_USER_EVT_CHAT_BREAK대화가 중단되었습니다.이름 *

AI 상태 콜백

static void aiStateCallback(AI_MODE_STATE_E state);

AI 장치가 작동 중에 상태를 전환합니다.aiStateCallback상태 변경 알림을 수신하므로 UI를 업데이트하거나 비즈니스 로직을 실행할 수 있습니다. 국가 목록은 다음과 같습니다 :

(주)이름 *
AI_MODE_STATE_IDLEIdle 상태
AI_MODE_STATE_INIT초기화
AI_MODE_STATE_LISTEN듣기 (듣기)
AI_MODE_STATE_UPLOAD업로드 (랜스 데이터 업로드)
AI_MODE_STATE_THINKThinking (LLM 응답을 위해 와이팅)
AI_MODE_STATE_SPEAK말하기 (TTS는 재생)

IoT 개발

IoT 초기화

// Press the reset button 3 times in quick succession to trigger device re-provisioning
TuyaIoT.resetNetcfg();
// Set IoT event callback function
TuyaIoT.setEventCallback(tuyaIoTEventCallback);
// Set device authorization code
TuyaIoT.setLicense(TUYA_DEVICE_UUID, TUYA_DEVICE_AUTHKEY);
// Start IoT service with product PID and firmware version
TuyaIoT.begin(TUYA_PRODUCT_ID, PROJECT_VERSION);

TuyaIoT.resetNetcfg()빠른 리셋 버튼 리프로비저닝 기능을 제공합니다. Quick Succession에서 리셋 버튼을 3 번 누르면 저장된 네트워크 구성을 명확하게하고 프로비저닝 상태를 다시 입력합니다.

IoT 이벤트 처리

static void tuyaIoTEventCallback(tuya_event_msg_t *event);

모든 IoT 플랫폼 이벤트는 획일하게 처리됩니다.tuyaIoTEventCallback. 주요 사건은 다음을 포함합니다:

(주)이름 *
TUYA_EVENT_BIND_START장치 시작 네트워크 제공; 제공 신속한 톤
TUYA_EVENT_MQTT_CONNECTEDMQTT 연결 성공; 이 시점에서 MCP 도구 및 보고서 장치 상태를 초기화 할 수 있습니다.
TUYA_EVENT_MQTT_DISCONNECTMQTT 연결 손실
TUYA_EVENT_TIMESTAMP_SYNCCloud Time 동기화
TUYA_EVENT_RESET장치가 재설정되었습니다.
TUYA_EVENT_UPGRADE_NOTIFYOTA 업그레이드 알림 수신
TUYA_EVENT_DP_RECEIVE_OBJObject-type DP data 수신(예, 볼륨 컨트롤)
TUYA_EVENT_DP_RECEIVE_RAW주어진 원료 유형 DP 자료

DP 데이터 상호 작용

이 예제는 DP (Data Point)를 통해 클라우드 기반 볼륨 제어를 구현합니다.

#define DPID_VOLUME 3 // Volume DP ID

// Handle volume setting in DP receive callback
case DPID_VOLUME:
uint8_t volume = dp->value.dp_value;
TuyaAI.setVolume(volume);
break;

Tuya Cloud를 IoT 개발을 통해 제어할 수 있습니다.powered by Tuya장치. 더 많은 DP 작업을 위해,00_IoT_SimpleExample예.

오디오 개발

모든 오디오 관련 데이터는 얻고 있습니다.aiEventCallbackcallback, 구분AI_USER_EVT_TYPE_E이벤트 유형:

(주)데이터 형식이름 *
AI_USER_EVT_ASR_OKUTF-8 텍스트Cloud ASR 음성 인식 결과
AI_USER_EVT_MIC_DATAPCM (16kHz, 16비트, 모노)Raw 마이크 레코딩 데이터
AI_USER_EVT_TTS_DATAMP3 데이터 펑크LLM의 TTS 오디오 데이터 스트림
AI_USER_EVT_TTS_PRE/START/STOP이름 *TTS 재생 수명주기 이벤트
AI_USER_EVT_TEXT_STREAM_START/DATA/STOPUTF-8 텍스트LLM의 텍스트 데이터 스트림
AI_USER_EVT_SERVER_VAD이름 *Server-side 음성 활동 탐지 (사용자가 말하는 중지 때 탐지)

SD 카드에 오디오 녹음

더 보기appAudioRecord.cpp/.h파일은 MIC 및 TTS 오디오 데이터를 SD 카드에 저장합니다. 설정하기ENABLE_AUDIO_RECORDING매크로로1사용하기 전에.

  • ** MIC 레코딩 **: 저장.pcmSD 카드 쓰기 주파수를 줄이기 위해 in-memory 버퍼 (기본 16KB)와 형식. 녹화가 자동으로 시작될 때AI_MODE_STATE_LISTEN청취 국가를 떠날 때의 중지.
  • **TTS 레코딩 **: 저장.mp3형식; 시작AI_USER_EVT_TTS_START그리고 끝에서AI_USER_EVT_TTS_STOP또는AI_USER_EVT_TTS_ABORT.
  • 기록 파일은 저장됩니다/ai_recordingsSD 카드에 디렉토리, 자동 증가 순차적 naming (예를 들어,mic_001.pcm, tts_001.mp3).

버튼 상호 작용

더 보기appButton.cpp/.h파일 사용Button통합 버튼 기능을 제공하는 구성 요소. 기본적으로, 그것은 GPIO 12를 사용, 낮은 수준에 트리거, 내부 풀 업.

다음 버튼 이벤트가 지원됩니다:

(주)채용 정보
단일 클릭 (BUTTON_EVENT_SINGLE_CLICK)자주 묻는 질문TuyaAI.modeKeyHandle()— 현재 모드에 대한 대화 작업을 트리거
더블 클릭 (BUTTON_EVENT_DOUBLE_CLICK)오디오 재생 중지 → 현재 대화 중지 → 다음 대화 모드로 전환 → 모드 프롬프트 톤
긴 압박 (Long Press)BUTTON_EVENT_LONG_PRESS_START)자주 묻는 질문TuyaAI.modeKeyHandle()(잠금 모드에서 기록)
보도자료자주 묻는 질문TuyaAI.modeKeyHandle()관련 제품

두 배 누르기 형태 엇바꾸기를 위한 핵심 논리:

if (event == BUTTON_EVENT_DOUBLE_CLICK) {
TuyaAI.Audio.stop(); // Stop current audio playback
TuyaAI.interruptChat(); // Interrupt current conversation
AI_CHAT_MODE_E nextMode = TuyaAI.nextChatMode(); // Get next mode
TuyaAI.saveModeConfig(nextMode, volume); // Save mode configuration
// Play the prompt tone for the corresponding mode
}
노트

더 많은 사용법Button구성 요소는 아래 예제를 참조하십시오.Peripheral/Button이름 *

UI 개발

더 보기appDisplay.cpp/.h파일은 장치의 UI 기능의 통합 캡슐화를 제공합니다. UI 방식의 전환UI_TYPE로그인appDisplay.h.

프로젝트

내장 된 WeChat 스타일 UI 페이지, 상자에서 사용할 준비가되었습니다. 글꼴을 얻을 수 있습니다 (getTextFont), 아이콘 (getIconFont / getWifiIcon), 이모티콘 및 기타 UI 리소스를 통해TuyaAI.UI클래스 인터페이스 및 내장 UI 구성 요소의 디스플레이 콘텐츠를 제어합니다.

비밀번호

이 매개 변수는 LVGL 그래픽 엔진 만 시작하면 UI를 완전히 디자인 할 수 있습니다. 더 보기_createUI()기능에appDisplay.cpp다음과 같은 레이아웃을 가진 최소 어두운 테마 UI 참조 구현을 제공합니다:

┌──────────────────────────┐
│ [Chat Mode] [WiFi] │ ← Top status bar (30px)
├──────────────────────────┤
│ [Device Status] │ ← Status indicator area (36px)
├──────────────────────────┤
│ ┌────────────────────┐ │
│ │ User message... │◀──│ ← User bubble (right-aligned, green)
│ └────────────────────┘ │
│ ┌────────────────────┐ │
│ ──▶ AI response... │ │ ← AI bubble (left-aligned, gray)
│ └────────────────────┘ │
└──────────────────────────┘

예를 들어 콜백에서 편리한 UI 업데이트에 대한 다음 디스플레이 인터페이스를 캡슐화합니다.

지원하다이름 *
appDisplaySetUserText()본문 바로가기
appDisplaySetAIText()표시 AI 응답 텍스트
appDisplayStreamStart/Append/End()Stream-display AI 응답
appDisplaySetStatus()업데이트 장치 상태 텍스트
appDisplaySetMode()업데이트 대화 모드 표시
appDisplaySetWifi()업데이트 WiFi 상태 아이콘

Display 부품

직접 TUYA-T5AI-BOARD 개발 보드에 화면을 구동하는이 구성 요소를 사용합니다. 구성 요소는 기본 화면 렌더링 기능 및 ** 카메라 데이터 직접 디스플레이 ** 기능을 제공합니다.

노트

디스플레이 구성 요소의 더 많은 사용은 아래 예제를 참조하십시오.Display이름 *Camera감독.

AI 고급 기능

사이트맵

MCP는 무엇입니까?: MCP(Model Context Protocol)는 AI Agent invoke Device-side 로컬 툴을 제공하는 범용 프로토콜 인터페이스입니다.

더 보기appMCP.cpp/.hFile register 로컬 MCP 도구 AI Agent invocation.

노트

MCP 공구는 MQTT 연결이 설치된 후에 등록되어야 합니다. 예를 들어 구독EVENT_MQTT_CONNECTED등록 타이밍을 보장하기 위해 이벤트.

2 등록 방법:

  1. ** 간단한 등록** (parameterless tool): 사용TUYA_MCP_TOOL_ADD_SIMPLE매크로.

    // Register a parameterless tool
    TUYA_MCP_TOOL_ADD_SIMPLE(
    "device_info_get", // Tool name
    "Get device information.", // Tool description (for AI to understand purpose)
    onGetDeviceInfo, // Callback function
    nullptr // User data
    );
  2. ** 매개변수로 등록 **: 사용TUYA_MCP_TOOL_REGISTER매크로와 속성 정의.

    // Define tool parameters
    TuyaMCPPropDef volumeProps[] = {
    TuyaMCPPropIntRange("volume", "The volume level (0-100).", 0, 100)
    };
    // Register tool with parameters
    TUYA_MCP_TOOL_REGISTER(
    "device_audio_volume_set", // Tool name
    "Sets the device volume.", // Tool description
    onSetVolume, // Callback function
    nullptr, // User data
    volumeProps, 1 // Parameter definitions and count
    );

** 매개 변수 유형 매크로:**

제품정보이름 *
TuyaMCPPropStr(name, desc)String type 매개 변수
TuyaMCPPropIntRange(name, desc, min, max)Integer 유형 모수 (범위 constraint에)
TuyaMCPPropIntDefRange(name, desc, def, min, max)Integer 유형 매개변수 (기본값과 범위)

** 콜백 기능의 일반적인 방법 : **

제품 설명이름 *
TuyaAI.MCP.getPropertyInt(props, name, def)integer 매개 변수 값
TuyaAI.MCP.setReturnBool(retVal, value)boolean 값 반환
TuyaAI.MCP.setReturnJson(retVal, json)JSON 객체를 반환
TuyaAI.MCP.setReturnImage(retVal, mime, data, len)이미지 데이터를 반환 (예를 들면, 사진 캡처 결과)

이 예제는 4개의 MCP 도구를 제공합니다:

공구 이름Trigger 명령제품정보
device_info_get"장치 정보 받기"장치 모델, 일련 번호, 펌웨어 버전 및 기타 JSON 정보를 반환
device_camera_take_photo"사진"카메라로 사진을 캡처하고 콘텐츠 인식을위한 AI에 JPEG 이미지를 반환
device_audio_volume_set"50에 볼륨 설정"장치 볼륨 설정 (0–100)
device_audio_mode_set"무료 대화 모드로 전환"전환 대화 모드 (0=Hold, 1=One-Shot, 2=Wakeup, 3=Free)

(주)

기술 자료는 에서 파AI_USER_EVT_SKILL행사일정aiEventCallback. 사용TuyaAI.Skill.parse()파싱 방법, 여러 기술 유형을 지원:

case AI_USER_EVT_SKILL:
SkillData_t skill;
if (OPRT_OK == TuyaAI.Skill.parse(data, skill)) {
switch (skill.type) {
case SKILL_TYPE_MUSIC: // Music playback
case SKILL_TYPE_STORY: // Story playback
// Get music/story URL, name, and other information
// skill.music->src_array[0].url
TuyaAI.Skill.dumpMusic(skill); // Print debug info
TuyaAI.Skill.freeMusic(skill); // Release resources (must be called)
break;
case SKILL_TYPE_PLAY_CONTROL: // Playback control (previous/next/pause, etc.)
// skill.playControl.action
break;
case SKILL_TYPE_EMOTION: // Emotion skill
break;
}
}
break;

팟캐스트

AI 채팅 중 감정 인식은 두 소스에서 온다 :

  • AI_USER_EVT_EMOTION: 텍스트 태그에서 감정.
  • AI_USER_EVT_LLM_EMOTION: 큰 언어 모델에 의한 사용자 감정.

두 반환 데이터를 통해AI_AGENT_EMO_Temotion name를 포함하는 구조name)와 **응용 이모티콘 ** (emoji, 유니코드 인코딩). 제품 정보TuyaAI.Skill.unicodeToUtf8()emoji의 Unicode 인코딩을 UTF-8 문자열로 변환합니다.

case AI_USER_EVT_LLM_EMOTION:
AI_AGENT_EMO_T *emo = (AI_AGENT_EMO_T *)data;
Serial.print("Emotion: "); Serial.println(emo->name);
if (emo->emoji) {
char utf8[8];
TuyaAI.Skill.unicodeToUtf8(emo->emoji, utf8, sizeof(utf8));
Serial.print("Emoji: "); Serial.println(utf8);
}
break;

상태 모니터링

더 보기appStatus.cpp/.hfile periodically monitor device runtime status, including:

  • WiFi 신호 상태: 1초마다 WiFi 연결 상태를 확인합니다. 상태 변경 시 화면의 WiFi 아이콘을 자동으로 업데이트합니다.
  • Heap Memory Monitoring: 개발 디버깅을 위한 5초마다 무료 힙 메모리 크기를 출력합니다.
  • ** 대화 모드 표시**: 실시간 화면의 현재 대화 모드 이름을 보여줍니다.

더 보기