步骤1:设计思路
我从DFRobot获得了两个非常有趣的小模块,一个是语音合成模块,另一个是语音识别模块。
因此,我想到了制作一个闹钟。我觉得每个人早上都很难起床,普通的闹钟里塞满了大炮草。然后出现了制作“真实”闹钟的想法。实际上,我发现当人们醒来后头脑变得清晰起来时,他们就不想再睡觉了。因此,无论是带轮运转的闹钟还是拍打人的闹钟,都是要让被动选择起床。在这里做一个温和的,带有随机问题的闹钟。如果答案正确,它将停止发出噪音;如果答案不正确,它将使您烦恼。
步骤2:开始制作封面
找一个合适的纸箱,我这里没有合适的纸箱。所以我用两个小个子,然后将它们粘在一起,做成一个大个子。
步骤3:如下连接每个模块
时钟模块→Uno IIC
时钟模块INT引脚→uno D2
扬声器红线→Uno D3
扬声器黑线→Uno GND
IIC扩充板→UNO IIC
白色按钮→Uno D4
语音识别,合成,LED段代码→IIC扩展板
步骤4:重新安装盖子和组件
1.在LED分段屏幕上开一个孔,在机箱背面开一个用于扬声器和电池的孔。
2.使用热熔胶将所有模块粘合在一起,最后将所有设备放入包装盒中。
步骤5:编程
安装每个模块的库功能,调整您要询问的问题和警报设置的时间,然后将程序刻录到其中。
/ *!
* @file
setAlarmInterrupt.ino * @简要设置警报,并使用输入引脚触发
* * n实验现象:将闹钟设置为在指定时间触发
* @n将SQW引脚与DIGITALPIN2连接
* @n在串口上打印信息闹钟触发后的端口。
* @copyright版权所有(c)2010 DFRobot Co.Ltd(http://www.dfrobot.com)
* @licence MIT许可证(MIT)
* @author [LuoYufeng](yufeng.luo@dfrobot.com)
* @version V0.1
* @date 2019年8月19日
* @url https://github.com/DFRobot/DFRobot_DS3231M
* /
#include “DFRobot_DS3231M.h”
#include “ DFRobot_SpeechSynthesis.h” #include“ DFRobot_ASR.h”
#include “ DFRobot_LedDisplayModule.h
”
DFRobot_LedDisplayModule LED(Wire,0xE0);
DFRobot_SpeechSynthesis_I2C ss;
DFRobot_ASR asr;
volatile int8_t alarmFlag = 0;
unsigned long delay= 3000;
unsigned long timelast = 0;
unsigned long timenow = 0;
unsigned char hourval = 0;
unsigned char hourhigh = 0;
unsigned char hourlow = 0;
unsigned char minutesval = 0;
unsigned char minuteshigh = 0;
unsigned char minuteslow = 0;
unsigned char secondval = 0;
unsigned char secondhigh = 0;
unsigned char secondlow = 0;
char str1 [2];
char str2 [2];
char str3 [2];
char str4 [2];
char str5 [2];
char str6 [2];
char str7 [2];
char str8 [2];
DFRobot_DS3231M rtc;
void setup(void)
{
Serial.begin(9600);
while(LED.begin8()!= 0)
{
Serial.println(“芯片初始化失败,请确认芯片连接正确!”);
延迟(1000);
}
ss.begin();
/ *等待芯片完全初始化,然后退出* /
while(rtc.begin()!= true){
Serial.println(“无法初始化芯片,请检查芯片连接是否正确。”);
延迟(1000);
}
/ *!
* @简短设置引脚sqw的值
* @ param模式eDS3231M_OFF = 0x01 //不输出方波,进入中断模式
* @ n eDS3231M_SquareWave_1Hz = 0x00 // 1Hz方波
* @ n eDS3231M_SquareWave_1kHz = 0x08 // 1kHz方波
* @ n eDS3231M_SquareWave_4kHz = 0x10 // 4kHz方波
* @ n eDS3231M_SquareWave_8kHz = 0x18 // 8kHz方波
* /
rtc.writeSqwPinMode(eDS3231M_OFF);
/ *!
* @简短启用Alarm1中断
* /
rtc.enAbleAlarm1Int();
/ *!
* @简短禁用Alarm1中断
* /
//rtc.disAbleAlarm1Int();
/ *!
* @简短启用Alarm2中断
* /
//rtc.enAbleAlarm2Int();
/ *!
* @简短禁用Alarm2中断
* /
//rtc.disAbleAlarm2Int();
// Alarm1
rtc.setAlarm(eMinutesHoursDayMatch,/ *日期,0-30 * / 30,/ *小时,12小时内1-12,24小时内0-23 * / 15,e24小时,
/ *分钟,0-59 * / 13,/ *秒,0-59,此参数在Alarm2 * / 42中不起作用);
//报警2
//rtc.setAlarm(eMinutesHoursDayMatch,/*日期,0-30 * / 30,
/ *小时,12小时内1-12,24小时内0-23 * / 15,e24小时,// / *分钟,0-59 * / 13,/ * second,0-59,此参数在Alarm2 * / 42中不起作用);
如果(rtc.lostPower()){
Serial.println(“ RTC掉电,请设置时间!”);
rtc.setYear(21); //设置年份,默认为21世纪。
rtc.setMonth(3);
rtc.setDate(10);
rtc.setHour(15,e24hours);
rtc.setMinute(12);
rtc.setSecond(45);
rtc.adjust();
}
attachInterrupt(0,interrupt,FALLING);
pinMode(3,输出);
pinMode(4,输入);
asr.begin(LOOP);
asr.addCommand(“ san”,3);
}
void loop(){
/ *!
* @简短判断闹钟是否被触发
* @返回true,被触发;false,未触发
* /
rtc.getNowTime();
Serial.print(rtc.year(),DEC);
Serial.print('/');
Serial.print(rtc.month(),DEC);
Serial.print('/');
Serial.print(rtc.day(),DEC);
Serial.print(“(”);
Serial.print(rtc.getDayOfTheWeek());
Serial.print(“)”);
Serial.print(rtc.hour(),DEC);
Serial.print(':');
Serial.print(rtc.minute(),DEC);
Serial.print(':');
Serial.print(rtc.second(),DEC);
Serial.print('');
/ *如果rtc在24小时模式下工作,则此功能不会打印任何内容* /
Serial.print(rtc.getAMorPM());
Serial.println();
hourval = rtc.hour();
hourhigh = hourval / 10;
hourlow = hourval%10;
minutesval = rtc.minute();
minuteshigh = minutesval / 10;
minuteslow = minutesval%10;
secondval = rtc.second();
secondhigh = secondval / 10;
secondlow = secondval%10;
sprintf(str1,“%d”,hourhigh);
sprintf(str2,“%d”,hourlow);
sprintf(str4,“%d”,分钟高);
sprintf(str5,“%d”,minuteslow);
sprintf(str7,“%d”,第二高);
sprintf(str8,“%d”,第二低);
LED.setDisplayArea8(1,2,3,4,5,6,7,8);
LED.print8(str1,str2,“-”,str4,str5,“-”,str7,str8);
延迟(500);
if(alarmFlag == 1){
Serial.println(“闹钟已触发。”);
延迟(100);
do {
tone(3,400,2000);
} while(!digitalRead(4));
noTone(3);
ss.speak(“”);
ss.speak(“一加一是多少”);
asr.start();
timelast = millis();
while(1)
{
if(asr.read()== 3){
Serial.println(“ received'san',command flag'0'”“);
rtc.clearAlarm();
alarmFlag = 0;
break;
}
timenow = millis();
if((timenow-timelast)> = timeout){
Serial.println(“ received'x',command flag'x'”);
break;
}
}
}
else
delay(100);
如果(rtc.lostPower()){
Serial.println(“ RTC掉电,请重设时间!”);
}
}
void interrupt(){
alarmFlag = 1;
}
步骤 6:然后完成
谢谢阅读!欢迎对此项目有任何意见。
FAQ:
版权说明
本文遵循CC BY-SA版权协议,转载请附上原文出处链接及本声明。
链接:https://chandianzi.cn/making-a-alarm-clock-that-asks-questions-randomly.html
作者:Jaychouu
版权协议:CC BY-NC-SA
分类名称:arduino-10
资源标识:Making-a-Alarm-Clock-That-Asks-Questions-Randomly
暂无评论