ASRPRO语音识别模块

ASRPRO语音识别模块

PA4 ->LED 

IIC SSD1306 参考官网

SOFT IIC 与PCA9685模块通信

连线标识有误 ,注意调整 softiic.begin(sda,scl)?scl ,sda

详细代码从gitee下

ASR-PRO-U8G2: ASRPRO u8g2代码

简要说明 

唤醒  因每次唤醒词 唤醒,针对特定人或是防止误触,使用命令词记数进行启动,然后再命令

控制能力不足,通信UART连接电脑由电脑使用python进行控制

端口数不足,通过iic连接Pca9685进行扩展端口

内存flash不足,显示图片,通过电脑传图进行扩张(速度慢)

显示问题u8g2 ;gif mp4图片太大,转换为bdf格式压缩

pca9685 在asrpro中 使用 softiic 与 移植 arduino的pca9685程序

pca9685 iic通信 地址位 ADDR<<1|0  左移一位

#define I2C_WRITE 0

#define I2C_READ  1

否则通信地址错误

asrpro

通过UART与电脑连接,可以进行简单的交互

将STM32作为接口扩展,通过SPI或IIC进行端口扩展

ASRPRO常见问题

烧写:请是否连接

换好一点的USB转TTL 或是用官方的下载器

SSD1306 SPI代码

 ASRPRO端源码


 

#define ST7735_CS_PIN 2

#define ST7735_CS_GPIO_PIN gpio_pin_2

#define ST7735_DC_PIN 3

#define ST7735_DC_GPIO_PIN gpio_pin_3

#define ST7735_RST_PIN 1

#define ST7735_RST_GPIO_PIN gpio_pin_1

#define ST7735_SCK_PIN 5

#define ST7735_MOSI_PIN 6

// #define ST7735_SCK_PIN 6

// #define ST7735_MOSI_PIN 5



//#define ST7735_SCK_GPIO_PIN gpio_pin_5

//#define ST7735_MOSI_GPIO_PIN gpio_pin_6



/* 宏定义 --------------------------------------------------------------------*/



#define MOSI  ST7735_MOSI_PIN

#define SCK ST7735_SCK_PIN

#define DC ST7735_DC_PIN

#define CS ST7735_CS_PIN





#include "asr.h"

extern "C"{ void * __dso_handle = 0 ;}

#include "setup.h"

#include "myLib/luxiaoban.h"

#include "HardwareSerial.h"

#include "../U8G2/u8g2ASR.h"



   

int ndelay_interupt = 0;

bool stop_sign = 0;



u8g2_class u8g2c;



void hardware_init();

void emo_class();

void weather_class();

void draw_string(const char *s);

void PlayWeatherAndDate();

void process(); //主处理函数

bool ndelay(int wait);

void drawImage();

void Show_Time();





QueueHandle_t message1=NULL;

QueueHandle_t message2=NULL;

uint32_t rec_1 = 0;

uint32_t rec_2 = 0;

uint32_t var = 0;



unsigned char COMPUTER_CONTROL = 0; //电脑接管

int CUR_X=0;

int CUR_Y = 12;//set curlsor



int draw_color = 1;

int i = 0;

int data_k = 0;





uint32_t snid;



extern "C" uint8_t myfont1[];





   

char cmd[20];

int cmd_k = 0; //cmd count

int m_cmd = 0;





char buff[1024]  = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xfe,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,

0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,

0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,

0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,



0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,

0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,

0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xfe,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };







/*-------------------------------OLED---------*/

void Oled()

{

  while(1)

  {



    if(COMPUTER_CONTROL == 0){

      emo_class();

      Show_Time();

      weather_class();

     

    }

   

    if(xQueueReceive(message1,&rec_1,0)){

     

      ndelay_interupt = 0;

      stop_sign = 0;

     

      if(rec_1 == 'e' )

      {

        Serial.println("MSG emo");

        emo_class();

      }

     

      else if(rec_1 == 's' )

      {

        Serial.println("MSG string");

        draw_string(cmd);

      }

      else if(rec_1 == 'w' )

      {

        Serial.println("MSG weatherData");

        PlayWeatherAndDate();

      }

      else if(rec_1 == 'd')

      {

        Serial.println("msg display");

        drawImage();

      }



    }//queuemessage end



   

    // delay(1);

   

  }//while end

    vTaskDelete(NULL);

}



/*-------------------------------msg_process---------*/

void msg_Process(char * cmd){



   if(cmd[1] == 'I')  //send imag data

    {

      Serial.print("recv I");

      i = 1024;

    }

    else if(cmd[1] == 'D')  //display imag data

    {

      Serial.print("recv D");

      m_cmd = 'd';

      ndelay_interupt = 1;

      var = xQueueSend(message1,&m_cmd,0);

     

    }

    else if(cmd[1] == '5')  //show str

    {

      Serial.print("recv 5");

     

      cmd[cmd_k-2] =0;

     

      m_cmd = 's';

      ndelay_interupt = 1;

     

      var = xQueueSend(message1,&m_cmd,0);

    }

    else if(cmd[1] == 'W') //play weather

    {

      Serial.print("recv 4");

      m_cmd = 'w';

      ndelay_interupt = 1;

      var = xQueueSend(message1,&m_cmd,0);

      //PlayWeatherAndDate();

    }

    else if(cmd[1] =='E')  //play emo

    {

      Serial.print("recv 3");

      m_cmd = 'e';

      ndelay_interupt =1;

      var = xQueueSend(message1,&m_cmd,0);

      //emo_class();

    }

    else if(cmd[1] == 'T') //show Time

    {

     

    }

    else

    {

      Serial.println("no cmd");

    }



  //command select

    if(strcmp(cmd,"weather")==0)  //4

    {

       Serial.println("play weather");

        m_cmd = 'w';

        ndelay_interupt = 1;

        var = xQueueSend(message1,&m_cmd,0);

        //PlayWeatherAndDate();

    }

    else if(strcmp(cmd,"emo") == 0)  //3

    {

      Serial.println("play emo");

        m_cmd = 'e';

        ndelay_interupt = 1;

        var = xQueueSend(message1,&m_cmd,0);

      //emo_class();

    }

                      //command end

}





/*-------------------------------ASR---------*/

  //{speak:娇娇-邻家女声,vol:10,speed:10,platform:haohaodada}

  //{playid:10001,voice:天问五幺唤醒我。}

  //{playid:10002,voice:记得叫醒我哦}

  //{ID:0,keyword:"唤醒词",ASR:"天问五幺",ASRTO:"哎 我在"}



void ASR_CODE()

