#include "led.h"
#include "delay.h"
#include "sys.h"
#include "stm32f10x.h"
#include "stdio.h"
#include "usart.h"
#include "adc.h"
#include "oled.h"
#include "ds18b20.h"
#include "HX711.h"

#define HwInput PBin(7) //���⴫�������� 
#define KEY1 PAin(0)    // �ֶ����Ƽ���
#define JR_OUT_PIN PBout(12) //���Ƽ������
#define CS_OUT_PIN PBout(13) //���Ƴ�ˮ ��ŷ�

void Hw_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //ʹ�ܶ˿�ʱ��
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;				 // �˿�����
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 		 //��������
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO���ٶ�Ϊ50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //�����趨������ʼ��GPIOC13
}

#define Trig PBout(10) // ���������
#define CW_ECHO1 PBin(11)

u16 Distance=0;
//�������˿ڳ�ʼ��
void Wave_IO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	NVIC_InitTypeDef NVIC_InitStructure; 

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB , ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;					       //PB0��TRIG
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		     //��Ϊ�������ģʽ
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	         
	GPIO_Init(GPIOB, &GPIO_InitStructure);	                 //��ʼ������GPIO 
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				         //��ECH0
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		 //������
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
    TIM_DeInit(TIM2);
    TIM_TimeBaseStructure.TIM_Period=65535;		 								/* �Զ���װ�ؼĴ������ڵ�ֵ(����ֵ) */
    /* �ۼ� TIM_Period��Ƶ�ʺ����һ�����»����ж� */
    TIM_TimeBaseStructure.TIM_Prescaler= (360 - 1);				                /* ʱ��Ԥ��Ƶ�� 72M/360 */
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 		                /* ������Ƶ */
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;                   /* ���ϼ���ģʽ */
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);							    		/* �������жϱ�־ */
		
		
  //  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  													
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;	  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;	
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
	
	//TIM2_NVIC_Configuration();//��ʱ����ʼ��
	//TIM2_Configuration();			
}


//void TIM2_IRQHandler() 
//{					  
//	static  u8 st;
//	st=TIM_GetFlagStatus(TIM2, TIM_IT_Update);
//	if(st!=0)
//	{  
//		TIM_ClearFlag(TIM2, TIM_IT_Update);
//	}
//}
//���
//��ʼ��࣬����һ��>10us�����壬Ȼ��������صĸߵ�ƽʱ��
u16 Wave_Start(void)
{
	u32  Distance;
	u32  timeout=0;
  Trig=1;
  delay_us(20);              //����һ��10us�ĸߵ�ƽ
  Trig=0;
	TIM_SetCounter(TIM2,0);	
	timeout=0;
	while(!CW_ECHO1)	             //�ȴ��ߵ�ƽ
	{
	    if(++timeout>60000)break;
			delay_us(1); 
	}
  TIM_Cmd(TIM2, ENABLE);             //����ʱ��
	timeout=0;
  while(CW_ECHO1)             //�ȴ��͵�ƽ
	{
			if(++timeout>600000)break;
			delay_us(1); 
	}
  TIM_Cmd(TIM2, DISABLE);			                             //��ʱ��2ʧ��
  Distance=TIM_GetCounter(TIM2)*5*34/2000;								 //�������	����cm
  TIM_SetCounter(TIM2,0);	
	if(Distance>200)Distance=200;
  return Distance;
}

u8 jr_flag=0;
u8 get_cnt=0;
u8 hw_cnt=0;
u8 cs_out_flag=0; //��ˮ��־
u16 sw_val=0;//ˮλֵ
u8 cs_out_zs_flag=0;//��ˮ������־λ
char showbuff[16];
short temp_val=0;
u8 mode_flag=0; 

int main(void)
{	 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//�����ж����ȼ�����Ϊ��2��2λ��ռ���ȼ���2λ��Ӧ���ȼ�
	delay_init();	    	 //��ʱ������ʼ��	  
 	LED_Init();		  			//��ʼ����LED���ӵ�Ӳ���ӿ�
	uart_init(9600);
	ADC1_Init();
	OLED_Init();
	OLED_Clear();
	Hw_Init();
	DS18B20_Init();
	Wave_IO_Init();
 	while(1)
	{	 		

				
				if(++get_cnt>100) //�ɼ�ʱ������� 
				{
					 get_cnt=0;
					 temp_val = DS18B20_Get_Temp();//�ɼ��¶�ֵ
					 sprintf(showbuff,"temp:%2d.%1d",temp_val/10,temp_val%10); //��ӡ���ַ���
					 OLED_ShowString(0,2,(u8*)showbuff,16); //��ʾ 
				}		
		if(mode_flag) //�Զ�ģʽ
		{
				if(HwInput==0) //����Ƿ��б���
				{
					 if(++hw_cnt>20) //����100ms  
					 {
							sw_val = Wave_Start();
							if(sw_val>4)
							{
								 CS_OUT_PIN=0;//���Ƴ�ˮ
							}else
							{
								 CS_OUT_PIN=1;//ֹͣ��� 
							}
							cs_out_flag=1;
					 }
				}else
				{
						 hw_cnt=0;
						 cs_out_flag=0;
						 CS_OUT_PIN=1;//ֹͣ��� 
				}
				
				if(jr_flag) //���ȿ���flag
				{
						JR_OUT_PIN=0;
						OLED_ShowString(0,4,(u8*)"heater:on ",16); //��ʾ 
				}else
				{
						JR_OUT_PIN=1;
						OLED_ShowString(0,4,(u8*)"heater:off",16); //��ʾ 
				}
	}else //�ֶ�ģʽ
	{
		  	if(KEY1==0)  //�������  
				{
					 delay_ms(5);
					 if(KEY1==0)
					 {
						 jr_flag^=1;  //���Ƽ���
						 while(!KEY1); //�ȴ����� 
					 }
				}
	}
	delay_ms(5);//��ʱ
		
	} 
}