【平头哥RVB2601创意应用开发】+智能开关
在智能家居应用广泛应用的今天,智能家居是高科技光速发展的现代社会最热门的话题之一,通过网络等信息化方法实现对家用电器等的智能化控制,使其能够按照人们的设想去工作运行,但却不考虑距离的远近。智能化和远程控制是智能家居的两大特色。目前,已经有越来越多的企业和个人开始了对智能家居的研究。
在现代通信技术中,居民住宅使用的无线通信技术大多以蓝牙通信和WiFi通信及远距离的433通信模块等为主。相比较这几种无线通信技术,WiFi的信号适用范围更广,但在智能家用电器开或关的使用过程中,运用WiFi的话会比较麻烦,手机要不定时的连接不同的WiFi网络,才能够对智能家用电器进行遥控, 容易丢失信号,再者WiFi信号传输容易受阻挡等使信号不能完整覆盖某个区域,我们在原有的WiFi开关产品中有更新增加了一款433通信的控制开关。该技术可以点对点点对多多对点。一端发送另一端就接收,或者对面那端发送这端接收信息。实现数据无线传输,现在在一个封闭区域内无线传输稳定通信的要求。
单片机控制部分采用平头哥RVB2601,通过单片机管脚控制电磁继电器的断开和吸合来控制外接家用电器的通断。通过串口控制各路开关的闭合及开通,将结果显示在屏幕上(由于文字在屏幕显示这部分一直没有完美解决,暂时放弃了在屏幕显示通断结果的部分)。
五、作品源码和案例中处理的传感器数据
串口传输处理
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n)
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n)
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n)
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n)
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n)
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n)
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n)
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n)
#define LED6 PAout(4)
#define LED5 PAout(6)
#define LED4 PBout(0)
#define LED3 PAout(5)
#define LED2 PAout(7)
#define LED1 PBout(1)
#define LED_PM1 PBout(2)
#define LED_PM2 PBout(10)
#define LED_EN PBout(11)
#define OUT4 PBout(15)
#define OUT3 PBout(14)
#define OUT2 PBout(13)
#define OUT1 PBout(12)
#define Z_RST PAout(8)
uchar DMA_RECEIVE[20]; //DMAµÄ½ÓÊÕ»º³åÊý×é
uchar DMA_SEND[20];
uchar DMA_LEN; //DMA½ÓÊÕµ½Êý¾ÝµÄ³¤¶È
uchar ADDRESS;
uchar MarkOUT1; //1¿ª¹Ø״̬
uchar MarkOUT2; //2¿ª¹Ø״̬
uchar MarkOUT3; //3¿ª¹Ø״̬
extern uchar NotKey;//¿ª¹Ø״̬±ê¼Ç
extern uchar I2c_Buf_Write[20];
extern uchar I2c_Buf_Read[20];
extern uchar AddID1;//¶ÀÁ¢µØÖ·1
extern uchar AddID2;//¶ÀÁ¢µØÖ·2
extern uchar AddID3;//ÓòµØÖ·1
extern uchar AddID4;//ÓòµØÖ·2
extern uchar AddID5;//±£Áô×Ö
extern uchar Buzzer_EN;
extern void Delayus(uchar a);
extern void Buzzer_On(void);
void ReadPort(void);
void USART1_Config(void)
{
//// GPIO_InitTypeDef GPIO_InitStructure;
//// USART_InitTypeDef USART_InitStructure;
//// /* config USART1 clock */
//// RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
//// /* USART1 GPIO config */
//// /* Configure USART1 Tx (PA.09) as alternate function push-pull */
//// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
//// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//// GPIO_Init(GPIOA, &GPIO_InitStructure);
//// /* Configure USART1 Rx (PA.10) as input floating */
//// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
//// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//// GPIO_Init(GPIOA, &GPIO_InitStructure);
////
//// /* USART1 mode config */
//// USART_InitStructure.USART_BaudRate = 115200;
//// USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//// USART_InitStructure.USART_StopBits = USART_StopBits_1;
//// USART_InitStructure.USART_Parity = USART_Parity_No ;
//// USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
//// USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//// USART_Init(USART1, &USART_InitStructure);
//// USART_Cmd(USART1, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/*ʹÄÜËùÓÐGPIO¿ÚʱÖÓ*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE,ENABLE);
/*ʹÄÜADC1,UART1ʱÖÓ*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_USART1,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//ʹÄÜDMAʱÖÓ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /*ÉèÖÃÒý½ÅģʽΪͨÓÃÍÆÍìÊä³ö*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*ÉèÖÃÒý½ÅËÙÂÊΪ50MHz */
GPIO_Init(GPIOA, &GPIO_InitStructure); /*µ÷Óÿ⺯Êý£¬³õʼ»¯GPIOA*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /*ÉèÖÃÒý½ÅģʽΪ¸¡¿ÕÊäÈëģʽ*/
GPIO_Init(GPIOA, &GPIO_InitStructure); /*µ÷Óÿ⺯Êý£¬³õʼ»¯GPIOA*/
USART_InitStructure.USART_BaudRate = 9600;//ÅäÖô®¿Ú²¨ÌØÂÊ
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //ÅäÖÃֹͣλ
USART_InitStructure.USART_StopBits = USART_StopBits_1; //ֹͣλÉèÖÃΪ1λ
USART_InitStructure.USART_Parity = USART_Parity_No ; //ÅäÖÃÆæżУÑéλ²»ÉèÖÃÆæżУÑéλ
//ÅäÖÃÓ²¼þÁ÷¿ØÖÆ¡£²»²ÉÓÃÓ²¼þÁ÷¡£
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //ÅäÖô®¿ÚµÄģʽ °ÑRxºÍTxģʽ¶¼¿ªÆô
//µ÷Óÿ⺯ÊýUSART_Init()Ïò¼Ä´æÆ÷дÈëÅäÖòÎÊý
USART_Init(USART1, &USART_InitStructure);
//ʱÄÜÖжÏ
USART_ITConfig(USART1, USART_IT_TC, ENABLE); //·¢ËÍÍêÖжÏ
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //¿ÕÏÐÖжÏ
// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); //´®¿Ú·¢ËÍDMAÇëÇóʹÄÜ
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE); //´®¿Ú½ÓÊÜDMAÇëÇóʹÄÜ
USART_ClearFlag(USART1, USART_FLAG_TC); /* Çå·¢ËÍÍâ³Ç±êÖ¾£¬Transmission Complete flag */
// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
// //ʹÄÜUSART1ÍâÉè
USART_Cmd(USART1, ENABLE);
GPIO处理
#include "gpio.h"
/*
* º¯ÊýÃû£ºLED_GPIO_Config
* ÃèÊö £ºÅäÖÃLEDÓõ½µÄI/O¿Ú
* ÊäÈë £ºÎÞ
* Êä³ö £ºÎÞ
*/
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //I/O¿Ú½á¹¹Ì嶨Òå
/*ʹÄÜËùÓÐGPIO¡¢AFIO¡¢ADC1¡¢Ê±ÖÓ*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO, ENABLE);
/*ÅäÖÃPA0-PA15£¬
PA0
PA1
PA2
PA3
PA4
PA5
PA6
PA7
PA8
PA9 ´®¿Ú·¢ËÍ ÔÚUARTÖÐÅäÖÃ
PA10 ´®¿Ú½ÓÊÕ ÔÚUARTÖÐÅäÖÃ
PA11
PA12
PA13,14,15 JTAGÏÂÔؽӿÚ
// */
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
// GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*ÅäÖÃPB0-PB15£¬
PB0 ¿Õ½Å£¬ ÍÆÍìÊä³ö
PB1 ¿Õ½Å£¬ ÍÆÍìÊä³ö
PB2 ¿Õ½Å£¬ ÍÆÍìÊä³ö
PB3 JTAGÏÂÔØ
PB4 JTAGÏÂÔØ
PB5 ¿Õ½Å£¬ ÍÆÍìÊä³ö
PB6 ¿Õ½Å£¬ ÍÆÍìÊä³ö
PB7 ¿Õ½Å£¬ ÍÆÍìÊä³ö
PB8 ¿Õ½Å£¬ ÍÆÍìÊä³ö
PB9 ¿Õ½Å£¬ ÍÆÍìÊä³ö
PB10 ¿Õ½Å£¬ ÍÆÍìÊä³ö
PB11 ¿Õ½Å£¬ ÍÆÍìÊä³ö
PB12 EN25-32£¬ ÍÆÍìÊä³ö
PB13 M25-32£¬ ÍÆÍìÊä³ö
PB14 CG25-32£¬ ÍÆÍìÊä³ö
PB15 ʹÄÜ£¬ ÍÆÍìÊä³ö
*/
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
//
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12
// |GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
//
/*ÅäÖÃPC0-PC15£¬
PC0 ¿Õ ÍÆÍìÊä³ö
PC1 ¿Õ ÍÆÍìÊä³ö
PC2 ¿Õ ÍÆÍìÊä³ö
PC3 ¿Õ ÍÆÍìÊä³ö
PC4 EN Êý×ÖÊäÈë
PC5 REST Êý×ÖÊäÈë
PC6 ¿Õ ÍÆÍìÊä³ö
PC7 ¿Õ ÍÆÍìÊä³ö
PC8 LED ÍÆÍìÊä³ö
PC9 LED ÍÆÍìÊä³ö
PC10 ¿Õ ÍÆÍìÊä³ö
PC11 ¿Õ ÍÆÍìÊä³ö
PC12 ¿Õ ÍÆÍìÊä³ö
PC13 ¿Õ ÍÆÍìÊä³ö
PC14 ¿Õ ÍÆÍìÊä³ö
PC15 ¿Õ ÍÆÍìÊä³ö
*/
//
// GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13|GPIO_Pin_13|GPIO_Pin_15;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOC, &GPIO_InitStructure);
//
}
void GPIO_UARTConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //I/O¿Ú½á¹¹Ì嶨Òå
/*ʹÄÜËùÓÐGPIO¡¢AFIO¡¢ADC1¡¢Ê±ÖÓ*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO, ENABLE);
/*ÅäÖÃPA9-PA10£¬
PA9 ´®¿Ú·¢ËÍ ÔÚUARTÖÐÅäÖÃ
PA10 ´®¿Ú½ÓÊÕ ÔÚUARTÖÐÅäÖÃ
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 |GPIO_Pin_10 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //??
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//????
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
主函数部分
int main(void)
{
// u16 i;
SystemInit(); /* ÅäÖÃϵͳʱÖÓΪ72M */
GPIO_Config(); /* GPIO ¶Ë¿Ú³õʼ»¯ */
// SysTick_Config(720000); //10msÖжÏ
//
// DMA_Configuration(); //DMA³õʼ»¯
// NVIC_Configuration(); //ÖжÏÓÅÏȼ¶ÉèÖÃ
// EXTIX_Init(); //ÍⲿÖжϳõʼ»¯
// I2C_EE_Init();
// ReadAdd();
//
//
// i=GPIOB->IDR;
// i=i&0x0100;
// i=i>>8;
// if(i==1)
// {
// USART1_Config(); /* ´®¿Ú1³õʼ»¯ */
// }
// else
// {
// Z_RST=0;
// Delayus(200);
// Z_RST=1;
// GPIO_UARTConfig();
// LED_PM1=1;
// LED_PM2=1;
// LED_EN=1;
// while(1)
// {
// LED2=0;LED5=1;
// Delayus(50);
// LED2=1;LED5=0;
// Delayus(50);
// LED2=0;LED5=1;
// Delayus(50);
// LED2=1;LED5=0;
// Delayus(50);
// LED2=0;LED5=1;
// Delayus(50);
// LED2=1;LED5=0;
// Delayus(50);
// }
// }
// PortInit();
//// USART1_printf(USART1, "\r\n ÕâÊÇÒ»¸öI2CÍâÉè(AT24C02)¶Áд²âÊÔÀý³Ì \r\n");
//// USART1_printf(USART1, "\r\n ("__DATE__ " - " __TIME__ ") \r\n");
////
////
//// I2C_Test();
////I2C_EE_BufferRead(I2c_Buf_Read, EEP_Firstpage, 256);
LED1=1;
LED2=1;
LED3=1;
while(1)
{
// if(NotKey==0)
// {
// ReadKey();
// }
}
}
void Delayus(uchar a)
{
u16 i,j;
for(j=0;j<a;j++)
{
for(i=0;i<20000;i++);
}
}
void Delayns(uchar a)
{
u16 i,j;
for(j=0;j<a;j++)
{
for(i=0;i<200;i++);
}
}
void Buzzer_On(void)
{
uchar i;
if (Buzzer_EN==1)
{
for(i=0;i<200;i++)
{
// Buzzer=1;
Delayns(10);
// Buzzer=0;
Delayns(10);
}
}
}
void ReadKey(void)
{
uchar a;
a=GPIOA->IDR;
a=a&0x0E;
if(a!=0x0e)
{
Delayus(10);
if((a==0x0C)&&(KeyMark1==0))
{
// LED4=~LED4;
// LED1=~LED1;
OUT1=~OUT1;
KeyMark1=1;
Buzzer_On();
Delayus(100);
}
else if((a==0x0A)&&(KeyMark2==0))
{
// LED5=~LED5;
// LED2=~LED2;
OUT2=~OUT2;
KeyMark2=1;
Buzzer_On();
Delayus(100);
}
else if((a==0x06)&&(KeyMark3==0))
{
// LED6=~LED6;
// LED3=~LED3;
OUT3=~OUT3;
KeyMark3=1;
Buzzer_On();
Delayus(100);
}
}
else
{
KeyMark1=0;
KeyMark2=0;
KeyMark3=0;
}
}
void PortInit(void)
{
// LED_PM1=1;
// LED_PM2=1;
// LED_EN=1;
// Z_RST=0;
// LED6=1;LED5=1;LED4=1;LED3=1;LED2=1;LED1=1;
// Delayus(50);
// LED6=0;LED5=0;LED4=0;LED3=0;LED2=0;LED1=0;
// Delayus(50);
// LED6=1;LED5=1;LED4=1;LED3=1;LED2=1;LED1=1;
// Delayus(50);
// LED6=0;LED5=0;LED4=0;LED3=0;LED2=0;LED1=0;
// Delayus(50);
// LED6=1;LED5=1;LED4=1;LED3=1;LED2=1;LED1=1;
// Delayus(50);
// LED6=0;LED5=0;LED4=0;LED3=0;LED2=0;LED1=0;
// Delayus(50);
//
// Z_RST=1;
//
// LED6=1;
// LED5=1;
// LED4=1;
// LED3=0;
// LED2=0;
// LED1=0;
//
// KeyMark1=0;
// KeyMark2=0;
// KeyMark3=0;
// I2C_EE_BufferRead(I2c_Buf_Read, Buzzer_page, 1);
// Buzzer_EN=I2c_Buf_Read[0];
//
// OUT1=0;
// OUT2=0;
// OUT3=0;
// OUT4=0;
}
六、视频演示(视频简介+链接)
七、项目总结
通过这次对RVB2601的测试,完整的了解了平头哥单片机的一些基本工作处理流程,使用功能脚控制外围设备,完整的通过串口处理一些基本操作,测试了W800的WiFi芯片,测试了一些简单的网络应用。总的来说这个国产单片还不错,基本能够替代一些国外芯片的基础处理功能,但是在研发初始阶段需要更多的了解该芯片的功能定义,平头哥在芯片功能部分的完善还要在加强。
八、其他
本来是想着提供一个完整的项目方案,但由于开发中出现问题太多,又是第一次使用RVB2601,好多功能部分都不是很了解,就做了一个基本的开关测试,原有开关的很多功能都没有正常移植上去,以后再慢慢完成。
完整文档:作品文档.doc
本帖最后由 yangxz 于 2022-5-9 14:37 编辑
引用: lugl4313820 发表于 2022-5-9 15:40 建议代码用代码块来编辑,有空修改一下。谢谢!
ok