{

  //emo_tst(&u8g2);

  //{ID:500,keyword:"唤醒词",ASR:"小鹿同学",ASRTO:"哎 我在呢"}

  //{ID:501,keyword:"唤醒词",ASR:"小鹿小鹿",ASRTO:"哎"}

  //{ID:506,keyword:"命令词",ASR:"关灯",ASRTO:"好的"}

  if(snid == 503){





  }

  //{ID:505,keyword:"命令词",ASR:"开灯",ASRTO:"好的"}

  else if(snid == 505){

    //luxiaoban_digital_write(0,0);

    Serial.println("开灯");

    digitalWrite(4,1);

   

  }

  if(snid == 506){

    Serial.println("关灯");

    digitalWrite(4,0);

   

    //luxiaoban_digital_write(0,1);

  }

  //{ID:1,keyword:"命令词",ASR:"开机",ASRTO:"好的"}

  else if(snid == 1){

    Serial.println("开机");

    //luxiaoban_digital_write(0,1);

  }



  //{ID:2,keyword:"命令词",ASR:"关机",ASRTO:"好的"}

  else if(snid == 2){

    Serial.println("关机");

  //luxiaoban_digital_write(0,1);

  }

  //{ID:3,keyword:"命令词",ASR:"播放音乐",ASRTO:"好的"}

  else if(snid == 3){

    Serial.println("播放音乐");

  }

  //{ID:4,keyword:"命令词",ASR:"天气",ASRTO:"好的"}

  else if(snid == 4){

    Serial.println("weather");

    //luxiaoban_digital_write(0,1);

  }

  //{ID:5,keyword:"命令词",ASR:"时间",ASRTO:"好的"}

  else if(snid == 5){

    Serial.println("时间");

    //luxiaoban_digital_write(0,1);

  }











}







   



char schar;

void process()  //serial process

{

  while(1)

  {

       

        while(Serial.available()> 0 )

        {

          COMPUTER_CONTROL = 1;

         

          schar = Serial.read();

        

          //Serial.println(schar);  //important?

         

         

          if(i != 0) {  //recive data

            buff[data_k] = schar;

            data_k = data_k + 1;

            i = i -1;

            cmd_k = 0;

           

            Serial.print("i = ");

            Serial.print(i);

           

          }

           

          else{

           

            cmd[cmd_k] = schar;

            cmd_k = cmd_k +1;

            if(cmd[cmd_k-1] == '\n')

            {

              cmd[cmd_k-1] = 0;

              Serial.println(cmd);  //IMPORTANT?

              //draw_string(cmd);

             

                //接收协议 M开头  操作码OP 附加信息AD M结尾

                //OP = 0 命令 1 数据

                //AD OP =1 数据长度

                if(cmd[0]== 'M' & cmd[cmd_k-2]=='M' )

                {

                  Serial.println("in xiyi");

                  Serial.println(cmd[1]);

                 

                  msg_Process(cmd);

     

                    



                     

             

            }  // end  cmd[0]== 'M' 

            cmd_k = 0;

            } //end  '\n'

          }  //end if i !=0

        } //end  Serial.Avalible

        delay(2);  // important error no recv

  }//end while(1)

  vTaskDelete(NULL);

}





//创建线程

void hardware_init(){

  message1=xQueueCreate(5,4);

  message2=xQueueCreate(5,4);



  xTaskCreate(process,"process",256,NULL,4,NULL);

  xTaskCreate(Oled,"oled",256,NULL,4,NULL);



  vTaskDelete(NULL);

}









void emo_class()

{

  ndelay_interupt = 0;

  int draw_color = 1;

  u8g2c.setFont(myfont1);

  u8g2c.setColorIndex(draw_color);

  for(int m = 0;m<1;m++)

    { int k = 0;

      for(int i = 0;i<30;i++)

      {

       

       

        u8g2c.clearBuffer();

       

        u8g2c.drawGlyph(34,60,96+k%6);

        if(ndelay(100))

           return ;

        

        u8g2c.sendBuffer();

        k = k+1;

       

      }

  }

  // vTaskDelete(NULL);

}



void weather_class(void)

{

//天气

  ndelay_interupt = 0;

  int draw_color = 1;

  u8g2c.setColorIndex(draw_color);

  u8g2c.setFont(u8g2_font_open_iconic_weather_6x_t);

  for(int m = 0;m<5;m++)

    { int k = 0;



      for(int i = 0 ;i<5;i ++)

      {

      

          u8g2c.clearBuffer();

          u8g2c.drawGlyph(30,60,65+k%5);

          if(ndelay(100))

            return ;

          u8g2c.sendBuffer();

          k = k+1;

         

         

       // Serial.print(k);

        k = k+1;

       

      }

    }

}





void Show_Time()

{

    u8g2c.setColorIndex(draw_color);

    u8g2c.setFont(u8g2_font_tenfatguys_tn);

    u8g2c.clearBuffer();

    u8g2c.drawStrX2(20,40,"11:20");

    if(ndelay(100))

      return ;

    u8g2c.sendBuffer();

}



















void setup()

{



//Serial 0

  setPinFun(13,SECOND_FUNCTION);

  setPinFun(14,SECOND_FUNCTION);

  Serial.begin((9600));





  Serial.println("setup");



//u8g2 初始化

//      u8g2Init(&u8g2);

  u8g2c.u8g2_init();





pinMode(20,output); //pc4

pinMode(4,output);  //pa4

setPinFun(4,FIRST_FUNCTION);

              

        xTaskCreate(hardware_init,"hardware_init",256,NULL,100,NULL);



       



}







void PlayWeatherAndDate()

{

  unsigned char r = 0;





  for(int i = 0;i<100;i ++)

  {

    r = r % 40;

  u8g2c.setColorIndex(draw_color);



  u8g2c.clearBuffer();

  u8g2c.setFont(u8g2_font_8x13B_tf);

  u8g2c.drawStr(40,60, "12月20日");



  u8g2c.setFont(u8g2_font_open_iconic_weather_4x_t);

  u8g2c.drawGlyph(65,40,65);



  u8g2c.drawCircle(30,30,r );



  u8g2c.sendBuffer();



  if(ndelay(10))

    return ;

  r = r+1;

  }







}



//draw string

void draw_string(const char *s) {

  // assign default color value

  int draw_color = 1;

  u8g2c.setColorIndex(draw_color);

  u8g2c.setFont(u8g2_font_8x13B_tf);

   

    u8g2c.clearBuffer();

    u8g2c.drawStr(0,12, s);

    u8g2c.sendBuffer();

   



  if(ndelay(1000))

  return ;



}





void interrupt(){

  ndelay_interupt = 1;

}





bool ndelay(int wait)

{

  int w = wait;

  while(w >0)

  {

    if(ndelay_interupt == 1  )

    {

      //ndelay_interupt = 0;

      stop_sign = 1;

      Serial.println("ndelay interrup");

     

      return 1;

    }

    delay(1);

    w= w-1;

  }

  return 0;

}



