/***************************************************** * Function Name : GizWits_ControlDeviceHandle * Description : Analy P0 Package根据数据有效位标志,进行控制 4.10 WiFi模组控制MCU WiFi发: Header(2B)__LEN(2B)__CMD(1B)__sn(1B)__falg(2B)__ActionBit(1B)__attrFlags(1B)__attrValue(6B)__CheckSum(1B) 0xFFFF 0x000D 0x03 0x## 0x0000 0x01 标志位 控制值 0x## MCU 回通用消息帧: Header(2B)__LEN(2B)__CMD(1B)__sn(1B)__falg(2B)__CheckSum(1B) 0xFFFF 0x0005 0x04 0x## 0x0000 0x## Bit0~5ED_ONOFF, LED_Color, R,G,B, Motor_speed WirteTypeDef_t{ uint8_t Attr_Flags; //信息位 是否有效的标志 uint8_t LED_Cmd; uint8_t LED_R; uint8_t LED_G; uint8_t LED_B; MOTOR_T Motor; } 依靠接收的数据帧,存储到WirteTypeDef,再更改设备状态 *****************************************************/ void GizWits_ControlDeviceHandle() //WiFi模组控制MCU { //标志位 0位开关 共1个字节 if( (WirteTypeDef.Attr_Flags & (1<<0)) == (1<<0))//低位第0位ONOFF 是否设置标志位7位 { if((WirteTypeDef.LED_Cmd &(1<<0))== 0) { LED_RGB_Control(0,0,0); LED_OFF(LED1); ReadTypeDef.LED_Cmd &= ~(1<<0);//存储状态LED_OnOff a&=~(1<<i);//将a的bit i清0 printf("LED OFF \r\n"); } if((WirteTypeDef.LED_Cmd &(1<<0))== (1<<0)) { ReadTypeDef.LED_Cmd |= (1<<0);//LED_OnOn a|=1<<i;//将a的bit i置1 LED_ON(LED1); LED_RGB_Control(254,0,0);//默认打开时,是红色 printf("LED ON \r\n"); } } //标志位是否启用定时器 if( (WirteTypeDef.Attr_Flags & (1<<1)) == (1<<1))//低位第1位Time_OnOff { if((WirteTypeDef.LED_Cmd & (1<<1))== 0) { //LED_RGB_Control(0,0,0); LED_OFF(LED2); ReadTypeDef.LED_Cmd &= ~(1<<1);//存储状态LED_OnOff a&=~(1<<i);//将a的bit i清0 printf("Time_OnOff OFF \r\n"); } if((WirteTypeDef.LED_Cmd & (1<<1)) == (1<<1)) { ReadTypeDef.LED_Cmd |= (1<<1);//LED_OnOn a|=1<<i;//将a的bit i置1 LED_ON(LED2); //LED_RGB_Control(254,254,0);// printf("Time_OnOff ON \r\n"); } } //标志位是否启用倒计时 if( (WirteTypeDef.Attr_Flags & (1<<2)) == (1<<2)) { if((WirteTypeDef.LED_Cmd & (1<<2))== 0) { //LED_RGB_Control(0,0,0); LED_OFF(LED3); ReadTypeDef.LED_Cmd &= ~(1<<2);//存储状态LED_OnOff a&=~(1<<i);//将a的bit i清0 printf("Count_Down_OnOff OFF \r\n"); TIM_Cmd(TIM4,DISABLE); //失能TIMx外设 time_min = 0; time_sec = 0; min_flag = 0; } if((WirteTypeDef.LED_Cmd & (1<<2)) == (1<<2)) { ReadTypeDef.LED_Cmd |= (1<<2);//LED_OnOn a|=1<<i;//将a的bit i置1 LED_ON(LED3); //LED_RGB_Control(254,254,254);// printf("Count_Down_OnOff ON \r\n"); CountDown_Minute_time=exchangeBytes(ReadTypeDef.CountDown_Minute);//重新给当前设置的值给倒计时 if(CountDown_Minute_time!=0) { TIM_Cmd(TIM4, ENABLE); //使能TIMx外设 } } } //标志位是否重复星期 if( (WirteTypeDef.Attr_Flags & (1<<3)) == (1<<3)) { ReadTypeDef.Week_Repeat=WirteTypeDef.Week_Repeat; GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 1); } //标志位定时开机 注:时间以分钟为单位1小时=60分钟=0x3c 存储的是16进制 if( (WirteTypeDef.Attr_Flags & (1<<4)) == (1<<4)) { printf("Time_On_Minute ON = %d \r\n",exchangeBytes(WirteTypeDef.Time_On_Minute)); if(exchangeBytes(WirteTypeDef.Time_On_Minute)<1441) { ReadTypeDef.Time_On_Minute=WirteTypeDef.Time_On_Minute; CountDown_Time_On_Minute=exchangeBytes(ReadTypeDef.Time_On_Minute);//存储的是高低位改变过的 GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 1); } } //标志位定时关机 if( (WirteTypeDef.Attr_Flags & (1<<5)) == (1<<5)) { printf("Time_On_Minute OFF = %d \r\n",exchangeBytes(WirteTypeDef.Time_Off_Minute)); if(exchangeBytes(WirteTypeDef.Time_Off_Minute)<1441) { ReadTypeDef.Time_Off_Minute=WirteTypeDef.Time_Off_Minute; CountDown_Time_Off_Minute=exchangeBytes(ReadTypeDef.Time_Off_Minute);//存储的是高低位改变过的 GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 1); } } //标志位倒计时 if( (WirteTypeDef.Attr_Flags & (1<<6)) == (1<<6)) { printf("CountDown_Minute T = %d \r\n",exchangeBytes(WirteTypeDef.CountDown_Minute)); if(exchangeBytes(WirteTypeDef.CountDown_Minute)<1441) { ReadTypeDef.CountDown_Minute=WirteTypeDef.CountDown_Minute; GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 1); CountDown_Minute_time=exchangeBytes(ReadTypeDef.CountDown_Minute);//当前设置的值给倒计时 if(((ReadTypeDef.LED_Cmd & (1<<2)) == (1<<2))&&(CountDown_Minute_time!=0)) { time_min = 0; time_sec = 0; min_flag = 0; TIM_Cmd(TIM4, ENABLE); //使能TIMx外设 } } } } /***************************************************** * Function Name : GizWits_GatherSensorData(); * Description : Gather Sensor Data * Input : None * Output : None * Return : None * Attention : None *****************************************************/ void GizWits_GatherSensorData(void) { // ReadTypeDef.Infrared = IR_Handle(); // DHT11_Read_Data(&curTem, &curHum); // ReadTypeDef.Temperature = (curTem + lastTem) /2; // ReadTypeDef.Humidity = (curHum + lastHum)/2; // ReadTypeDef.Temperature = ReadTypeDef.Temperature + 13;//Temperature Data Correction//根据协议,矫正数据 // lastTem = curTem; // lastHum = curHum; } /***************************************************** * Function Name : KEY_Handle * Description : Key processing function * KEY1 短按 : None * KEY1 长按 : None * KEY2 短按 : SoftAP方式配置WiFi模组 * KEY2 长按 : AirLink方式配置WiFi模组 * 4.13获取网络时间 __packed typedef struct { Pro_HeadPartTypeDef Pro_HeadPart; uint16_t year; uint8_t month; uint8_t day; uint8_t hour; uint8_t minute; uint8_t second; uint32_t other; uint8_t Sum; } Pro_W2D_GetTimeTypeDef; *****************************************************/ void KEY_Handle(void) { uint8_t Key_return =0; Key_return = ReadKeyValue(); if(Key_return & KEY_UP) { if(Key_return & PRESS_KEY1)//短按K1 { #ifdef PROTOCOL_DEBUG printf("KEY1 PRESS\r\n"); #endif GizWits_D2WGetCmd(); } if(Key_return & PRESS_KEY2)//短按K2 { #ifdef PROTOCOL_DEBUG printf("KEY2 PRESS ,Soft AP mode\r\n"); #endif //Soft AP mode, RGB red LED_RGB_Control(255, 0, 0); GizWits_D2WConfigCmd(SoftAp_Mode); NetConfigureFlag = 1; } } if(Key_return & KEY_LONG) { if(Key_return & PRESS_KEY1)//长按K1 { #ifdef PROTOCOL_DEBUG printf("KEY1 PRESS LONG ,Wifi Reset\r\n"); #endif GizWits_D2WResetCmd();//解绑WIFI } if(Key_return & PRESS_KEY2)//长按K2 { //AirLink mode, RGB Green #ifdef PROTOCOL_DEBUG printf("KEY2 PRESS LONG ,AirLink mode\r\n"); #endif LED_RGB_Control(0, 128, 0); GizWits_D2WConfigCmd(AirLink_Mode);//进入AirLink_Mode模式 NetConfigureFlag = 1; } } } /***************************************************** * Function Name : GizWits_WiFiStatueHandle * Description : Callback function , Judge Wifi statue * Input : None * Output : None * Return : Bit , Attr_Flags * Attention : *****************************************************/ void GizWits_WiFiStatueHandle(uint16_t wifiStatue) { if(((wifiStatue & Wifi_ConnClouds) == Wifi_ConnClouds) && (NetConfigureFlag == 1)) { printf("W2M->Wifi_ConnClouds\r\n"); NetConfigureFlag = 0; LED_RGB_Control(0,0,0); } } /************* (C) COPYRIGHT 2011 STMicroelectronics ****END OF FILE***/ |
main.c /** ************************************** * * @file main.c * @author Gizwtis * @version V2.3 * @date 2015-07-06 * * @brief 机智云 只为智能硬件而生 * Gizwits Smart Cloud for Smart Products * 链接|增值|开放|中立|安全|自有|自由|生态 * www.gizwits.com * APP打开,会发一条CMD03查询当前的状态命令ff ff 0 6 3 9 0 0 2 14 回复[208527] MCU : ff ff 0 10 4 9 0 0 3 0 0 0 0 0 0 0 0 0 0 20 ff ff 0 10 4 23 0 0 3 2 10 3c 0 0 0 0 0 0 0 88 如果没有收到会等待查询很久,最后提示断开连 WIFI状态改变,会把时间信息给MCU,同时MCU打开自己的RTC进行时钟,没有网络的情况下,都能正常执行预约和定时开关 **************************************/ /* Includes ------------------------------------------------------------------*/ #include "gokit.h" #include "rtc.h" /*Global Variable*/ extern _calendar_obj calendar; //日历结构体 extern Pro_W2D_GetTimeTypeDef Pro_W2D_GetTimeStruct;//获取网络时间结构体 uint16_t time_min;//分钟计时 uint32_t time_sec;//秒种计时 uint8_t min_flag;//分钟到标志 uint16_t CountDown_Minute_time; //定时器存的时间当前剩余时间 uint16_t CountDown_Time_On_Minute; //存储定时开的时间 uint16_t CountDown_Time_Off_Minute; //存储定时关的时间 uint32_t ReportTimeCount = 0; //没用到 uint8_t gaterSensorFlag = 0; //MCU收集外设信息标志,每隔1s被TIM3中断函数置位一次 uint8_t Set_LedStatus = 0; //枚举量 方式更改等颜色,这种方式下更改IoE中颜色、或者开闭灯,无效。 uint8_t NetConfigureFlag = 0; //是否 打印WiFi配置结果 的标志 uint8_t curTem = 0, curHum = 0;//DHT11数据 uint8_t lastTem = 0,lastHum = 0; //注意是head指向了读区域,tail指向了写区域 //typedef struct { // size_t rb_capacity;//缓冲区容量 // char *rb_head;//用于读出的指针 // char *rb_tail;//用于写入的指针 // char rb_buff[256];//缓冲区实体 //}RingBuffer; extern RingBuffer u_ring_buff; uint8_t p0Flag = 0;//WiFi控制设备命令,主要是CMD0X03已经下达的标志 WirteTypeDef_t WirteTypeDef; //WiFi发来的数据 MCU要接收 WIFI发过来的数据 ReadTypeDef_t ReadTypeDef; //WiFi要读取的数据 MCU要发送发给WIFI的数据 接收到的数据如果是U16以上要exchangeBytes函数转换 /** * @brief Main program. * @param None * @retval None */ int main(void) { uint8_t p0_control_buf[MAX_P0_LEN];//存储控制命令 SystemInit(); //开始初始化 HW_Init(); Printf_SystemRccClocks(); SW_Init(); while(1) { KEY_Handle(); //处理按键 GizWits_MessageHandle(p0_control_buf, sizeof(WirteTypeDef_t));//如果是控制命令,则把控制信息 放到p0_ctl_buf中 if(p0Flag == 1)//控制命令已经下达标志 { //控制信息 转存到WirteTypeDef memcpy((uint8_t *)&WirteTypeDef, p0_control_buf, sizeof(WirteTypeDef_t)); //靠WirteTypeDef来解析控制命令,控制设备 GizWits_ControlDeviceHandle(); //GizWits_DevStatusUpgrade(uint8_t *P0_Buff, uint32_t Time, uint8_t flag) GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 1);//flag=1,立即汇报 p0Flag =0; } //此标志每隔1s被TIM3中断函数置位一次 if(gaterSensorFlag != 0) { if((ReadTypeDef.LED_Cmd & (1<<1)) == (1<<1))//如果打开了定时功能才进入 { if((ReadTypeDef.Week_Repeat & ( 1<<(calendar.week-1)))==( 1<<(calendar.week-1)))//先判断星期是否是设置的。然后判断小时,分钟 { printf("t=%d",((calendar.hour*60)+calendar.min)); if(CountDown_Time_On_Minute==((calendar.hour*60)+calendar.min))//如果设置的小时数与现在的小时数相同 16进制表示 { LED_RGB_Control(254,0,0);//默认打开时,是红色 } if(CountDown_Time_Off_Minute==((calendar.hour*60)+calendar.min)) { LED_RGB_Control(0,0,0);//关灯 } } } GizWits_GatherSensorData(); //没有用到 gaterSensorFlag = 0; } GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 0);//更新数据等待定时上报 //-----------------------------{ if(min_flag)//如果启用了预约功能 { min_flag=0; CountDown_Minute_time--; if(CountDown_Minute_time<=0)//减到0 { TIM_Cmd(TIM4,DISABLE); //失能TIMx外设 time_min = 0; time_sec = 0; CountDown_Minute_time = 0; if((ReadTypeDef.LED_Cmd &(1<<0))== 0) { LED_RGB_Control(254,0,0);//打开时,是红色 LED_ON(LED1); ReadTypeDef.LED_Cmd |= (1<<0);//LED_OnOn a|=1<<i;//将a的bit i置1如果以前是关的,现在要开 printf("TIME LED ON \r\n"); } else if((ReadTypeDef.LED_Cmd &(1<<0))== (1<<0)) { ReadTypeDef.LED_Cmd &= ~(1<<0);//存储状态LED_OnOff a&=~(1<<i);//将a的bit i清0如果以前是开的,现在要关 LED_OFF(LED1); LED_RGB_Control(0,0,0); printf("TIME LED OFF \r\n"); } LED_OFF(LED3); ReadTypeDef.LED_Cmd &= ~(1<<2);//预约时间已经到了,就要关闭预约开关 GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 1); } ReadTypeDef.CountDown_Minute=exchangeBytes(CountDown_Minute_time); GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 1); } //-----------------------------} } } /** @addtogroup GizWits_HW_Init * @{ */ void HW_Init(void) { Delay_Init(72); UARTx_Init(); RGB_KEY_GPIO_Init(); RGB_LED_Init(); LED_GPIO_Init(); KEY_GPIO_Init(); TIM3_Int_Init(7199,9); //ms interrupt TIM4_Int_Init(10000,7199);//产生1s的定时TIM4_Int_Init(10000,7199); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 Motor_Init(); DHT11_Init(); IR_Init(); RTC_Init(); //RTC初始化 } /** @addtogroup GizWits_SW_Init * @{ */ void SW_Init() { ReadTypeDef.LED_Cmd = 0; ReadTypeDef.Week_Repeat = 0; ReadTypeDef.Time_On_Minute = 0; ReadTypeDef.Time_Off_Minute = 0; ReadTypeDef.CountDown_Minute = 0; GizWits_init(sizeof(ReadTypeDef_t)); printf("Gokit Init Ok ...\r\n"); } /** @addtogroup Printf_SystemRccClocks * @{ */ void Printf_SystemRccClocks(void) { uint8_t SYSCLKSource; RCC_ClocksTypeDef SystemRCC_Clocks; printf("System start...\r\n"); SYSCLKSource = RCC_GetSYSCLKSource(); if(SYSCLKSource==0x04) printf("SYSCLKSource is HSE\r\n"); else if(SYSCLKSource==0x00) printf("SYSCLKSource is HSI\r\n"); else if(SYSCLKSource==0x08) printf("SYSCLKSource is PL!\r\n"); RCC_GetClocksFreq(&SystemRCC_Clocks); printf("SYS clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.SYSCLK_Frequency/1000000); printf("HCLK clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.HCLK_Frequency/1000000); printf("PCLK1 clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.PCLK1_Frequency/1000000); printf("PCLK2_clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.PCLK2_Frequency/1000000); printf("SADCCLK_Frequencyclock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.ADCCLK_Frequency/1000000); } |
jipin 发表于 2016-8-2 20:52 可以重发下网盘地址吗?失效了 |
感谢分享 |
网盘失效 烦请楼主补一个 |
目前我也在搞这一块,加油 |
APP源码在手机上运行,进入到控制开关那页面闪退 |
有画好插座板子的原理图么 |
jipin 发表于 2016-7-29 17:45 楼主,照着这个我硬件基本搞定了,但是软件部分,实在是不会搞,能教我一下吗?有偿 |
智能插座的源码百度链接挂掉了,能再补一个嘛 |
谢谢分享 |
@jipin 您好!看你的帖子涨知识。很用心!帖子里给的百度网盘链接失效了, 可不可以把请您将新版“智能插座”源码和相关资料分享给我学习学习。邮箱: scsi_1@163.com。多谢了! |
赞一个,楼主分享的提适合新手学习的,采纳了 |
jipin 发表于 2016-8-2 20:52 楼主可以在发一次智能插座与微信宠物屋的百度云的链接吗 |
强大,顶起来 |
楼主,你好!能给你新版“智能插座”源码和相关资料分享一分吗?我的邮箱hydyguo@126.com |
楼主你好,可以问一下,这个电源外面的壳子有工模吗,哪里可以做这个电源壳子 |
WJK 发表于 2017-4-1 19:47 楼主,同上 |
楼主再分享一下源代码 |
学习了。 |
楼主,谢谢指教,百度网盘链接失效了, |
楼主,源码失效了 |
版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )