智能插座

来自Microduino Wikipedia
跳转至: 导航搜索

概述

  • 项目名称:Microduino智能插座
  • 目的:手机控制插座通断
  • 难度:低
  • 耗时:2小时
  • 制作者:
  • 简介:

智能插座主要由控制模块和电路部分组成,用户可以使用手机连接蓝牙模块(Microduino-BT/zh)并发送命令、接收电路状态,核心控制模块(Microduino-Core/zh)对数据进行分析之后控制继电器对电路进行控制。

材料清单

  • Microduino设备
模块 数量 功能
Microduino-Core/zh 1 核心板
Microduino-USBTTL/zh 1 下载程序
Microduino-BT/zh 1 蓝牙通信
  • 其他设备
模块 数量 功能
底壳+电路板 1 核心板
外壳 1 下载程序
长螺丝 1 固定外壳与底壳
短螺丝 1 固定底壳与电路板
M3螺丝刀 1 拧螺丝

实验原理

  • 电路控制原理

智能插座的电源控制分为两部分,分别是电压转换和继电器控制两部分。 首先介绍一下电压转换部分,由于家庭中的电源多为220伏特的交流电,而Microduino-Core工作在5伏特的直流电压环境下,这部分的功能就如同一个变压器,像手机的充电插头一样转换了电压。 另一部分是继电器控制,继电器是当输入电压的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。由于Microduino-Core核心控制引脚输出的电压很小,不能直接给电器供电,因此需要通过控制继电器从而间接控制家庭电源。

  • 无线通信原理

本套件使用了蓝牙无线通信模块Microduino-BT,由于Microduino的蓝牙模块很好的屏蔽了底层的协议,所以关于蓝牙协议这里不再赘述,使用它只需确认蓝牙串口的接法,默认是D2,D3。,给出一张蓝牙通讯所使用的串口图,所有的串口连接方法都涵盖在该图中:

Microduino-BT-2Big1.jpg
  • 主要器件

Microduino-BT/zh

文档

调试过程

  • 程序下载

将Microduino Core、Microduino USBTTL堆叠在一起.用数据线将写好的程序通过Microduino USBTTL上传到Microduino Core上。 注意:最好不要将所有模块堆叠在一起之后再上传程序

Download1.jpg

打开Aroduino IDE,若电脑中没有安装,则参照附录中的安装方法,先安装Aicroduino IDE。点击左上【文件】选项→点击【打开】。

在弹出的对话框中找到MicroduinoBluControlOutlet.ino并双击打开

之后点击左上角的"√"进行编译,点击上边栏的工具,确认板卡(Microduino-Core)处理器(Atmega328P@16M,5V)和端口号(COMX)。三项都如图确认无误之后点击"→"按钮下载程序到开发板上

  • 搭建

先使用三个4mm螺丝将电路板固定在底壳上

将Microduino-BT与Microduino-Core插接好并插接在智能插座的底板上

将智能插座外壳扣入底壳并使用8mm长螺丝旋入,固定上下外壳,至此智能插座部分搭建完成

将智能插座插入家中的插座。手机充电器插在智能插座上,并按下开关钮,可以看到指示灯亮起,手机开始充电。调试智能插座。图中: ①为开关按钮 ②是上电指示灯 ③是智能插座通断指示灯

Chazuo4.jpg
  • 手机端APP

首先使用手机扫描二维码,下载蓝牙App,下载完成后打开 文件:Zhinengchazuo.rar

点击SCAN,搜索周围蓝牙设备,发现并点击Microduino

等待1-2秒,待屏幕上出现ready字样可以开始操作智能插座

点击屏幕中间的按钮开关就可以控制智能插座的通断了,同时插座上的按键也可以控制插座的通断,手机APP上可以实时同步开关的状态

注意问题

  • 与电接触很危险,注意用电安全!一切安装操作都不能接电!安装好接电后就算智能插座是关闭状态,也一定不要触摸电源插口!
  • 如果蓝牙采用了蓝牙原理图中的Serial10跳线法,在用Microduino-Core和Microduino-USBTTL组合烧录程序时,不要将蓝牙模块也叠上去,会引起串口冲突,正确的做法是将程序烧录完毕后,拔下Microduino-USBTTL,再将蓝牙与Microduino-Core模块叠放在插座底板上。

程序说明

  • 主程序
#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");     //告知蓝牙模块关闭智能插座 
        } 
    } 
} 
  • key.h
#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; 
    } 
} 

视频