void drawImage()

{



  u8g2c.drawBitmap(0, 0, 16,64, buff); //right 128/8 X64

  u8g2c.sendBuffer();

  ndelay(1000);



}





















    //if(xQueueReceive(message2,&rec_2,0)){

    //  Serial.println(rec_2);



























电脑端PY源码

import serial

import threading

import time

from PIL import Image

import datetime

import json

import requests







img = ''

##with Image.open(r"tst2.png") as im:

##    img = im.tobytes()

##    im.show()

   

##print(img)



##img = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x07\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x01\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x07\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x1f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x1f\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x07\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x01\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

print("image len:",len(img))





def get_data(): ##https://baijiahao.baidu.com/s?id=1769484471382177983&wfr=spider&for=pc

    now = datetime.datetime.now()

    h = int(now.strftime("%M"))

    m = int(now.strftime("%M"))

    return [h,m]



def get_weather(): ##https://blog.csdn.net/gschen_cn/article/details/131886954

    url = 'http://t.weather.sojson.com/api/weather/city/'

    response = requests.get(url+'101280101')

    d = response.json()

    print( d["data"]["forecast"][0]["type"])

   

    pass



   

   





##处理信息

def recv_msg(msg):

    if msg == '开机':

        print("msg is boot")

        pass

    if msg == '关机':

        print("msg is shutdown")

        pass

    if msg == '播放音乐':

        pass

   



##print(img)



sr = serial.Serial("COM12",9600,timeout = 0.1)

##sr.baudrate = 9600

##sr.bytesize = 8

##sr.parity = 'N'

##sr.stopbits = 1



time.sleep(3)

sr.set_buffer_size(2,2)





def rec_thread():

    while(1):

        data = ''

        if(sr.inWaiting()>0):

            print("receive:<------",end = '')

            data = sr.read(sr.inWaiting())

            print(str(data))

            s1 = str(data.decode("gb2312"))

            print(s1)

##            if(s1 == '开灯\r\n'):

##                print("is boot")

##            else:

##                print("is kaiden")

           

            recv_msg(s1[0:-2])

            time.sleep(0.1)

           

            print("receive end//")





def send_imag():

   

    sr.write("MIM\n".encode("utf-8"))



    send_num = 256



    k = 0;

    for i in range(int(len(img)/send_num)+1):

        sr.write(img[k:k+send_num])

        print("send---->:",img[k:k+send_num])

        k = k + send_num

        sr.flush()

        print("send -----------512")

        time.sleep(0.5)



    sr.write("MDM\n".encode("utf-8"))

   

           



if __name__ == "__main__":

    t1 = threading.Thread(target = rec_thread)

    t1.start()



   

    get_weather()

   



    while(1):

        pass

##        a = input("exit:q")

##        if(a == 'q'):

##            exit()

####            break;

##        sr.write((a+'\n').encode("utf-8"))



    print("---------")













   

   

   

PCA9685代码

使用asrpro自带的asr_softiic.h 和 arduino Adafruit_PWMServoDriver驱动库

修改处

softiic.start(_i2caddr<<1|0); // 写 0 ,读 1 (地址要左移一位

注释requestfrom ; return 0

#include "asr.h"

extern "C"{ void * __dso_handle = 0 ;}

#include "setup.h"

#include "HardwareSerial.h"

#include "asr_softiic.h"



uint32_t snid;

void hardware_init();

void LED();

void ASR_CODE();



#define PCA9685_SUBADR1 0x2

#define PCA9685_SUBADR2 0x3

#define PCA9685_SUBADR3 0x4



#define PCA9685_MODE1 0x0

#define PCA9685_PRESCALE 0xFE



#define LED0_ON_L 0x6

#define LED0_ON_H 0x7

#define LED0_OFF_L 0x8

#define LED0_OFF_H 0x9



#define ALLLED_ON_L 0xFA

#define ALLLED_ON_H 0xFB

#define ALLLED_OFF_L 0xFC

#define ALLLED_OFF_H 0xFD





class Adafruit_PWMServoDriver {

 public:

  Adafruit_PWMServoDriver(uint8_t addr = 0x40);

  void begin(void);

  void reset(void);

  void setPWMFreq(float freq);

  void setPWM(uint8_t num, uint16_t on, uint16_t off);

  void setPin(uint8_t num, uint16_t val, bool invert=false);



 private:

  uint8_t _i2caddr;



  uint8_t read8(uint8_t addr);

  void write8(uint8_t addr, uint8_t d);

};











// class MySoftIIC

// {

//   public:

//   void begin(){softiic.begin(0,1);}

//   void stop(){softiic.stop();}

//   void write(uint8_t d){softiic.write(d);}

//   uint8_t read(bool b ){softiic.read(b);}

//   void requestFrom(uint8_t addr,uint8_t d){};



//   int start(uint8_t addr){return softiic.start(addr<<1|0);}

//   void beginTransmission(uint8_t addr){start(addr);}

//   void stop(){softiic.stop();}

// };





// MySoftIIC WIRE;





// Set to true to print some debug messages, or false to disable them.

#define ENABLE_DEBUG_OUTPUT false



Adafruit_PWMServoDriver::Adafruit_PWMServoDriver(uint8_t addr) {

  _i2caddr = addr;

}



void Adafruit_PWMServoDriver::begin(void) {

 softiic.begin(0,1);

 reset();

}





void Adafruit_PWMServoDriver::reset(void) {

 write8(PCA9685_MODE1, 0x0);

}



void Adafruit_PWMServoDriver::setPWMFreq(float freq) {

  //Serial.print("Attempting to set freq ");

  //Serial.println(freq);

  freq *= 0.9;  // Correct for overshoot in the frequency setting (see issue #11).

  float prescaleval = 25000000;

  prescaleval /= 4096;

  prescaleval /= freq;

  prescaleval -= 1;

  if (ENABLE_DEBUG_OUTPUT) {

    Serial.print("Estimated pre-scale: "); Serial.println(prescaleval);

  }

  uint8_t prescale = floor(prescaleval + 0.5);

  if (ENABLE_DEBUG_OUTPUT) {

    Serial.print("Final pre-scale: "); Serial.println(prescale);

  }



  uint8_t oldmode = read8(PCA9685_MODE1);

  uint8_t newmode = (oldmode&0x7F) | 0x10; // sleep

  write8(PCA9685_MODE1, newmode); // go to sleep

  write8(PCA9685_PRESCALE, prescale); // set the prescaler

  write8(PCA9685_MODE1, oldmode);

  delay(5);

  write8(PCA9685_MODE1, oldmode | 0xa1);  //  This sets the MODE1 register to turn on auto increment.

                                          // This is why the beginTransmission below was not working.

  //  Serial.print("Mode now 0x"); Serial.println(read8(PCA9685_MODE1), HEX);

}



