失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Arduino项目——定时控制 手机控制Arduino实现远程开关和定时开关

Arduino项目——定时控制 手机控制Arduino实现远程开关和定时开关

时间:2020-08-11 21:05:07

相关推荐

Arduino项目——定时控制 手机控制Arduino实现远程开关和定时开关

功能效果

1. 通过手机app的按键实时控制舵机转动。 (用机械结构连接舵机和室内灯的开关即可实现开关灯)

2. 通过手机app设置时间,时间到即执行开/关灯,并响铃,按下按钮停止响铃。

这个项目原本是想作为定时闹钟,早上叫自己起床的,因为寒假里老是睡过头。由于初学Arduino经验不足,踩了好多坑,终于在寒假结束这会做出来了,演示视频放在文章最后。

材料准备

Arduino UNO开发板HC-05蓝牙模块9g小型舵机DS3231时钟模块光敏电阻10k电阻蜂鸣器按钮一个面包板杜邦线若干手机app开发网站:MIT App Inventor

电路连接

其他的Vcc都接5V,由于UNO板的5V和GND口数量不够,需要借助面包板来分流。

实物图

代码及解释

#include<Servo.h> //舵机库Servo myservo; //定义舵机名称#include <DS3231_Simple.h> //随便选的时钟库DS3231_Simple Clock; //时钟名称#include <SoftwareSerial.h> //系统自带的串口库SoftwareSerial BT(8,9);//D8,D9连蓝牙int pinBuzzer = 5; //管脚D5连接到蜂鸣器模块的信号脚int set_h=25,set_m=70; //设初始响铃时间为25时,即不响铃boolean f=0; char inChar; String inString="";void setup() {Serial.begin(9600);Clock.begin();BT.begin(9600);myservo.attach(6);//D6接舵机myservo.write(90); pinMode(pinBuzzer, OUTPUT); //设置pinBuzzer脚为输出状态pinMode(7, INPUT_PULLUP); //D7脚连接开关}void servo(){ //驱动舵机int state_1=analogRead(A0); //光敏电阻接A0int pos;for(pos=90;pos>30;pos--)//舵机转一个方向去按开关myservo.write(pos);delay(500);myservo.write(90);delay(500);int state_2=analogRead(A0);if(state_2-state_1<10&&state_2-state_1>-10) //若亮度没变,反转{ for(pos=90;pos<150;pos++)myservo.write(pos);delay(500);myservo.write(90);//回到初始位置}}void voice(){ //响铃函数while(digitalRead(7)) //当开关未按下{long frequency = 300; tone(pinBuzzer, frequency ); //用tone()函数发出频率为frequency的波形delay(1000); noTone(pinBuzzer);//停止发声delay(1000); }}void Time(int h,int m){//定时DateTime t;t = Clock.read();if(t.Hour==h&&t.Minute==m) //当时间到{servo();voice();}delay(60000); //过一分钟}void loop() {Time(set_h,set_m); //判断时间到否while(BT.available())//接收到蓝牙数据{inChar=char(BT.read()); //一个个读入数据inString+=inChar;//串接成字符串inChar=' ';delay(10); //延时一会以防数据丢失f=1; //表示有数据接收到,做下面的if} // if(inString!="")Serial.println(inString);//接收到'a'是开关灯,'b'是取消时间,接收到四位数字代表更改时间if(f==1){f=0;if(inString[0]=='a') //执行开关灯{servo(); }else if(inString[0]=='b') //取消时间{set_h=26; }else if(inString[0]>='0'&&inString[0]<='9')//更改时间{set_h=(inString[0]-'0')*10+(inString[1]-'0'); //取时数据set_m=(inString[2]-'0')*10+(inString[3]-'0'); //取分数据// Serial.println(set_h);//Serial.println(set_m);}}inString=""; //清空储存的字符}

舵机部分

由于屋里能控制灯的开关不止一个,开关的状态和灯的亮灭其实没有关系,因此我借助了光敏电阻,让舵机先转一个指定角度,如果改变了开关状态(光敏电阻前后检测值相差较大),则表示开/关灯成功,结束过程;如果光敏电阻前后检测值相差较小,表示没有成功,反转一次就能改变开关状态。看不懂也没关系,文章结尾的演示视频会有体现。

蜂鸣器部分

找了一段比较难听的声音,在没睡醒的早晨播放会有奇效,一直循环播放直到人下床长按按钮才能停止。

蓝牙数据接收

先一个个接收字符,串接成字符串,再转为有用的数据,注意不能忘了延时,不然会丢失数据。配合手机app使用,蓝牙一次性接收多个字符基本要用这个方法。

时钟模块

本来想用Arduino定时中断功能实现定时开关的,后来发现定时中断驱动不了舵机,所以用了时钟模块,这样一来算时间的步骤也省了。找了一个读写比较简单的时钟库,这库的时间读取函数比较简洁。用其他库也可以,效果一样的。

注意:第一次用蓝牙模块一定要先激活,时钟模块要先设定时间,网上有教程。

手机app

也是第一次做app,感觉挺好玩的,有点编程基础就能写,值得试一试。

效果演示

手机控制舵机

如果觉得《Arduino项目——定时控制 手机控制Arduino实现远程开关和定时开关》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。