Arduino温度检测警报结合Python语音识别播报

前几天学校搞课程设计发了一个Arduino Uno R3板子叫我们做项目。玩了一两天总算弄出一点成果,可能之前有嵌入式开发的基础,先用Proteus仿真出来,感觉效果还行。

所需要的材料: Arduino Uno R3 、 DS18B20温度传感器、 10K电位器、 4.7K电阻、 LCD1602显示屏、 扬声器、 LED(红)灯、 导线若干。

仿真图如下:

Arduino温度检测警报结合Python语音识别播报_第1张图片
*仿真中Arduino Uno R3板子不用接+5V和地,但是实物要记得接(板子上有标识)。仿真中LCD显示屏只有14个脚,但是实物有16个脚,多出的两个脚一个接+5V一个接地(自己研究哈,找找资料,动动脑筋)。
*

项目功能就是实时显示温度,温度超过33摄氏度后扬声器响,红灯亮。33度以下不响不亮(阈值可以自己改)下面是Arduino中的程序:

#include 
#include 
#define ONE_WIRE_BUS 7

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

float tempC = 0;
float tempF = 0;
float sinVal;
int toneVal;
unsigned long tepTimer;
const int ledPin = 6;

LiquidCrystal lcd(12,11,5,4,3,2);

void setup() {
  sensors.begin();		
  lcd.begin(16,2);
  lcd.clear();
  pinMode(3, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(6, OUTPUT);
  analogWrite(3,0);
  Serial.begin(9600);  
}

void loop() {
  sensors.requestTemperatures();
  tempC = sensors.getTempCByIndex(0);
  tempF = sensors.toFahrenheit(tempC);
  
  if (tempC>33){
    digitalWrite(ledPin,HIGH);
    for(int x=0;x<180;x++){
      sinVal = (sin(x*(3.1412/180)));
      toneVal = 2000+(int(sinVal*1000));
      tone(13, toneVal);
      delay(2);
   }
  }else {noTone(13);digitalWrite(ledPin,LOW);}

  delay(1000);
 
  Serial.println(tempC);
 
  lcd.setCursor(0,0);
  lcd.print("C: ");
  lcd.print(tempC);
  lcd.print("degrees");
  //lcd.setCursor(0,1);
  //lcd.print("F: ");
  //lcd.print(tempF);
  //lcd.print("degrees"); 
 }
 
 

你们仿真完可能会发现,显示屏会显示-127度,没关系,我实物连接后显示是正常的。

然后上面这两个就实现了温度实时监测和警报,下面我们来通过Python串口连接Arduino板来实现语音播报。

首先板子连接好电路,测试显示正常后(显示屏如果数字很暗的话调一下电位计)。用专门的线连接Arduino板和电脑,然后看电脑能否找到这个串口(这个自行解决,我第一次就检测到了,有些人不行,每个电脑都不同)。然后打开Arduino的脚本编辑器在Tools中勾选串口,并选择板子,然后将上面的程序烧录进去。最后打开Python,代码如下:

import serial
import os
import sys
import speech
import webbrowser

phrase = {"closeMainSystem" : "关闭"
        , "weather" : "温度"}
              
serialPort = "COM3"  #串口,我的是COM3,这里你们要自己改
bauRate = 9600   #波特率
ser = serial.Serial(serialPort, baudRate, timeout = 0.5)
print("参数设置:串口=%s , 波特率=%d" % (serialPort, baudRate))

def callback(phr, phrase):
    if phr == phrase["closeMainSystem"]:
        speech.say("人机交互关闭,谢谢使用")
        speech.stoplistening()
        sys.exit()
    elif phr == phrase["weather"]:
        speech.say("现在温度是" + str(sq) + "度")
        
while 1:
    sq = ser.readline()
    sq = sq.strip()
    print("温度:" + str(sq))
    phr == speech.input()
    callback(phr, phrase)
    speech.say("You said %s" % phr)

ser.close()


用的是Windows自带的语音助手,第一次运行可能要同意一些协议,照做就对了。然后就会启动语音助手,启动后对他说“温度”他就会语音播报从Arduino传过来的温度值,但是这个Python程序有个很不足的地方就是,它每识别一句话,他才会输出一行从Arduino传过来的温度值,所以大家要对它不断说话,他才会输出温度值,这个大家帮我想想办法,应该怎么改那个逻辑结构。

后续其实我还想用语音去控制扬声器,比如超过阈值它一直响也很烦。所以我想的是:对电脑说“我知道了”,然后扬声器就不响了。还能加一个数字钟啊,或者小风扇之类的拓展。但是由于时间有限所以就只能这样了。希望大家可以展望一下。

那么整个流程就是这样,其中一些细节问题希望大家可以自己解决,这也是一个不错的学习过程。做完这个还要参加全国数学建模,没事我还有头发!!!

你可能感兴趣的:(Arduino温度检测器,Python语音识别播报,Arduino报警器)