4199浏览
查看: 4199|回复: 0

[项目] 【智控万物 】AI电子相册

[复制链接]
本帖最后由 云天 于 2021-3-29 15:12 编辑

【智控万物 】AI电子相册图1

【云天AI电子相册】

语音控制播放相片及进行相片相关简介语音播报。

【视频演示】

【硬件设备】
1、主控板:FireBeetle Board ESP32-E(Arduino开发板),拥有GDI显示接口,单线连接显示屏
【智控万物 】AI电子相册图2

【智控万物 】AI电子相册图3


此接口为DFRbot专用GDI显示屏接口,使用18pin-FPC线连接,单线材连接屏幕,为您提供最简捷的屏幕使用方式。
以下是GDI接口使用的引脚列表

【智控万物 】AI电子相册图4

  1. /*ESP32 and ESP8266*/
  2. #elif defined(ESP32) || defined(ESP8266)
  3. #define TFT_DC  25
  4. #define TFT_CS  14
  5. #define TFT_RST 26
复制代码
2、2.8" 320x240 IPS TFT电阻触摸显示屏
这是一款2.8英寸的IPS电阻式触摸显示屏。该模块分辨率为320x240,驱动IC为ILI9341,采用SPI(4线)通信方式。板载触摸芯片XPT2046,触控芯片将AD采集的触摸数据转换成SPI数据。模块集成SD卡槽,可以轻松的从SD卡中读取全彩色位图。模块为用户提供了两种接线方式,一种为普通排针接线方式;另一种为GDI(General Display interface)接口,需有GDI接口的主控相匹配(如FireBeetle Board ESP32-E),只需一根fpc线,就可即插即用,降低了接线的复杂程度。
【智控万物 】AI电子相册图5


教程中提到的下面这句有误,应为“DFRobot_ILI9341_240x320_HW_SPI

【智控万物 】AI电子相册图6

库文件实例“drawSDPicture.ino”中下列代码

  1. /*ESP32 and ESP8266*/
  2. #elif defined(ESP32) || defined(ESP8266)
  3. #define TFT_DC  D3
  4. #define TFT_CS  D4
  5. #define TFT_RST D5
  6. #define TFT_SD  D6
复制代码
应修改为:

  1. #elif defined(ESP32) || defined(ESP8266)
  2. #define TFT_DC  25
  3. #define TFT_CS  14
  4. #define TFT_RST 26
  5. #define TFT_SD  13
复制代码
且在代码中读取SD卡文件时,在目录使用上出现问题,给我带来三天的困扰。

