智能插座
概述
智能插座主要由控制模块和电路部分组成,用户可以使用手机连接蓝牙模块(Microduino-BT/zh)并发送命令、接收电路状态,核心控制模块(Microduino-Core/zh)对数据进行分析之后控制继电器对电路进行控制。 材料清单
实验原理
智能插座的电源控制分为两部分,分别是电压转换和继电器控制两部分。 首先介绍一下电压转换部分,由于家庭中的电源多为220伏特的交流电,而Microduino-Core工作在5伏特的直流电压环境下,这部分的功能就如同一个变压器,像手机的充电插头一样转换了电压。 另一部分是继电器控制,继电器是当输入电压的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。由于Microduino-Core核心控制引脚输出的电压很小,不能直接给电器供电,因此需要通过控制继电器从而间接控制家庭电源。
本套件使用了蓝牙无线通信模块Microduino-BT,由于Microduino的蓝牙模块很好的屏蔽了底层的协议,所以关于蓝牙协议这里不再赘述,使用它只需确认蓝牙串口的接法,默认是D2,D3。,给出一张蓝牙通讯所使用的串口图,所有的串口连接方法都涵盖在该图中:
文档调试过程
将Microduino Core、Microduino USBTTL堆叠在一起.用数据线将写好的程序通过Microduino USBTTL上传到Microduino Core上。 注意:最好不要将所有模块堆叠在一起之后再上传程序 打开Aroduino IDE,若电脑中没有安装,则参照附录中的安装方法,先安装Aicroduino IDE。点击左上【文件】选项→点击【打开】。 在弹出的对话框中找到MicroduinoBluControlOutlet.ino并双击打开 之后点击左上角的"√"进行编译,点击上边栏的工具,确认板卡(Microduino-Core)处理器(Atmega328P@16M,5V)和端口号(COMX)。三项都如图确认无误之后点击"→"按钮下载程序到开发板上
先使用三个4mm螺丝将电路板固定在底壳上 将Microduino-BT与Microduino-Core插接好并插接在智能插座的底板上 将智能插座外壳扣入底壳并使用8mm长螺丝旋入,固定上下外壳,至此智能插座部分搭建完成 将智能插座插入家中的插座。手机充电器插在智能插座上,并按下开关钮,可以看到指示灯亮起,手机开始充电。调试智能插座。图中: ①为开关按钮 ②是上电指示灯 ③是智能插座通断指示灯
首先使用手机扫描二维码,下载蓝牙App,下载完成后打开 点击SCAN,搜索周围蓝牙设备,发现并点击Microduino 等待1-2秒,待屏幕上出现ready字样可以开始操作智能插座 点击屏幕中间的按钮开关就可以控制智能插座的通断了,同时插座上的按键也可以控制插座的通断,手机APP上可以实时同步开关的状态 注意问题
程序说明
#include "key.h"
#include <SoftwareSerial.h>
#define outletPin 6 //显示当前的开关状态
#define led_Pin 5 //自定义引脚
#define Button_Pin 4 //这个引脚用于控制智能插座的开关
SoftwareSerial mySerial(2, 3); //RX,TX
#define my_Serial mySerial
//#define my_Serial Serial1 当所用核心模块是Core+时启用这句并注释掉上一句程序
String tmp = "";
boolean swith, change;
void setup()
{
Serial.begin(9600); //定义串口频率
Serial.println("LEDOnOff Starting...");
my_Serial.begin(9600);
//定义引脚的输入输出状态
pinMode(outletPin, OUTPUT);
pinMode(led_Pin, OUTPUT);
pinMode(Button_Pin, INPUT_PULLUP);
//初始化状态提示灯亮,插座开关提示灯灭
digitalWrite(outletPin, LOW);
digitalWrite(led_Pin, HIGH);
key_init(); //初始化电平控制数组
}
void loop()
{
// 如果串口有数据就读取串口中的数据,串口每次传输一个字符,因此要进行转换
while (my_Serial.available() > 0)
{
tmp += char(my_Serial.read());
delay(2);
}
//如果从串口中读取的内容不为空,进行状态判断
if (tmp.length() > 0)
{
if(tmp == "on") //如果收到的内容为on
{
Serial.println("power on"); //串口显示:上电
digitalWrite(outletPin, HIGH); //将开关指示灯点亮
swith = true;
}
else if(tmp == "off") //如果收到的内容为off
{
digitalWrite(outletPin, LOW); //关闭开关指示灯
Serial.println("power off");//串口显示:关闭
swith = false;
}
tmp = "";
}
if(key_get(Button_Pin, 0)) //用于物理按钮,当每次按键按下并松开后
{
delay(300);
swith = !swith; //翻转开关状态
}
if(change != swith) //如果开关状态有变化
{
change = swith; //用change记录本次操作的开关状态
if(swith) //如果是开状态
{
digitalWrite(outletPin, HIGH); //点亮指示灯
my_Serial.println("ON"); //告知蓝牙模块开启智能插座
}
else
{
digitalWrite(outletPin, LOW); //关闭指示灯
my_Serial.println("OFF"); //告知蓝牙模块关闭智能插座
}
}
}
#include "arduino.h"
boolean key[NUM_DIGITAL_PINS]; //当前按键状态
boolean key_cache[NUM_DIGITAL_PINS]; //上一次的按键状态缓存
void key_init()
//将所有数字引脚当前状态设为低电平,缓存电平设为高电平,便于之后的电平翻转设计
{
for(int a = 0; a < NUM_DIGITAL_PINS; a++)
{
key[a] = LOW;
key_cache[a] = HIGH;
}
}
boolean key_get(int _key_pin, boolean _key_type)
//这个函数是为了插座上的物理按钮设计的
//第一个参数为引脚号,第二个参数为模式选择,因为只判断按键松开所以只用到了0模式
{
key_cache[_key_pin] = key[_key_pin]; //缓存作判断用
key[_key_pin] = !digitalRead(_key_pin);
//按钮按下为低电平,松开为高电平
//这里是翻转一下为了逻辑true表述通电
switch(_key_type)
{
case 0:
//没有按钮输入时key和key_cache都是LOW状态,当按下按钮后的第一个loop
//keycache还是LOW但是key变为HIGH,之后的循环两者都变为HIGH,直到松开按钮
//的第一个loop,key_cache得到key的HIGH状态,key变为LOW,case0这个判断就是
//找这个松开按键的状态
if(!key[_key_pin] && key_cache[_key_pin])
return true;
else
return false;
break;
case 1:
if(key[_key_pin] && !key_cache[_key_pin]) //按下松开后
return true;
else
return false;
break;
}
}
视频 |