void Adafruit_PWMServoDriver::setPWM(uint8_t num, uint16_t on, uint16_t off) {

  //Serial.print("Setting PWM "); Serial.print(num); Serial.print(": "); Serial.print(on); Serial.print("->"); Serial.println(off);



  softiic.start(_i2caddr<<1|0);

  softiic.write(LED0_ON_L+4*num);

  softiic.write(on);

  softiic.write(on>>8);

  softiic.write(off);

  softiic.write(off>>8);

  softiic.stop();

}



// Sets pin without having to deal with on/off tick placement and properly handles

// a zero value as completely off.  Optional invert parameter supports inverting

// the pulse for sinking to ground.  Val should be a value from 0 to 4095 inclusive.

void Adafruit_PWMServoDriver::setPin(uint8_t num, uint16_t val, bool invert)

{

  // Clamp value between 0 and 4095 inclusive.

  if(val > 4095)

    val = 4095;

  if (invert) {

    if (val == 0) {

      // Special value for signal fully on.

      setPWM(num, 4096, 0);

    }

    else if (val == 4095) {

      // Special value for signal fully off.

      setPWM(num, 0, 4096);

    }

    else {

      setPWM(num, 0, 4095-val);

    }

  }

  else {

    if (val == 4095) {

      // Special value for signal fully on.

      setPWM(num, 4096, 0);

    }

    else if (val == 0) {

      // Special value for signal fully off.

      setPWM(num, 0, 4096);

    }

    else {

      setPWM(num, 0, val);

    }

  }

}



uint8_t Adafruit_PWMServoDriver::read8(uint8_t addr) {

  softiic.start(_i2caddr<<1|0);

  softiic.write(addr);

  softiic.stop();



  //softiic.requestFrom((uint8_t)_i2caddr, (uint8_t)1);

  //return softiic.read();

  return 0;

}



void Adafruit_PWMServoDriver::write8(uint8_t addr, uint8_t d) {

  softiic.start(_i2caddr<<1|0);

  softiic.write(addr);

  softiic.write(d);

  softiic.stop();

}







Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();



//--------------------------------------------------------



///**************************************************************

bool bl = 0;

int i=0;

void LED(){

  while (1) {

   

    //扫描设备

    for(int i = 1;i<0x7f;i++)

    {

      // int val = softiic.start(i<<1 | 0);

      // softiic.stop();

      // Serial.print(i,HEX);

      // Serial.print("ox ");

      // Serial.println(val,HEX);

      pwm.begin();

      pwm.setPWMFreq(1600);

      pwm.setPin(4,i*46,0);

      delay(100);

     

    }

   



  }

  vTaskDelete(NULL);

}

//------------------------------------------------







void setup()

{



  Serial.begin(9600);



   delay(100);

  //softiic.begin(0,1);





    pinMode(4,output);

  setPinFun(4,FIRST_FUNCTION);

  digitalWrite(4,0);







  //{speak:小蝶-清新女声,vol:10,speed:10,platform:haohaodada}

  //{playid:10001,voice:欢迎使用语音助手,用天问五幺唤醒我。}

  //{playid:10002,voice:我退下了,用天问五幺唤醒我}

  //{ID:0,keyword:"唤醒词",ASR:"天问五幺",ASRTO:"我在"}

  //{ID:1,keyword:"命令词",ASR:"打开灯光",ASRTO:"好的,马上打开灯光"}

  //{ID:2,keyword:"命令词",ASR:"关闭灯光",ASRTO:"好的,马上关闭灯光"}



  xTaskCreate(hardware_init,"hardware_init",256,NULL,100,NULL);

}













//--------------------------------------------------------







//{ID:250,keyword:"命令词",ASR:"最大音量",ASRTO:"音量调整到最大"}

//{ID:251,keyword:"命令词",ASR:"中等音量",ASRTO:"音量调整到中等"}

//{ID:252,keyword:"命令词",ASR:"最小音量",ASRTO:"音量调整到最小"}

void hardware_init(){

  xTaskCreate(LED,"LED",256,NULL,4,NULL);

  vTaskDelete(NULL);

}









/*描述该功能...

*/

void ASR_CODE(){

  switch (snid) {

   case 1:

    //digitalWrite(4,0);

    break;

   case 2:

    //digitalWrite(4,1);

    break;

  }



}



















​

天问51 aspro ssd1306 SPI U8G2 类

接线引脚  MOSI PA5    SCK PA6     DC PA3    CS PA2





#define ST7735_CS_PIN 2

#define ST7735_CS_GPIO_PIN gpio_pin_2

#define ST7735_DC_PIN 3

#define ST7735_DC_GPIO_PIN gpio_pin_3

#define ST7735_RST_PIN 1

#define ST7735_RST_GPIO_PIN gpio_pin_1

// #define ST7735_SCK_PIN 5

// #define ST7735_MOSI_PIN 6

#define ST7735_SCK_PIN 6

#define ST7735_MOSI_PIN 5



//#define ST7735_SCK_GPIO_PIN gpio_pin_5

//#define ST7735_MOSI_GPIO_PIN gpio_pin_6



/* 宏定义 --------------------------------------------------------------------*/



#define MOSI  ST7735_MOSI_PIN

#define SCK ST7735_SCK_PIN

#define DC ST7735_DC_PIN

#define CS ST7735_CS_PIN





#include "asr.h"

extern "C"{ void * __dso_handle = 0 ;}

#include "setup.h"

#include "myLib/luxiaoban.h"

#include "HardwareSerial.h"

#include "../U8G2/u8g2.h"



void hardware_init();

void emo_class();

void weather_class();



//u8g2_t u8g2;





/my init

  void ssd1306_spi_init()

  {

  pinMode(CS,output);

        pinMode(DC,output);

        //pinMode(ST7735_RST_PIN,output);

        pinMode(SCK,output);

        pinMode(MOSI,output);

  }