原代码中,目录“picture/219x220.jpg

  1. decoder.drawPicture(/*filename=*/"picture/219x220.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  2.   screen.fillScreen(COLOR_RGB565_WHITE);
  3.   decoder.drawPicture(/*filename=*/"picture/RGB565.bmp",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
复制代码
应修改为:“/picture/219x220.jpg

  1. decoder.drawPicture(/*filename=*/"/picture/219x220.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  2.   screen.fillScreen(COLOR_RGB565_WHITE);
  3.   decoder.drawPicture(/*filename=*/"/picture/RGB565.bmp",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
复制代码
3、Gravity: 中英文语音合成模块

【智控万物 】AI电子相册图7


让声音为你的项目增添一抹特色!连接上语音合成模块,再添加几行简单的代码就可以让您的项目开口说话。无论是中文还是英文对于语音合成模块来说都是so easy,播报当前时间,播报环境数据统统不在话下,与语音识别模块结合还可实现语音对话!该模块采用I2C和UART两种通讯方式,Gravity接口,兼容绝大部分主控。模块上已经自带了一个喇叭,所以您无需再额外的添加喇叭。

4、Gravity:I2C语音识别模块
【智控万物 】AI电子相册图8

让声音为您的项目增添一抹特色!连接上语音识别模块,再添加几行简单的代码,您的项目就可以听懂您说的话。无需机器学习,无需特定人语音,无需联网,随时随地都可以进行语音识别,结合语音合成模块还可以实现语音对话。使用Gravity I2C接口通信,兼容绝大部分主控,非常适合接入教育场景使用。三种语音识别模式和三种语音输入方式使模块可以集成入更多的场景。
【硬件连接】
【智控万物 】AI电子相册图9

【Arduino IDE 编译环境配置】
1、下载主控的核心:https://wiki.dfrobot.com.cn/_SKU ... rd_ESP32_E#target_6
2、安装1 x 2.8" 240x320 LCD显示模块DFRobot_GDL库文件
3、安装中英文语音合成模块语音合成库文件和示例程序
4、安装Gravity I2C 离线语音识别模块库文件 DFRobot_ASR
【完整程序代码】
  1. /*!
  2. * @file SD.ino
  3. * @brief Read pictures in bmp / jpg / jpeg format from the SD card and display them on the screen. bmp supports 16-bit / 24-bit / 32-bit.
  4. * [url=home.php?mod=space&uid=821650]@N[/url] jpg only supports JFIF format, you can open with windows drawing and save it as this format.
  5. * @n The pictures of this demo are stored under example-> SD-> picture; just copy the picture folder to the SD card
  6. * @n This demo supports mainboard ESP8266, FireBeetle-M0, MAGE2560, and UNO.
  7. * @copyright Copyright (c) 2010 DFRobot Co. Ltd ([url]http://www.dfrobot.com[/url])
  8. * @licence The MIT License (MIT)
  9. * @author [YeHangYu] ([email]hangyu.ye@dfrobot.com[/email])
  10. * @version V0.1
  11. * @date 2020-03-20
  12. * @url [url]https://github.com/DFRobot/DFRobot_GDL[/url]
  13. */
  14. #include <SD.h>
  15. #include <SPI.h>
  16. #include "DFRobot_GDL.h"
  17. #include "DFRobot_Picdecoder_SD.h"
  18. #include "DFRobot_SpeechSynthesis.h"
  19. #include "DFRobot_ASR.h"
  20. DFRobot_SpeechSynthesis_I2C ss;
  21. DFRobot_Picdecoder_SD decoder;
  22. DFRobot_ASR  asr;
  23. //Custom communication pins
  24. /*FireBeetle-M0*/
  25. #if defined ARDUINO_SAM_ZERO
  26. #define TFT_DC  7
  27. #define TFT_CS  5
  28. #define TFT_RST 6
  29. #define TFT_SD  3
  30. /*ESP32 and ESP8266*/
  31. #elif defined(ESP32) || defined(ESP8266)
  32. #define TFT_DC  25
  33. #define TFT_CS  14
  34. #define TFT_RST 26
  35. #define TFT_SD  13
  36. /* AVR series mainboard */
  37. #else
  38. #define TFT_DC  2
  39. #define TFT_CS  3
  40. #define TFT_RST 4
  41. #define TFT_SD  6
  42. #endif
  43. /**
  44. * @brief Constructor Constructor of hardware SPI communication
  45. * @param dc Command/data line pin for SPI communication
  46. * @param cs Chip select pin for SPI communication
  47. * @param rst reset pin of the screen
  48. */
  49. //DFRobot_ST7789_240x240_HW_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);
  50. //DFRobot_ST7789_240x320_HW_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);
  51. DFRobot_ILI9341_240x320_HW_SPI  screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);
  52. //DFRobot_ILI9488_320x480_HW_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);
  53. /* M0 mainboard DMA transfer */
  54. //DFRobot_ST7789_240x240_DMA_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);
  55. //DFRobot_ST7789_240x320_DMA_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);
  56. //DFRobot_ILI9341_240x320_DMA_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);
  57. //DFRobot_ILI9488_320x480_DMA_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);
  58. /*
  59. *User-selectable macro-defined color
  60. *COLOR_RGB565_BLACK   COLOR_RGB565_NAVY    COLOR_RGB565_DGREEN   COLOR_RGB565_DCYAN
  61. *COLOR_RGB565_MAROON  COLOR_RGB565_PURPLE  COLOR_RGB565_OLIVE    COLOR_RGB565_LGRAY
  62. *COLOR_RGB565_DGRAY   COLOR_RGB565_BLUE    COLOR_RGB565_GREEN    COLOR_RGB565_CYAN  
  63. *COLOR_RGB565_RED     COLOR_RGB565_MAGENTA COLOR_RGB565_YELLOW   COLOR_RGB565_ORANGE           
  64. *COLOR_RGB565_WHITE
  65. */
  66. File root;
  67. int i;
  68. int j;
  69. void setup()
  70. {
  71.   //Initialize the serial port
  72.   Serial.begin(115200);
  73.   //Initialize screen
  74.   ss.begin();
  75.   screen.begin();
  76.   //Initialize the SD card, wait until the initialization is successful
  77.   asr.begin(PASSWORD);
  78.   asr.addCommand("xiao tian xiao tian",0);
  79.   asr.addCommand("xia yi ge",1);
  80.   asr.addCommand("shang yi ge",2);
  81.   //开始识别
  82.   asr.start();
  83.   while(1)
  84.   {
  85.     if (SD.begin(/*sdcs=*/TFT_SD))
  86.     {
  87.       Serial.println("initialization done.");
  88.       break;
  89.     }
  90.     Serial.println("initialization failed!");
  91.   }
  92.   decoder.drawPicture(/*filename=*/"/picture/0.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  93.   ss.speak(F("云天电子相册"));
  94.   
  95. }
  96. void loop()
  97. {
  98.   j=asr.read();
  99.   switch(j)            //判断识别内容,在有识别结果的情况下asr.read()会返回识别到的词条编号,否则返回-1
  100.   {
  101.     case 0:                     //若是唤醒指令“小天 小天”
  102.        switch(random(0,5))        
  103.          {
  104.           case 0:
  105.             ss.speak(F("嗯"));
  106.             break;
  107.           case 1:
  108.             ss.speak(F("我在"));
  109.             break;
  110.           case 2:
  111.             ss.speak(F("在听"));
  112.             break;
  113.           case 3:
  114.             ss.speak(F("来了"));
  115.             break;
  116.           case 4:
  117.             ss.speak(F("您说"));
  118.             break;
  119.           case 5:
  120.             ss.speak(F("在了"));
  121.             break;
  122.          }
  123.      break;
  124.       
  125.     case 1:  
  126.       if(i<4)
  127.         {
  128.           i++;
  129.         }
  130.       else
  131.       {
  132.         i=0;
  133.       }
  134.       break;
  135.     case 2:  
  136.       if(i>0)
  137.         {
  138.           i--;
  139.         }
  140.       else
  141.       {
  142.         i=5;
  143.       }
  144.       break;
  145.   }
  146.   if(j !=-1 && j!=0)
  147.   {
  148.     switch(i)
  149.     {
  150.       
  151.     case 0:
  152.       decoder.drawPicture(/*filename=*/"/picture/1.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  153.       ss.speak(F("每一天在成长"));
  154.       break;
  155.     case 1:                    
  156.       decoder.drawPicture(/*filename=*/"/picture/2.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  157.       ss.speak(F("北京火车站前"));
  158.       break;
  159.     case 2:                    
  160.       decoder.drawPicture(/*filename=*/"/picture/3.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  161.       ss.speak(F("运动小健将"));
  162.       break;
  163.     case 3:                    
  164.       decoder.drawPicture(/*filename=*/"/picture/4.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  165.       ss.speak(F("海中美人鱼"));
  166.       break;
  167.     case 4:                    
  168.       decoder.drawPicture(/*filename=*/"/picture/5.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  169.       ss.speak(F("方便面也吃的香"));
  170.       break;
  171.   }
  172. }
  173. }
  174. //For decoding function calling, the function of this function is to draw a pixel on the screen
  175. void screenDrawPixel(int16_t x, int16_t y, uint16_t color)
  176. {
  177.   //Draw a point on the screen
  178.   screen.writePixel(x,y,color);
  179. }
复制代码




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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail