【开个空调】语音识别+红外发射
废话少说,直接上空调板子:YAPOF3。红外接收发射模块用的某宝上发现的YF-33(遗憾解码还没搞清楚,不然做个lirc.conf功能才多)。最后是语音识别用的幻尔的,某宝自然也有,它是个i2c的接口。


本篇胡说八道其实纯粹为了留个地方以后知道怎么在python脚本里面写串口指令。接下来就顺带着讲一下全流程吧。
1. 先把幻尔的语音模块里面录好几个要说的话。
# initiate_yuyin.py
# encoding: utf-8
'''
Company: 深圳市幻尔科技有限公司
官网:hiwonder.com
日期:2019/9/20
by Aiden
'''
'''* 只能识别汉字,将要识别的汉字转换成拼音字母,每个汉字之间空格隔开,比如:幻尔科技 --> huan er ke ji* 最多添加50个词条,每个词条最长为79个字符,每个词条最多10个汉字* 每个词条都对应一个识别号(1~255随意设置)不同的语音词条可以对应同一个识别号,* 比如“幻尔科技”和“幻尔”都可以将识别号设置为同一个值* 模块上的STA状态灯:亮起表示正在识别语音,灭掉表示不会识别语音,当识别到语音时状态灯会变暗,或闪烁,等待读取后会恢复当前的状态指示
'''
#使用例程
import smbus
import time
import numpyclass ASR:# Global Variablesaddress = Nonebus = NoneASR_RESULT_ADDR = 100#识别结果存放处,通过不断读取此地址的值判断是否识别到语音,不同的值对应不同的语音ASR_WORDS_ERASE_ADDR = 101#擦除所有词条ASR_MODE_ADDR = 102#识别模式设置,值范围1~3#1:循环识别模式。状态灯常亮(默认模式)#2:口令模式,以第一个词条为口令。状态灯常灭,当识别到口令词时常亮,等待识别到新的语音,并且读取识别结果后即灭掉#3:按键模式,按下开始识别,不按不识别。支持掉电保存。状态灯随按键按下而亮起,不按不亮ASR_ADD_WORDS_ADDR = 160#词条添加的地址,支持掉电保存def __init__(self, address, bus=1):self.address = addressself.bus = smbus.SMBus(bus)def readByte(self):return self.bus.read_byte(self.address)def writeByte(self, val):value = self.bus.write_byte(self.address, val)if value != 0:return Falsereturn Truedef writeData(self, reg, val):self.bus.write_byte(self.address, reg)self.bus.write_byte(self.address, val)def getResult(self):if ASR.writeByte(self, self.ASR_RESULT_ADDR):return -1value = self.bus.read_byte(self.address)return value'''* 添加词条函数,* idNum:词条对应的识别号,1~255随意设置。识别到该号码对应的词条语音时,* 会将识别号存放到ASR_RESULT_ADDR处,等待主机读取,读取后清0* words:要识别汉字词条的拼音,汉字之间用空格隔开** 执行该函数,词条是自动往后排队添加的。'''def addWords(self, idNum, words):buf = [idNum]for i in range(0, len(words)):buf.append(eval(hex(ord(words[i]))))self.bus.write_i2c_block_data(self.address, self.ASR_ADD_WORDS_ADDR, buf)time.sleep(0.05)def eraseWords(self):result = self.bus.write_byte_data(self.address, self.ASR_WORDS_ERASE_ADDR, 0)time.sleep(0.06)if result != 0:return Falsereturn Truedef setMode(self, mode):result = self.bus.write_byte_data(self.address, self.ASR_MODE_ADDR, mode)if result != 0:return Falsereturn Trueif __name__ == "__main__":addr = 0x79 #传感器iic地址asr = ASR(addr)if 1:asr.eraseWords()asr.setMode(1)asr.addWords(1,'miao le ge mi mi mi') # 唤醒词条在此asr.addWords(2,'da kai kong tiao zhi leng') # 打开空调制冷asr.addWords(3,'kong tiao zhi re kai') # 空调制热开asr.addWords(4,'guan bi kong tiao') # 关闭空调
2. 开启唤醒模式,操控空调。
# yuyin.py
# encoding: utf-8
import smbus
import time
import serialser = serial.Serial(port='/dev/ttyUSB0',baudrate=9600,parity=serial.PARITY_NONE,stopbits=serial.STOPBITS_ONE,bytesize=serial.EIGHTBITS,timeout=1)class ASR:# Global Variablesaddress = Nonebus = NoneASR_RESULT_ADDR = 100ASR_MODE_ADDR = 102ASR_ADD_WORDS_ADDR = 160#词条添加的地址,支持掉电保存def __init__(self, address, bus=1):self.address = addressself.bus = smbus.SMBus(bus)def readByte(self):return self.bus.read_byte(self.address)def writeByte(self, val):value = self.bus.write_byte(self.address, val)if value != 0:return Falsereturn Truedef writeData(self, reg, val):self.bus.write_byte(self.address, reg)self.bus.write_byte(self.address, val)def getResult(self):if ASR.writeByte(self, self.ASR_RESULT_ADDR):return -1value = self.bus.read_byte(self.address)return valuedef setMode(self, mode):result = self.bus.write_byte_data(self.address, self.ASR_MODE_ADDR, mode)if result != 0:return Falsereturn Trueif __name__ == "__main__":addr = 0x79 #传感器iic地址asr = ASR(addr)#来自串口指令那个图片给的发送地址。这儿就已经用了3个,这个模块一共才4个位置。arr_data2 = [0x01,0x06,0x00,0x01,0x00,0x02,0x59,0xCB]arr_data3 = [0x01,0x06,0x00,0x01,0x00,0x03,0x98,0x0B]arr_data4 = [0x01,0x06,0x00,0x01,0x00,0x01,0x19,0xCA]if 1:asr.setMode(2) #启动唤醒模式#asr.addWords(1,'miao le ge mi mi mi') # 唤醒#asr.addWords(2,'da kai kong tiao zhi leng') # 打开空调制冷#asr.addWords(3,'kong tiao zhi re kai') # 空调制热开#asr.addWords(4,'guan bi kong tiao') # 关闭空调while 1:data = asr.getResult()#print("result:", data)if data == 2:#echo -en '\x01\x06\x00\x01\x00\x02\x59\xCB' > /dev/ttyUSB0ser.write(serial.to_bytes(arr_data2))elif data == 3:#echo -en '\x01\x06\x00\x01\x00\x03\x98\x0B' > /dev/ttyUSB0ser.write(serial.to_bytes(arr_data3))elif data == 4:#echo -en '\x01\x06\x00\x01\x00\x01\x19\xCA' > /dev/ttyUSB0ser.write(serial.to_bytes(arr_data4))else:continuetime.sleep(0.5)相关文章:
【开个空调】语音识别+红外发射
废话少说,直接上空调板子:YAPOF3。红外接收发射模块用的某宝上发现的YF-33(遗憾解码还没搞清楚,不然做个lirc.conf功能才多)。最后是语音识别用的幻尔的,某宝自然也有,它是个i2c的接口。 本篇胡说八道其实纯粹为了留个…...
【hibernate validator】(二)声明和验证Bean约束
首发博客地址 https://blog.zysicyj.top/ 一、声明bean约束 1. 字段级别约束 不支持静态类型字段 验证引擎直接访问实例变量,不会调用属性的访问器 在验证字节码增强的对象时,应适用属性级别约束,因为字节码增库无法通过反射确定字段访问 pac…...
Redis持久化机制之RDB,AOF与混合AOF
Redis是一款高性能的NoSQL数据库,它的速度非常快,同时也支持多种持久化机制,其中最常用的是RDB和AOF,还有一种混合AOF方式。那么这些持久化机制到底是什么,有什么不同呢? RDB是Redis默认的持久化方式&…...
为啥外卖小哥宁愿600一月租电动车,也不花2、3千买一辆送外卖!背后的原因......
大家好!我是菜哥! 又到周末了,我们聊点非技术的东西。最近知乎“为何那些穿梭于城市大街小巷的外卖小哥,宁愿每月掏出600块租一辆电动车,也不愿意掏出2、3千买一辆呢?” 冲上热榜! 听起来有点“…...
分布式定时任务框架Quartz总结和实践(2)—持久化到Mysql数据库
本文主要介绍分布式定时任务框架Quartz集成SpringBoot持久化数据到Mysql数据库的操作,上一篇文章使用Quartz创建定时任务都是保存在内存中,如果服务重启定时任务就会失效,所以Quartz官方也提供将定时任务等信息持久化到Mysql数据库的功能&…...
Linux 服务器搭建配置,开发效率一飞冲天 - Centos 篇
大家好,我是比特桃。最近白嫖了一台 Centos 云服务器,用来做日常开发,特此记录一下搭建配置的过程。 我之前有篇文章是基于 Ubuntu 的:Linux 服务器搭建配置,开发效率一飞冲天 - Ubuntu 篇 如同个人电脑一样࿰…...
Day46|leetcode 139.单词拆分
leetcode 139.单词拆分 题目链接:139. 单词拆分 - 力扣(LeetCode) 视频链接:动态规划之完全背包,你的背包如何装满?| LeetCode:139.单词拆分_哔哩哔哩_bilibili 题目概述 给你一个字符串 s 和一…...
深入理解高并发编程 - Thread 类的 stop () 和 interrupt ()
stop() stop() 方法被用于停止线程。然而,需要注意的是,stop() 方法已经被标记为已废弃(deprecated),并且不推荐使用。这是因为使用该方法可能导致不可预料的问题和数据不一致性,因此它被认为是不安全的。…...
C语言之三子棋游戏实现篇
目录 主函数test.c 菜单函数 选择实现 游戏函数 (函数调用) 打印棋盘数据 打印展示棋盘 玩家下棋 电脑下棋 判断输赢 循环 test.c总代码 头文件&函数声明game.h 头文件的包含 游戏符号声明 游戏函数声明 game.h总代码 游戏函数ga…...
jupyter notebook 插件nbextensions的安装
安装步骤: 1、打开 jupyter notebook,新建一个 python 文件; 2、 分别输入以下代码,然后运行,出现 warning 不影响使用,如果出现 errors,则说明下载有问题: !python -m pip install…...
Spring boot 集成单元测试
1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency> 2. 3.编写测试类 package com.enterprise;import com.enterpr…...
基于C++的QT实现贪吃蛇小游戏
文章目录: 一:效果演示 二:实现思路 三:代码实现 widget.h widget.cpp main.cpp 一:效果演示 效果图◕‿◕✌✌✌ 代码下载 二:实现思路 通过按键控制蛇的移动,每吃一个商品蛇身就会加长…...
Spring Boot整合RabbitMQ之路由模式(Direct)
RabbitMQ中的路由模式(Direct模式)应该是在实际工作中运用的比较多的一种模式了,这个模式和发布与订阅模式的区别在于路由模式需要有一个routingKey,在配置上,交换机类型需要注入DirectExchange类型的交换机bean对象。…...
行式存储与列式存储
1.概述 数据处理大致可分为两大类,联机事务处理OLTP(on-line transaction processing) 和联机分析处理OLAP(on-line analytical processing)。 OLTP是传统关系型数据库的主要应用,用来执行一些基本的、日常的事务处理,比如数据库记录的增、删…...
windows上sqlserver的ldf日志文件和数据mdf文件分别放到不同的磁盘
之前我的windows上已安装好了sqlserver2017,有一个名为TestDb的数据库。ldf文件和mdf文件都一起放在D:\Database目录下。现在需要把ldf日志文件到E盘的database目录下。 重要的事情先说三遍 先停止网关(例如nginx)并备份数据库 先停止网关&am…...
vue3+uni——watch监听props中的数据(组件参数接收与传递defineProps、defineEmits)
案例说明 A页面引用的子组件B A页面 <template><view>//引用组件<serviceOrder change"change" :list"list" :current"type"></serviceOrder></view> </template><script setup>import serviceOrd…...
mybatis与spring集成与spring aop集成pagehelper插件
Mybatis与Spring的集成 Mybatis是一款轻量级的ORM框架,而Spring是一个全栈式的框架,二者的结合可以让我们更加高效地进行数据持久化操作。 Mybatis与Spring的集成主要有两种方式:使用Spring的Mybatis支持和使用Mybatis的Spring支持。 使用…...
Mybatis基础
...
TypeScript-- 配置Typescript环境(1)ts 转js,tsc --watch 实时编译
文章目录 安装Typescript判断是否有运行权限编写第一Typescript文件手动编译Ts文件转Js文件实时编译 安装Typescript npm install -g typescript 判断是否有运行权限 命令行运行 tsc -v 遇到了权限问题 用管理员打开window自带的powershell 运行如下指令即可: Set-…...
Dockerfile快速搭建自己专属的LAMP环境,生成镜像lamp:v1.1,并推送到私有仓库
环境: CentOS 7 Linux 3.10.0-1160.el7.x86_64 具体要求如下: (1)基于centos:6基础镜像; (2)指定作者信息; (3)安装httpd、mysql、mysql-server、php、ph…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
