wasdylb 发表于 2014-1-2 23:43:04

基于Microduino平台的Libview串口蓝牙、手机蓝牙和红外遥控的寝室电器控制

本帖最后由 wasdylb 于 2014-1-3 11:51 编辑

目的:
通过电脑蓝牙或者手机蓝牙或者红外遥控器配合Microduino平台控制寝室电器。
Microduino平台:
Microduino测试底板、Microduino core+、Microduino BT4.0、Microduino Ft232R、Microduino nrf、Microduino OLED。
各个模块作用:

Microduino测试底板:将所有模块级联在一起,方便调试;
Microduino core+:系统核心板,使整个系统正常运行;
Microduino Ft232R:下载程序模块;
Microduino BT4.0:蓝牙通信模块,与电脑蓝牙和手机蓝牙进行数据通信;
Microduino nrf:2.4G无线通讯模块,主机与副机无线数据传输;
Microduino OLED:用来显示被控制对象的状态,“1”表示开,“0”表示关;
蓝牙适配器:不自带蓝牙设备电脑上虚拟一个蓝牙,可用串口通信;
副机:采用老潘2.4G无线插座,接收主机数据,并对日光灯进行控制。

模块详细参考:http://wiki.microduino.net/index.php?title=Main_Page
方案一:
Libview实现结合电脑蓝牙控制:

Libview分两块,一是:设置串口通讯基本参数;二是:按钮控制界面。
串口通讯基本参数:

1.串口:电脑蓝牙和Microduino BT之间连接的桥梁,两者配上对后电脑会在系统加增加两个串口驱动,一个是传出一个是传入,选择传出串口;
2.波特率:串口数据通讯速率,与core+程序设置的串口服务波特率一致,否则会乱码;
3.数据比特:输入数据的位数。 数据位的值介于5和8之间。默认值为8。
4.奇偶位:奇偶指定要传输或接收的每一帧使用的奇偶校验。 该输入支持下列值:
0        no parity(默认)
1        odd parity
2        even parity
3        mark parity
4        space parity

5.停止位:停止位指定用于表示帧结束的停止位的数量。 该输入支持下列值:
10        1停止位
15        1.5停止位
20        2停止位

6.超时:指定读/写操作的时间,以毫秒为单位。 默认值为10000。
7.缓冲区大小:读取数据的缓冲区间。
控制界面:

四路Boolean控制按钮:控制四路电器;
四路电器状态:显示四路电器状态,”1“表示开,”0“表示关;
停止:停止串口数据传输
测试步骤:
1.插上蓝牙适配器,一般会自动安装驱动,如果不行使用驱动精灵安装,安装完毕重启电脑就行;
2.驱动安装成功插上适配器,会在任务栏上出现一个蓝牙图标,如果没有可能被隐藏到通知区域里,右键图标选择添加设备,如果发现已经有了Microduino BT设备最好删除再重新添加。配上对后电脑会在系统加增加两个串口驱动,一个是传出一个是传入,选择传出串口,右键图标选择打开设置,可以看到两个com端口号;
3.打开Libview,选择传出串口,设置好波特率,其他都默认,设置成功之后,Microduino BT上闪烁灯常量表示匹配成功;
4.打开控制界面就可以实现控制。
方案二:
手机蓝牙实现控制:

测试步骤:
1.测试之前要匹配Microduino BT的MAC地址,BT第一次连接将会显示MAC地址,把地址记下,在Android程序里加入MAC地址,编译通过,把程序安装到手机即可;
2.打开蓝牙,打开刚刚安装好的Android程序,弹出蓝牙匹配请求,输入PIN(1234),匹配成功Microduino BT上闪烁灯常亮表示匹配并且手机进入控制界面;
3.进入控制界面就可以实现控制了。

方案三:
红外遥控实现控制:

红外接法:

测试步骤:
1.按规定连接红外接收头;
2.程序下载完毕后,直接遥控即可。
若要更改遥控按键值,分两个步骤:一、解码红外遥控案件值;二:将Core+内匹配的红外编码换成你需要的按键的解码值。
红外解码程序:
#include <IRremote.h>
int RECV_PIN = A0;//匹配红外信号输入引脚
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);//匹配好波特率
irrecv.enableIRIn(); // Start the receiver
}

void loop() {
if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
}
}
通过串口监视,打印出的解码值是十六进制数,例如:0xFF18E7(0x将不会打印出来),将编码值替换即可。
三个方案可用同一个程序:
#include <IRremote.h>
#include "U8glib.h"
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>

int RECV_PIN = A0;
IRrecv irrecv(RECV_PIN);
decode_results results;

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);        // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins areSCK = 13 and MOSI = 11)

// nRF24L01(+) radio attached using Getting Started board
RF24 radio(9,10);
// Network uses that radio
RF24Network network(radio);
// Address of our node
const uint16_t this_node = 1;
// Address of the other node
const uint16_t other_node = 0;
// How often to send 'hello world to the other unit
const unsigned long interval = 150; //ms
// When did we last send?
unsigned long last_sent;
// How many have we sent already
//unsigned long packets_sent;

