基于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 libview,牛啊:lol {:soso_e113:}
页:
[1]