STM32+E18d80nk+Auto On/Off Device

Xin chào mọi người. Tôi đang thực hiện mô hình stm32+ cảm biến e18d80nk làm mạch đếm người trong phòng học và bật tắt thiết bị tự động. Tôi đã soạn thảo bản code mạch đếm người thành công. Nhưng tôi đang gặp khó khăn trong việc soạn thảo đoạn code khi có người vào phòng thì tự động bật thiết bị như quạt hay đèn, khi người trong phòng ra hết thì tự động tắt hết các thiết bị.
Mong mọi người giúp đỡ. Cảm ơn rất nhiều.

Hi everybody. I am making a model stm32+ sensor e18d80nk as a circuit to count people in the classroom and turn on and off the device automatically. I have compiled the code of the successful person counting circuit. But I’m having a hard time editing the code when someone enters the room, it automatically turns on devices such as fans or lights, when everyone in the room goes out, automatically turns off all devices.
Hope everybody help please. Thanks very much.

Mycode:

#include <stm32f10x.h>

static uint8_t code7seg[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
static uint32_t count = 0;


// 12_Signal Front    13_Signal Back  ->   PORT B



void GPIO_Configuration(void);
void show_7seg(uint8_t, uint32_t);
void display_7seg(uint32_t);
void delay_ms(uint32_t);
void delay_sign(void);

/*==========================================*/

/*=================== MAIN ==================*/

int main(void)
{
	GPIO_Configuration();
  while(1)
  {
/* Nguoi di vao User input  */
   	if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0 )
	{
	  GPIO_ResetBits(GPIOC, GPIO_Pin_13); 
		count++;
	  delay_sign();
  /* nguoi dung o cong - chua vao - chua ra / User not input not output*/
	   if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 0)
	   {
	   	  while(1)
		  {
			// Nguoi di vao User Input
		    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 1)
			  {
					break;
			  }
			// Nguoi di ra User output
				if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 1) 
				{
					 count--;
			     break;
				}
			display_7seg(count); 
		  }
	   }
	  delay_sign();     
	}

/* Nguoi di ra User Output */
	if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 0)
	{
		 count--;
	   delay_sign(); 
  /* nguoi dung o cong - chua vao - chua ra  User not Input not output */
	  if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0)
	   {
	   	  while(1)
		  {
			// Nguoi di vao User input
		    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 1)
			  {
			    break;		
			  }
			// Nguoi di ra User output
				if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 1)
		      {
			    	count++;
			        break; 
		      }
		  	display_7seg(count);	    
	      }
       }
      delay_sign();
     }
	 if(count == 0) GPIO_SetBits(GPIOC, GPIO_Pin_13);
   display_7seg(count);
  }
}


/*=================== END MAIN ==================*/

void GPIO_Configuration()
{
  GPIO_InitTypeDef p;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOC, ENABLE);
  
	p.GPIO_Mode = GPIO_Mode_Out_PP;
	p.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
	p.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &p);
	
	p.GPIO_Mode = GPIO_Mode_IPU;
	p.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13;
	p.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &p);
	
	p.GPIO_Mode = GPIO_Mode_Out_PP;
	p.GPIO_Pin = GPIO_Pin_13;
	p.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &p);
}

/*==========================================*/

Bạn nên thêm một cảm biến PIR xác nhận có hay không có chuyển động của người trong phòng.

2 Likes

Khi nào count = 0 thì tắt đèn, count > 0 thì bật đèn.

Ngoài luồng: mình góp ý nho nhỏ là khi nào bạn hoàn thành xong hệ thống này rồi thì nên tham khảo source code của nhiều người khác hoặc đọc thêm một số sách về thiết kế hệ thống. Mình thấy code của bạn không được “đẹp” cho lắm khi sử dụng 2 vòng while(1) lồng nhau.

Chúc bạn thành công nhé.

2 Likes

Cảm ơn bác đã chia sẻ, em là newbie với stm nên mọi thứ còn khá lỉnh kỉnh. Em xin kinh nghiệm từ những người đi trước như bác và mọi người. Hiện tại thì em gọi là đã hoàn thành tạm bợ cái mô hình trên. Cũng đang sử dụng đúng theo mục đích, nhưng cần phải cải thiện nhiều. Mong bác giúp đỡ.

Em cảm ơn bác đã góp ý. Nhưng em chưa rõ về việc phải dùng PIR xác nhận chuyển động của người trong phòng để làm gì ạ?

Để chắc chắn trong phòng có người hoặc không.
Đếm bằng e18d80nk chưa chắc đã chính xác vì có thể 2 hay nhiều người cùng bước ra hoặc bước vào.
Nếu làm dạng đồ án hay mô hình thì có thể bỏ qua yếu tố này.

2 Likes

Lại 1 lần nữa đào bới cái code củ chuối này ạ. Em đã cố gắng biến tấu nó mà không thành công. Rất mong được mọi người chỉ giáo.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?