uint8_t u8x8_avr_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)

  {

        // Re-use library for delays



        switch(msg)

        {

          //ms

                case U8X8_MSG_DELAY_MILLI:

        delay(1);

      break;

     

      //10 us

      case U8X8_MSG_DELAY_10MICRO:

        delay10us();

      break;

     

      //1 ns

           case U8X8_MSG_DELAY_NANO:

        delay1us();

      break;

     

    case U8X8_MSG_DELAY_100NANO:

      delay1us();

      break;

     

               case U8X8_MSG_GPIO_AND_DELAY_INIT:  // called once during init phase of u8g2/u8x8

        ssd1306_spi_init();

                       break;              // can be used to setup pins

               case U8X8_MSG_GPIO_SPI_CLOCK:        // Clock pin: Output level in arg_int

                       if(arg_int)

                               digitalWrite(SCK,1);

                       else

                               digitalWrite(SCK,0);

                       break;

               case U8X8_MSG_GPIO_SPI_DATA:        // MOSI pin: Output level in arg_int

                       if(arg_int)

                               digitalWrite(MOSI,1);

                       else

                               digitalWrite(MOSI,0);

                       break;

               case U8X8_MSG_GPIO_CS:        // CS (chip select) pin: Output level in arg_int

                       if(arg_int)

                               digitalWrite(CS,1);

                       else

                               digitalWrite(CS,0);

                       break;

               case U8X8_MSG_GPIO_DC:        // DC (data/cmd, A0, register select) pin: Output level in arg_int

      if(arg_int)

                               digitalWrite(DC,1);

                       else

                               digitalWrite(DC,0);

                       break;

              

               case U8X8_MSG_GPIO_RESET:     // Reset pin: Output level in arg_int



               default:

                 break;



        }

        return 1;

}





void u8g2Init(u8g2_t *u8g2)

{



  u8g2_Setup_ssd1306_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_avr_gpio_and_delay);

        u8g2_InitDisplay(u8g2);

        u8g2_SetPowerSave(u8g2, 0);

        u8g2_ClearBuffer(u8g2);

}



class u8g2_class

{

  public:

  u8g2_t u8g2;

  void u8g2_init()

  {

    u8g2_Setup_ssd1306_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_avr_gpio_and_delay);

        u8g2_InitDisplay(&u8g2);

        u8g2_SetPowerSave(&u8g2, 0);

        u8g2_ClearBuffer(&u8g2);

  }

  void sendBuffer(void) { u8g2_SendBuffer(&u8g2); }

  void clearBuffer(void) { u8g2_ClearBuffer(&u8g2); }   



  u8g2_uint_t drawGlyph(u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding) { return u8g2_DrawGlyph(&u8g2, x, y, encoding); }   

  u8g2_uint_t drawGlyphX2(u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding) { return u8g2_DrawGlyphX2(&u8g2, x, y, encoding); }   



  void setColorIndex(uint8_t color_index) { u8g2_SetDrawColor(&u8g2, color_index); }

  void setFont(const uint8_t  *font) {u8g2_SetFont(&u8g2, font); }

  void setFontMode(uint8_t  is_transparent) {u8g2_SetFontMode(&u8g2, is_transparent); }



      void setBitmapMode(uint8_t is_transparent)

      { u8g2_SetBitmapMode(&u8g2, is_transparent); }

    void drawBitmap(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t cnt, u8g2_uint_t h, const uint8_t *bitmap)

      { u8g2_DrawBitmap(&u8g2, x, y, cnt, h, bitmap); }

    void drawXBM(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap)

      { u8g2_DrawXBM(&u8g2, x, y, w, h, bitmap); }

    void drawXBMP(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap)

      { u8g2_DrawXBMP(&u8g2, x, y, w, h, bitmap); }





};







//创建线程

void hardware_init(){

  xTaskCreate(emo_class,"emo",256,NULL,4,NULL);

  vTaskDelete(NULL);

}



uint32_t snid;



extern "C" uint8_t myfont1[];



u8g2_class u8g2c;





void emo_class()

{

  int draw_color = 1;

  u8g2c.setFont(myfont1);

  u8g2c.setColorIndex(draw_color);

  while(1)

    { int k = 0;

      for(int i = 0;i<72;i++)

      {

       

       

        u8g2c.clearBuffer();

        u8g2c.drawGlyph(34,60,65+k%71);

        u8g2c.sendBuffer();

        k = k+1;

        delay(100);

      }

  }

   vTaskDelete(NULL);

}



void weather_class(void)

{

//天气

  int draw_color = 1;

  u8g2c.setColorIndex(draw_color);

  u8g2c.setFont(u8g2_font_open_iconic_weather_6x_t);

  while(true)

    { int k = 0;



      for(int i = 0 ;i<5;i ++)

      {

      

          u8g2c.clearBuffer();

          u8g2c.drawGlyph(30,60,65+k%5);

          u8g2c.sendBuffer();

          k = k+1;

          delay(100);

         

       // Serial.print(k);

        k = k+1;

       

      }

    }

}







//{ID:250,keyword:"命令词",ASR:"最大音量",ASRTO:"音量调整到最大"}

//{speak:小美-娇美女声,vol:20,speed:10}

//{playid:10001,voice:鹿唤醒我}

//{playid:10002,voice:我退}

void ASR_CODE()

{

  //emo_tst(&u8g2);

  //{ID:500,keyword:"唤醒词",ASR:"小鹿同学",ASRTO:"我在呢"}

  //{ID:501,keyword:"唤醒词",ASR:"小鹿小鹿",ASRTO:"AI"}

  if(snid == 503){

    luxiaoban_digital_write(0,0);

  }

  //{ID:505,keyword:"命令词",ASR:"请开灯",ASRTO:"灯已打开,亮度为最亮"}

  if(snid == 505){

    luxiaoban_digital_write(0,0);

  }

  //{ID:506,keyword:"命令词",ASR:"关灯",ASRTO:"灯已关闭"}

  if(snid == 506){

    luxiaoban_digital_write(0,1);

  }



}









void setup()

{

  Serial.begin((9600));



//u8g2 初始化

//      u8g2Init(&u8g2);

  u8g2c.u8g2_init();





              

        xTaskCreate(hardware_init,"hardware_init",256,NULL,100,NULL);



       



}



































asrpro U8G2 SPI

下载U8G2
安装VS CODE
项目在VSCODE中打开


下载U8G2源码,复制U8G2->CSRC下所有文件到 天问Block\asrpro\asr_pro_sdk\U8G2(新建文件平)

引脚定义 PA

VCC->3.3 GND ->GND  

#define MOSI  5
#define SCK 6
#define DC 3
#define CS 2


1将U8G2 CSRC下所有文件复制到asr_pro_sdk\U8G2

//U8G2       

source-file: U8G2/u8g2lib.cpp

source-file: U8G2/u8g2_bitmap.c

source-file: U8G2/u8g2_box.c

source-file: U8G2/u8g2_buffer.c

source-file: U8G2/u8g2_button.c

source-file: U8G2/u8g2_circle.c

source-file: U8G2/u8g2_cleardisplay.c

source-file: U8G2/u8g2_d_memory.c

source-file: U8G2/u8g2_d_setup.c

source-file: U8G2/u8g2_font.c

source-file: U8G2/u8g2_fonts.c

source-file: U8G2/u8g2_hvline.c

source-file: U8G2/u8g2_input_value.c

source-file: U8G2/u8g2_intersection.c

source-file: U8G2/u8g2_kerning.c

source-file: U8G2/u8g2_line.c

source-file: U8G2/u8g2_ll_hvline.c

source-file: U8G2/u8g2_message.c

source-file: U8G2/u8g2_polygon.c

source-file: U8G2/u8g2_selection_list.c

source-file: U8G2/u8g2_setup.c

source-file: U8G2/u8x8lib.cpp

source-file: U8G2/u8x8_8x8.c

source-file: U8G2/u8x8_byte.c

source-file: U8G2/u8x8_cad.c

source-file: U8G2/u8x8_capture.c

source-file: U8G2/u8x8_debounce.c

source-file: U8G2/u8x8_display.c

source-file: U8G2/u8x8_d_ssd1306_128x64_noname.c

source-file: U8G2/u8x8_fonts.c

source-file: U8G2/u8x8_gpio.c

source-file: U8G2/u8x8_input_value.c

source-file: U8G2/u8x8_message.c

source-file: U8G2/u8x8_selection_list.c

source-file: U8G2/u8x8_setup.c

source-file: U8G2/u8x8_string.c

source-file: U8G2/u8x8_u16toa.c

source-file: U8G2/u8x8_u8toa.c





//header file path.

include-path: U8G2

完整的source_file.prj文件

 天问Block\asrpro\asr_pro_sdk\projects\offline_asr_sample\project_file\source_file.prj

//source files.



//U8G2       

source-file: U8G2/u8g2lib.cpp

source-file: U8G2/u8g2_bitmap.c

source-file: U8G2/u8g2_box.c

source-file: U8G2/u8g2_buffer.c

source-file: U8G2/u8g2_button.c

source-file: U8G2/u8g2_circle.c

source-file: U8G2/u8g2_cleardisplay.c

source-file: U8G2/u8g2_d_memory.c

source-file: U8G2/u8g2_d_setup.c

source-file: U8G2/u8g2_font.c

source-file: U8G2/u8g2_fonts.c

source-file: U8G2/u8g2_hvline.c

source-file: U8G2/u8g2_input_value.c

source-file: U8G2/u8g2_intersection.c

source-file: U8G2/u8g2_kerning.c

source-file: U8G2/u8g2_line.c

source-file: U8G2/u8g2_ll_hvline.c

source-file: U8G2/u8g2_message.c

source-file: U8G2/u8g2_polygon.c

source-file: U8G2/u8g2_selection_list.c

source-file: U8G2/u8g2_setup.c

source-file: U8G2/u8x8lib.cpp

source-file: U8G2/u8x8_8x8.c

source-file: U8G2/u8x8_byte.c

source-file: U8G2/u8x8_cad.c

source-file: U8G2/u8x8_capture.c

source-file: U8G2/u8x8_debounce.c

source-file: U8G2/u8x8_display.c

source-file: U8G2/u8x8_d_ssd1306_128x64_noname.c

source-file: U8G2/u8x8_fonts.c

source-file: U8G2/u8x8_gpio.c

source-file: U8G2/u8x8_input_value.c

source-file: U8G2/u8x8_message.c

source-file: U8G2/u8x8_selection_list.c

source-file: U8G2/u8x8_setup.c

source-file: U8G2/u8x8_string.c

source-file: U8G2/u8x8_u16toa.c

source-file: U8G2/u8x8_u8toa.c

source-file: U8G2/myfont1.c







source-file: startup/asrpro_init.c

source-file: startup/asrpro_vtable.S

source-file: startup/asrpro_startup.S



source-file: system/asrpro_it.c

source-file: system/asrpro_system.c

source-file: system/platform_config.c

source-file: system/asrpro_handlers.c

source-file: system/baudrate_calibrate.c



source-file: components/assist/debug_time_consuming.c



source-file: components/freertos/croutine.c

source-file: components/freertos/event_groups.c

source-file: components/freertos/list.c

source-file: components/freertos/queue.c

source-file: components/freertos/stream_buffer.c

source-file: components/freertos/tasks.c

source-file: components/freertos/timers.c

source-file: components/freertos/portable/MemMang/heap_3.c



source-file: components/log/ci_log.c



source-file: components/flash_control/flash_control_src/ci_flash_data_info.c

source-file: components/flash_control/flash_control_src/flash_control_inner_port.c



source-file: components/player/audio_play/audio_play_api.c

source-file: components/player/audio_play/audio_play_decoder.c

source-file: components/player/audio_play/audio_play_process.c

source-file: components/player/audio_play/audio_play_os_port.c

source-file: components/player/audio_play/audio_play_device.c

source-file: components/player/audio_play/get_play_data.c



source-file: components/player/adpcm/adpcmdec.c

source-file: components/player/adpcm/adpcm.c



source-file: components/player/m4a/parse_m4a_atom_containers_port.c

source-file: components/player/m4a/parse_m4a_atom_containers.c



source-file: components/player/flacdec/bitstreamf.c

source-file: components/player/flacdec/flacdecoder.c

source-file: components/player/flacdec/tables.c



source-file: components/player/sonic/sonic.c





source-file: components/status_share/status_share.c



source-file: components/ci_nvdm/ci_nvdata_manage.c

source-file: components/ci_nvdm/ci_nvdata_port.c



source-file: components/cmd_info/command_file_reader.c

source-file: components/cmd_info/command_info.c

source-file: components/cmd_info/prompt_player.c



//source-file: components/audio_in_manage/iis_master_rx.c

//source-file: components/audio_in_manage/iis_slave.c

//source-file: components/audio_in_manage/audio_in_manage.c

source-file: components/audio_in_manage/audio_in_manage_inner.c







source-file: components/asr/asr_malloc_port.c

source-file: components/asr/asr_process_callback_decoder.c

source-file: components/asr/asr_process_callback.c

source-file: components/codec_manager/codec_manager.c

source-file: components/codec_manager/codec_manage_inner_port.c



source-file: components/msg_com/voice_module_uart_protocol_g1.c

source-file: components/msg_com/i2c_protocol_module.c

source-file: components/msg_com/voice_module_uart_protocol.c



source-file: components/led/color_light_control.c

source-file: components/led/led_light_control.c



//source-file: components/example/iic_test.c



source-file: components/audio_pre_rslt_iis_out/asrpro_audio_pre_rslt_out.c



source-file: driver/asrpro_chip_driver/src/asrpro_core_eclic.c

source-file: driver/asrpro_chip_driver/src/asrpro_core_timer.c

source-file: driver/asrpro_chip_driver/src/asrpro_dma.c

source-file: driver/asrpro_chip_driver/src/asrpro_codec.c

source-file: driver/asrpro_chip_driver/src/asrpro_pdm.c