String comdata = "";//缓存字符串
String onedata = "";//缓存字符串

int pinRx = 0;
int pinTx = 1;
boolean C;

struct payload_t
{
uint32_t ms;
uint32_t sensorDataA;
uint32_t sensorDataB;
uint32_t sensorDataC;
uint32_t sensorDataD;
};

static unsigned char u8g_logo_bits0[] U8G_PROGMEM =
{
0xC0,0x00,0xC0,0x01,0xC0,0x03,0xC0,0x07,0xDC,0x0E,0xF8,0x1C,0xF0,0x0E,0xE0,0x03,
0xE0,0x01,0xF0,0x07,0xF8,0x0E,0xDC,0x1C,0xC8,0x0E,0xC0,0x07,0xC0,0x01,0xC0,0x00/*"bluetooth",0*/
};
static unsigned char u8g_logo_bits1[] U8G_PROGMEM =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x3F,0xFE,0x7F,0x27,0x69,0x27,0x69,
0x27,0x69,0x27,0x69,0x27,0x69,0xFE,0x7F,0xFC,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,/*"battary.bmp",0*/
};

void setup()
{
Serial.begin(115200);
Serial.println("RF24Network/examples/helloworld_tx/");
pinMode(pinTx,OUTPUT);
pinMode(pinRx,INPUT);
pinMode(A0,INPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,INPUT_PULLUP);


SPI.begin();
radio.begin();
radio.setDataRate( RF24_250KBPS ) ;
network.begin(/*channel*/ 90, /*node address*/ this_node);
randomSeed(analogRead(0));

irrecv.enableIRIn();         //红外使能
while(!Serial)      //串口使能
{
}
}
//********************OLED显示*********************//
void draw(void) {
u8g.setFont(u8g_font_7x14);
u8g.drawXBMP( 0, 0, 16, 16, u8g_logo_bits0);
u8g.drawXBMP( 112, 0, 16, 16, u8g_logo_bits1);

u8g.setPrintPos(32, 16);
u8g.print("^");
u8g.print(C);
u8g.setPrintPos(48, 16);
u8g.print("^");
u8g.print(C);
u8g.setPrintPos(64, 16);
u8g.print("^");
u8g.print(C);
u8g.setPrintPos(80, 16);
u8g.print("^");
u8g.print(C);   
}
//********************蓝牙通讯函数*********************//
void libview()
{
while (Serial.available() > 0)//判断串口是否有输入
{
    comdata = "";                     //清空显示字符
    onedata += char(Serial.read()); //读取字符
    comdata += onedata;               //同上
    delay(2);                         //等待串口缓存
    for(int i = 0; i < comdata.length(); i++)
    {
      if(comdata.length()>1)
      C=comdata-48;
      else
      {
      switch(comdata-'0')
      {
      case 1:
          C=!C;
          break;
      case 2:
          C=!C;
          break;
      case 3:
          C=!C;
          break;
      case 4:
          C=!C;
          break;
      }
      }
    }
}
onedata = "";//缓存字符串清空
}
//********************红外函数*********************//
void hongwai()
{
unsigned long remote = results.value;        //设红外信号为remote

    if(remote == 0xFF30CF)                //判断按键1
{
    C = !C;
    delay(20);
}

else if(remote == 0xFF18E7)                //判断按键2
{
    C = !C;
    delay(20);
}

else if(remote == 0xFF7A85)                //判断按键3
{
    C = !C;
    delay(20);
}
else if(remote == 0xFF10EF)                //判断按键4
{
    C = !C;
    delay(20);
}
}
//********************2.4G函数*********************//
void nrf()
{
// Pump the network regularly
network.update();
// If it's time to send a message, send it!
unsigned long now = millis();
if ( now - last_sent >= interval)
{
    last_sent = now;

    payload_t payload = {
      millis(),C,C,C,C                  };
    RF24NetworkHeader header(/*to node*/ other_node);
    bool ok = network.write(header,&payload,sizeof(payload));
}
}

void loop()
{
libview();
nrf();                         //2.4G`
if(irrecv.decode(&results))   //解码成功,把数据放入results变量中
{
    hongwai();             //红外控制
    irrecv.resume();       //返回值
}
u8g.firstPage();
do {
    draw();
}
while( u8g.nextPage() );
digitalWrite(3,C);
digitalWrite(4,C);
digitalWrite(5,C);
digitalWrite(6,C);
}

Libview控制视频:
http://v.youku.com/v_show/id_XNjU2NTYxNjY4.html
红外和手机蓝牙控制视频:
http://v.youku.com/v_show/id_XNjU2NTg4ODky.html

wasdpkj 发表于 2014-1-6 22:38:24

libview,牛啊:lol

huang1234 发表于 2014-4-16 14:31:57

{:soso_e113:}
页: [1]
查看完整版本: 基于Microduino平台的Libview串口蓝牙、手机蓝牙和红外遥控的寝室电器控制