main.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "stm32f10x.h"
  5. #include "stdio.h"
  6. #include "key.h"
  7. #include "usart.h"
  8. #include "drive_dht11.h"
  9. #include "bh1750.h"
  10. #include "ds1302.h"
  11. #include "oled.h"
  12. #include "sk9822.h"
  13. u8 humi=0;//湿度值
  14. u8 temp=0;//温度值
  15. u8 buffer[10]={0};
  16. u16 GzVal=0; //实际光照值
  17. char ShowBuf[16]={0};
  18. char DateShowBuf[30]={0};
  19. char SendBuff[50]={0};
  20. short TEMP = 0;
  21. u16 cj_val=0;//测距值
  22. u8 openflag=0;//手动模式开关按钮
  23. u8 mode_flag=0;
  24. u16 GetTimer=0;//采集时间计数器
  25. u8 dw_val=0;//挡位//亮度值
  26. u8 sc_val=0;//色彩
  27. int set_s1=7,set_f1=0; //设置 时间1
  28. int cnt_s1=0,cnt_f1=0,cnt_m1=0;//学习时间 时分秒
  29. #define RT_INPUT PBin(1)//人体红外感应
  30. #define KEY_GPIO_PROT GPIOA
  31. #define KEY1_GPIO_PIN GPIO_Pin_0
  32. #define KEY2_GPIO_PIN GPIO_Pin_1
  33. #define KEY3_GPIO_PIN GPIO_Pin_2
  34. #define KEY4_GPIO_PIN GPIO_Pin_3
  35. #define KEY5_GPIO_PIN GPIO_Pin_4
  36. #define KEY1_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY1_GPIO_PIN)
  37. #define KEY2_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY2_GPIO_PIN)
  38. #define KEY3_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY3_GPIO_PIN)
  39. #define KEY4_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY4_GPIO_PIN)
  40. #define KEY5_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY5_GPIO_PIN)
  41. void key_gpio_init(void)
  42. {
  43. GPIO_InitTypeDef GPIO_InitStructure;
  44. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
  45. GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN|KEY2_GPIO_PIN|KEY3_GPIO_PIN|KEY4_GPIO_PIN|KEY5_GPIO_PIN;
  46. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  47. GPIO_Init(KEY_GPIO_PROT, &GPIO_InitStructure);
  48. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  49. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  50. GPIO_Init(GPIOA, &GPIO_InitStructure);
  51. }
  52. #define Trig PBout(10) // 超声波测距
  53. #define CW_ECHO1 PBin(11)
  54. u16 Distance=0;
  55. //超声波端口初始化
  56. void Wave_IO_Init(void)
  57. {
  58. GPIO_InitTypeDef GPIO_InitStructure;
  59. // NVIC_InitTypeDef NVIC_InitStructure;
  60. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  61. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
  62. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB , ENABLE);
  63. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB0接TRIG
  64. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设为推挽输出模式
  65. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  66. GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化外设GPIO
  67. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //接ECH0
  68. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设为输入
  69. GPIO_Init(GPIOB, &GPIO_InitStructure);
  70. TIM_DeInit(TIM2);
  71. TIM_TimeBaseStructure.TIM_Period=65535; /* 自动重装载寄存器周期的值(计数值) */
  72. /* 累计 TIM_Period个频率后产生一个更新或者中断 */
  73. TIM_TimeBaseStructure.TIM_Prescaler= (360 - 1); /* 时钟预分频数 72M/360 */
  74. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; /* 采样分频 */
  75. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /* 向上计数模式 */
  76. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  77. TIM_ClearFlag(TIM2, TIM_FLAG_Update); /* 清除溢出中断标志 */
  78. // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  79. // NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  80. // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  81. // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  82. // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  83. // NVIC_Init(&NVIC_InitStructure);
  84. //
  85. //TIM2_NVIC_Configuration();//定时器初始化
  86. //TIM2_Configuration();
  87. }
  88. //void TIM2_IRQHandler()
  89. //{
  90. // static u8 st;
  91. // st=TIM_GetFlagStatus(TIM2, TIM_IT_Update);
  92. // if(st!=0)
  93. // {
  94. // TIM_ClearFlag(TIM2, TIM_IT_Update);
  95. // }
  96. //}
  97. //测距
  98. //开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
  99. u16 Wave_Start(void)
  100. {
  101. u32 Distance;
  102. u32 timeout=0;
  103. Trig=1;
  104. delay_us(20); //输入一个10us的高电平
  105. Trig=0;
  106. TIM_SetCounter(TIM2,0);
  107. timeout=0;
  108. while(!CW_ECHO1) //等待高电平
  109. {
  110. if(++timeout>60000)break;
  111. delay_us(1);
  112. }
  113. TIM_Cmd(TIM2, ENABLE); //开启时钟
  114. timeout=0;
  115. while(CW_ECHO1) //等待低电平
  116. {
  117. if(++timeout>600000)break;
  118. delay_us(1);
  119. }
  120. TIM_Cmd(TIM2, DISABLE); //定时器2失能
  121. Distance=TIM_GetCounter(TIM2)*5*34/2000; //计算距离 厘米cm
  122. TIM_SetCounter(TIM2,0);
  123. if(Distance>200)Distance=200;
  124. return Distance;
  125. }
  126. void TIMER3_Int_Init(u16 arr,u16 psc)
  127. {
  128. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
  129. NVIC_InitTypeDef NVIC_InitStructure;
  130. TIM_TimeBaseInitStrue.TIM_Period=arr;
  131. TIM_TimeBaseInitStrue.TIM_Prescaler=psc;
  132. TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;
  133. TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CounterMode_Up;
  134. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  135. TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);
  136. TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//使能TIM3更新中断
  137. //中断优先级NVIC设置
  138. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
  139. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
  140. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
  141. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  142. NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
  143. TIM_Cmd(TIM3, ENABLE); //使能TIMx
  144. }
  145. int key_Task(void)
  146. {
  147. static char key_flag=0;
  148. if(KEY1_IN==0|KEY2_IN==0|KEY3_IN==0|KEY4_IN==0)
  149. {
  150. if(key_flag==0)
  151. {
  152. key_flag=1;
  153. if(KEY1_IN==0)
  154. {
  155. mode_flag^=1;
  156. }
  157. else if(KEY2_IN==0)
  158. {
  159. if(mode_flag==0)
  160. {
  161. if(++dw_val>2)dw_val=0;
  162. }else
  163. {
  164. }
  165. }
  166. else if(KEY3_IN==0)
  167. {
  168. if(mode_flag==0)
  169. {
  170. if(++sc_val>2)sc_val=0;
  171. }else
  172. {
  173. }
  174. }
  175. else if(KEY4_IN==0)
  176. {
  177. if(mode_flag==0)
  178. {
  179. openflag^=1;//开关按钮
  180. }else
  181. {
  182. }
  183. }
  184. }
  185. }else
  186. {
  187. key_flag=0;
  188. }
  189. return 20;
  190. }
  191. u16 DataUpTime=0;//时间显示计数器
  192. u8 rt_flag=0;//红外人体标志位
  193. u16 rt_cnt=0;
  194. u8 seccnt=0;
  195. void TIM3_IRQHandler(void)//中断服务程序
  196. {
  197. if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)//SET为1
  198. {
  199. GetTimer++;//采集计数器
  200. TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIM3的更新中断标志
  201. key_Task();
  202. DataUpTime++;
  203. if(RT_INPUT==1) //检测人体感应
  204. {
  205. rt_flag=1;
  206. rt_cnt=0;
  207. }else
  208. {
  209. if(rt_cnt++>100*10)
  210. {
  211. rt_cnt=0;rt_flag=0;
  212. }
  213. }
  214. if(rt_flag) //有人 开始计时计算学习时间
  215. {
  216. if(++seccnt>50)
  217. {
  218. seccnt=0;
  219. if(++cnt_m1>59)
  220. {
  221. cnt_m1=0;
  222. if(++cnt_f1>59)
  223. {
  224. cnt_f1=0;
  225. if(++cnt_s1>23)
  226. {
  227. cnt_s1=0;
  228. }
  229. }
  230. }
  231. }
  232. }
  233. }
  234. }
  235. u8 GetFlag=0;
  236. uint8_t sendBuff[16]={0};
  237. void ShowTo(char* Pdat,char len)//字符串中的空格补 0
  238. {
  239. char ixd=0;
  240. for(ixd=0;ixd<len;ixd++)
  241. {
  242. if(Pdat[ixd]==' ')
  243. {
  244. Pdat[ixd]='0';
  245. }
  246. }
  247. }
  248. int main(void)
  249. {
  250. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  251. delay_init(); //延时函数初始化
  252. LED_Init(); //初始化与连接的硬件接口
  253. uart_init(115200);
  254. delay_ms(1000);
  255. TIMER3_Int_Init(20000,71);//定时器初始化 //10ms进一次中断
  256. Wave_IO_Init();
  257. BH1750_Init();
  258. OLED_Init();//液晶初始化
  259. OLED_Clear();//液晶清屏
  260. delay_ms(10);//上电延时一会
  261. key_gpio_init();
  262. Ds1302_Gpio_Init();
  263. SK9822_Intit();
  264. SK9822_Write_Data(0xf0,0x55,0xa0,0x0f);
  265. while(1)
  266. {
  267. if(GetTimer>50)//1S
  268. {
  269. GetTimer=0;
  270. if(dht11_read_data(buffer) == 0)//读取温湿度
  271. {
  272. humi = buffer[0] + buffer[1] / 10;//取湿度值
  273. temp = buffer[2] + buffer[3] / 10;//取温度值
  274. }
  275. GzVal = Dispose();//读取光照
  276. cj_val=Wave_Start();
  277. if(cj_val<10)
  278. {
  279. OLED_ShowText(0,6,"坐姿:异常",0);
  280. }else
  281. {
  282. OLED_ShowText(0,6,"坐姿:正常",0);
  283. }
  284. printf("drv_X%dH%dD%dZ\r\n",temp,humi,GzVal);//发送到上位机app
  285. }
  286. if(DataUpTime>20) //400ms刷新一次数据
  287. {
  288. DataUpTime=0;//
  289. Ds1302_Readtime();
  290. sprintf((char*)DateShowBuf,"时间:%2d:%2d:%2d", (int)ds1302Data.hour, (int)ds1302Data.min, (int)ds1302Data.sec);
  291. ShowTo(DateShowBuf,9);
  292. OLED_ShowText(0,0,DateShowBuf,0);
  293. sprintf((char*)DateShowBuf,"闹钟:%2d:%2d:00", (int)set_s1, (int)set_f1);
  294. ShowTo(DateShowBuf,10);
  295. OLED_ShowText(0,2,DateShowBuf,0);
  296. sprintf((char*)DateShowBuf,"学习:%2d:%2d:%2d", (int)cnt_s1, (int)cnt_f1,cnt_m1);
  297. ShowTo(DateShowBuf,10);
  298. OLED_ShowText(0,4,DateShowBuf,0);
  299. if(ds1302Data.hour==set_f1&&ds1302Data.min==set_s1) //到达闹钟时间
  300. {
  301. }
  302. else
  303. {
  304. }
  305. }
  306. if(mode_flag)//自动模式
  307. {
  308. if(rt_flag) //有人
  309. {
  310. }
  311. else //没人
  312. {
  313. }
  314. }else{ //手动模式
  315. }
  316. }
  317. }