source-file: driver/asrpro_chip_driver/src/asrpro_alc.c

source-file: driver/asrpro_chip_driver/src/asrpro_iisdma.c

source-file: driver/asrpro_chip_driver/src/asrpro_core_misc.c

source-file: driver/asrpro_chip_driver/src/asrpro_iis.c

source-file: driver/asrpro_chip_driver/src/asrpro_adc.c

source-file: driver/asrpro_chip_driver/src/asrpro_gpio.c

source-file: driver/asrpro_chip_driver/src/asrpro_iic.c

source-file: driver/asrpro_chip_driver/src/asrpro_pwm.c

source-file: driver/asrpro_chip_driver/src/asrpro_timer.c

source-file: driver/asrpro_chip_driver/src/asrpro_uart.c

//source-file: driver/asrpro_chip_driver/src/asrpro_inner_codec.c

source-file: driver/asrpro_chip_driver/src/asrpro_lowpower.c

source-file: driver/asrpro_chip_driver/src/asrpro_iwdg.c

source-file: driver/asrpro_chip_driver/src/asrpro_spiflash.c

source-file: driver/asrpro_chip_driver/src/asrpro_dtrflash.c



source-file: driver/boards/board.c

source-file: driver/boards/board_default.c



source-file: utils/dichotomy_find.c

source-file: utils/crc.c



source-file: projects/offline_asr_sample/src/main.c

source-file: projects/offline_asr_sample/src/system_hook.c

source-file: projects/offline_asr_sample/src/system_msg_deal.c

source-file: projects/offline_asr_sample/src/user_msg_deal.c

source-file: projects/offline_asr_sample/src/ci_ssp_config.c



source-file: projects/offline_asr_sample/src/wiring.c

source-file: projects/offline_asr_sample/src/CString/dtostrf.c

source-file: projects/offline_asr_sample/src/CString/itoa.c

source-file: projects/offline_asr_sample/src/CString/HardwareSerial.cpp

source-file: projects/offline_asr_sample/src/CString/Stream.cpp

source-file: projects/offline_asr_sample/src/CString/Print.cpp

source-file: projects/offline_asr_sample/src/CString/WString.cpp

source-file: components/ir_remote_driver/ir_remote_driver.c

source-file: ../asr.cpp

















library-file: $(LIBS_PATH)/libasr.a

library-file: $(LIBS_PATH)/libnewlib_port.a

library-file: $(LIBS_PATH)/libfreertos_port.a

library-file: $(LIBS_PATH)/libdsu.a

library-file: $(LIBS_PATH)/libflash_encrypt.a

library-file: $(LIBS_PATH)/libir_data.a





//header file path.

include-path: U8G2

include-path: driver/asrpro_chip_driver/inc

include-path: driver/boards

include-path: driver/third_device_driver/outside_codec

include-path: system

include-path: components/log

include-path: components/assist

include-path: components/freertos/include

include-path: components/freertos/portable/GCC/N307

include-path: components

include-path: components/asr

include-path: components/asr/asr_top

include-path: components/asr/asr_top/asr_top_inc

include-path: components/asr/decoder/decoder_inc

include-path: components/asr/vad_fe

include-path: components/asr/vad_fe/vad_fe_inc

include-path: components/asr/dnn

include-path: components/asr/dnn/dnn_inc

include-path: components/asr/cinn/cinn_inc

include-path: components/asr/npu/npu_inc

include-path: components/asr/nn_and_flash

include-path: components/asr/nn_and_flash/nn_and_flash_inc

include-path: components/fft







include-path: components/msg_com

include-path: components/led

include-path: components/player/audio_play

include-path: components/player/mp3lib/mp3pub

include-path: components/player/aaclib/aacpub

include-path: components/player/flacdec

include-path: components/player/m4a

include-path: components/player/adpcm

include-path: components/status_share

include-path: components/flash_control/flash_control_inc

include-path: components/flash_encrypt

include-path: components/codec_manager

include-path: components/ci_nvdm

include-path: components/cmd_info

include-path: components/sys_monitor

include-path: components/ota

include-path: components/audio_pre_rslt_iis_out

include-path: components/audio_in_manage

include-path: components/assist/SEGGER

include-path: components/assist/SEGGER/config

include-path: components/nuclear_com

include-path: components/audio_pre_rslt_iis_out

include-path: projects/offline_asr_sample/src

include-path: utils



include-path: projects/offline_asr_sample/src

include-path: projects/offline_asr_sample/src/CString

include-path: ../myLib



include-path: components/alg

include-path: components/alg/denoise

include-path: components/alg/beamforming

include-path: components/alg/dereverb

include-path: components/alg/alc_auto_switch

include-path: components/alg/basic_alg

include-path: components/alg/aec

include-path: components/alg/doa



include-path: components/ir_remote_driver

include-path: projects/offline_asr_sample/src/ir_src

U8G2目录位置与内容 

天问Block\asrpro\asr_pro_sdk\U8G2

说明: https://img-blog.csdnimg.cn/b6806dd0da414be8b596185df73c58da.png

​编辑

2 .添加源文件与头文件 
asr_pro_sdk\projects\offline_asr_sample\project_file\source_file.prj

3. asr_pro_sdk\projects\offline_asr_sample\project_file\rebuild.bat在集成终端中打开
运行./rebuild

主程序


 

#define ST7735_CS_PIN 2

#define ST7735_CS_GPIO_PIN gpio_pin_2

#define ST7735_DC_PIN 3

#define ST7735_DC_GPIO_PIN gpio_pin_3

#define ST7735_RST_PIN 1

#define ST7735_RST_GPIO_PIN gpio_pin_1

#define ST7735_SCK_PIN 6

#define ST7735_SCK_GPIO_PIN gpio_pin_5

#define ST7735_MOSI_PIN 5

#define ST7735_MOSI_GPIO_PIN gpio_pin_6



/* 宏定义 --------------------------------------------------------------------*/



#define MOSI  ST7735_MOSI_PIN

#define SCK ST7735_SCK_PIN

#define DC ST7735_DC_PIN

#define CS ST7735_CS_PIN





//#ifndef _ST7735_H

//#define _ST7735_H







//#include "twen_gfx.h"



#include "asr.h"

#include "setup.h"

#include "myLib/luxiaoban.h"



#include "../U8G2/u8g2.h"



//void delayMicroseconds(uint32_t us);



        volatile uint32_t * _cs_reg = NULL;

        volatile uint32_t * _rst_reg = NULL;

        volatile uint32_t * _dc_reg = NULL;  

        volatile uint32_t * _sck_reg = NULL;

        volatile uint32_t * _t_reg = NULL; 









uint32_t snid;



//SSD1306 回调函数1

u8g2_t u8g2;



extern "C" uint8_t myfont1[]; //��������

void emo_tst(u8g2_t *u8g2)

{

//emo ����

int draw_color = 1;

int k = 0;

  for(int i = 0;i<66;i++)

  {

    k = k+1;

    u8g2_SetDrawColor(u8g2,draw_color);





    u8g2_ClearBuffer(u8g2);

  //u8g2.setFont(u8g2_font_8x13B_tf);



  //u8g2_DrawStr(0,10,num(k));

    u8g2_SetFont(u8g2,myfont1);



    u8g2_DrawGlyph(u8g2,34,60,65+k%71);

    //u8g2.drawGlyphX2(0,0,65+k%45);

    u8g2_SendBuffer(u8g2);

    delay(100);

  }

}







void ssd1306_spi_init()

{

  pinMode(CS,output);

        pinMode(DC,output);

        //pinMode(ST7735_RST_PIN,output);

        pinMode(SCK,output);

        pinMode(MOSI,output);







}



uint8_t u8x8_avr_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)

{

        // Re-use library for delays



        switch(msg)

        {

          //ms

                case U8X8_MSG_DELAY_MILLI:

        delay(1);

      break;

     

      //10 us

      case U8X8_MSG_DELAY_10MICRO:

        delay10us();

      break;

     

      //1 ns

    

           case U8X8_MSG_DELAY_NANO:

        delay1us();

      break;

     



    case U8X8_MSG_DELAY_100NANO:

      delay1us();

      break;

     











               case U8X8_MSG_GPIO_AND_DELAY_INIT:  // called once during init phase of u8g2/u8x8

        ssd1306_spi_init();

                       break;              // can be used to setup pins

               case U8X8_MSG_GPIO_SPI_CLOCK:        // Clock pin: Output level in arg_int

                       if(arg_int)

                               digitalWrite(SCK,1);

                       else

                               digitalWrite(SCK,0);

                       break;

               case U8X8_MSG_GPIO_SPI_DATA:        // MOSI pin: Output level in arg_int

                       if(arg_int)

                               digitalWrite(MOSI,1);

                       else

                               digitalWrite(MOSI,0);

                       break;

               case U8X8_MSG_GPIO_CS:        // CS (chip select) pin: Output level in arg_int

                       if(arg_int)

                               digitalWrite(CS,1);

                       else

                               digitalWrite(CS,0);

                       break;

               case U8X8_MSG_GPIO_DC:        // DC (data/cmd, A0, register select) pin: Output level in arg_int

      if(arg_int)

                               digitalWrite(DC,1);

                       else

                               digitalWrite(DC,0);

                       break;

              

               case U8X8_MSG_GPIO_RESET:     // Reset pin: Output level in arg_int



               default:

                 break;



        }

        return 1;

}





void u8g2Init(u8g2_t *u8g2)

{



  u8g2_Setup_ssd1306_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_avr_gpio_and_delay);

        u8g2_InitDisplay(u8g2);

        u8g2_SetPowerSave(u8g2, 0);

        u8g2_ClearBuffer(u8g2);

       



}



void draw(u8g2_t *u8g2)

{

        u8g2_ClearBuffer(u8g2);

   u8g2_SetFontMode(u8g2, 1);

   u8g2_SetFontDirection(u8g2, 0);

   u8g2_SetFont(u8g2, u8g2_font_inb24_mf);

   u8g2_DrawStr(u8g2, 0, 20, "U");



   u8g2_SetFontDirection(u8g2, 1);

   u8g2_SetFont(u8g2, u8g2_font_inb30_mn);

   u8g2_DrawStr(u8g2, 21,8,"8");



   u8g2_SetFontDirection(u8g2, 0);

   u8g2_SetFont(u8g2, u8g2_font_inb24_mf);

   u8g2_DrawStr(u8g2, 51,30,"g");

   u8g2_DrawStr(u8g2, 67,30,"\xb2");



   u8g2_DrawHLine(u8g2, 2, 35, 47);

   u8g2_DrawHLine(u8g2, 3, 36, 47);

   u8g2_DrawVLine(u8g2, 45, 32, 12);

   u8g2_DrawVLine(u8g2, 46, 33, 12);



   u8g2_SetFont(u8g2, u8g2_font_4x6_tr);

   u8g2_DrawStr(u8g2, 1,54,"github.com/olikraus/u8g2");

         u8g2_SendBuffer(u8g2);

         delay(1000);

}





//u8g2_t u8g2;



//{ID:250,keyword:"命令词",ASR:"最大音量",ASRTO:"音量调整到最大"}

//{ID:251,keyword:"命令词",ASR:"中等音量",ASRTO:"音量调整到中等"}

//{ID:252,keyword:"命令词",ASR:"最小音量",ASRTO:"音量调整到最小"}

//{speak:小美-娇美女声,vol:20,speed:10}

//{playid:10001,voice:鹿唤醒我}

//{playid:10002,voice:我退}

void ASR_CODE()

{

  emo_tst(&u8g2);

  //{ID:500,keyword:"唤醒词",ASR:"小鹿同学",ASRTO:"我在呢"}

  //{ID:501,keyword:"唤醒词",ASR:"小鹿小鹿",ASRTO:"AI"}

  //{ID:502,keyword:"唤醒词",ASR:"你好小鹿",ASRTO:"请吩咐"}

  //{ID:503,keyword:"命令词",ASR:"开灯",ASRTO:"灯已打开,亮度为最亮"}

  if(snid == 503){

    luxiaoban_digital_write(0,0);

  }

  //{ID:504,keyword:"命令词",ASR:"打开灯光",ASRTO:"灯已打开,亮度为最亮"}

  if(snid == 504){

    luxiaoban_digital_write(0,0);

  }

  //{ID:505,keyword:"命令词",ASR:"请开灯",ASRTO:"灯已打开,亮度为最亮"}

  if(snid == 505){

    luxiaoban_digital_write(0,0);

  }

  //{ID:506,keyword:"命令词",ASR:"关灯",ASRTO:"灯已关闭"}

  if(snid == 506){

    luxiaoban_digital_write(0,1);

  }

  //{ID:507,keyword:"命令词",ASR:"关闭灯光",ASRTO:"灯光已关闭"}

  if(snid == 507){

    luxiaoban_digital_write(0,1);

  }

  //{ID:508,keyword:"命令词",ASR:"请关灯",ASRTO:"灯已关闭"}

  if(snid == 508){

    luxiaoban_digital_write(0,1);

  }

}









void setup()

{

  Serial.begin((9600));









        u8g2Init(&u8g2);

        draw(&u8g2);

       

        emo_tst(&u8g2);

              

       

       



}

void loop()

{



}



make时生成的文件在 asr_pro_sdk\projects\offline_asr_sample\project_file\build\objs下 

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值