پروژه های AVR, پروژه‌ها

پروژه راه اندازی سنسور دیجیتال رطوبت HS1101 با استفاده از مجموعه آموزشی AVR WIZARD توسط برد پلاریس به زبان C

فهرست مطالب

راهنمای راه اندازی سنسور دیجیتال رطوبت HS1101 با استفاده از مجموعه آموزشی AVR WIZARD به زبان C.

هدف از این آموزش راه‌اندازی سنسور HS1101 و خواندن تغییرات فرکانس توسط ورودی میکروکنترلر به زبان  C  توسط مجموعه آموزشی AVR WIZARD می‌باشد.

(شما می‌توانید سنسور‌های مشابه دیجیتال که خروجی آنها تغییرات فرکانس می‌باشد را به این روش راه‌اندازی نمایید. )

قطعات مورد نیاز:

سنسور HS1101

سسنسور رطوبت خازنی HS1101 بر اساس تغییر ظرفیت خازن عمل می‌کند. یعنی با تغییر رطوبت محیط اطراف سنسور، ظرفیت خازنی سنسور تغییر کرده و از این طریق می‌توان مقدار رطوبت را اندازه‌گیری نمود.

سنسور‌های رطوبت کاربردهای وسیعی در صنعت داشته و دارند، برای مثال در سیستم های کنترل تهویه کارخانجات و انبارها  استفاده می‌شوند.

 
شکل 1. سنسور HS1101

مدار سنسور HS1101

برای راه‌اندازی سنسورهای خازنی باید آنها را در یک مدار اسیلاتور قرار داد، بدین‌صورت که با تغییر رطوبت، مقدار خازن سنسور تغییر کرده و فرکانس خروجی نوسان‌ساز تغییر می‌کند.

یکی از بهترین و راحت‌ترین روش‌های ساخت نوسان‌ساز استفاده از آیسی معروف 555 است. تغییر رطوبت باعث تغییر خازن، و تغییر مقدار خازن باعث تغییر فرکانس خروجی تولید شده توسط 555 خواهد شد.

یک نمونه مدار پیشنهادی توسط سازنده به صورت زیر می‌باشد:

 
شکل 2. مدار راه‌انداز HS1101

نحوه اتصال  سنسور HS1101 به برد SENSOR SHIELD مجموعه AVR WIZARD

در برد‌شیلد سنسور موسوم به SENSOR SHIELD مدار راه‌انداز این سنسور طراحی شده‌است و کاربر می‌تواند به راحتی شروع به کدنویسی کند.

شکل3. محل قرار‌گیری سنسور HS1101

نحوه برنامه‌نویسی و خواندن مقادیر سنسور HS1101

برای خواندن فرکانس خروجی از سنسور HS1101 در اینجا از تایمر 0 و وقفه خارجی میکرو استفاده کرده‌ایم.

بدین‌صورت که با محاسبه بازه زمانی یک و صفر بودن پالس ورودی با استفاده از تایمر 0 ، میزان فرکانس را بدست آورده و بر‌روی LCD نمایش می‌دهیم:

 

شکل 4. نمایش میزان فرکانس روی LCD

کد برنامه به زبان C

				
					 
#include <mega16a.h>
 
#include <delay.h>
 
// Alphanumeric LCD functions
#include <alcd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Declare your global variables here
 char   apply_rising=1;  
 unsigned long int t0_ovf=0; 
 unsigned long int high_time=0;
 unsigned long int low_time=0;              
 unsigned  char freq[30];
// External Interrupt 1 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
TCCR0=0;
if(apply_rising==1)
{
  low_time=t0_ovf*256+TCNT0;
  // INT1 Mode: Falling Edge 
  MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);             
  apply_rising=0;
 
else
{
  high_time=t0_ovf*256+TCNT0;
  // INT1 Mode: Rising Edge  
  MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (1<<ISC00); 
  apply_rising=1;
}
 TCNT0=0x00;
 t0_ovf=0;
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (1<<CS01) | (1<<CS00);
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
 t0_ovf++;
}
void main(void)
{
float FREQUENCY,cycle;
// Declare your local variables here
 
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
 
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
 
// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
 
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
 
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// INT2: Off
 
MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (1<<ISC00);
MCUCSR=(0<<ISC2);
GIFR=(0<<INTF1) | (1<<INTF0) | (0<<INTF2);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 250.000 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
// Timer Period: 1.024 ms
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0=0x00;
 
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);
 
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTB Bit 0
// RD - PORTB Bit 1
// EN - PORTB Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 16
lcd_init(16);
// Global enable interrupts
#asm("sei")
 lcd_clear();
 lcd_putsf("   HI Welcom");   
 delay_ms(2000);
while (1)
      {    
         lcd_clear();   
         lcd_putsf("www.redronic.com");  
         #asm("cli");  
         cycle=(float)(high_time+low_time)*0.000004;  //.000004 TIMER COUNT PRIOD
         #asm("sei");
         FREQUENCY=1/cycle;                               // frequency calculation
         ftoa(FREQUENCY,0,freq); 
         lcd_gotoxy( 0 ,1); 
         lcd_putsf("HS1101:"); 
         lcd_gotoxy(9 ,1);             
         lcd_puts(freq); 
); 
         lcd_putsf("Hz");   
         delay_ms(5000);
      
      }
}
				
			

خروجی برنامه

نظرتان را درباره این مقاله بگویید 1 نظر

پروژه راه اندازی سنسور دیجیتال رطوبت HS1101 با استفاده از مجموعه آموزشی AVR WIZARD توسط برد پلاریس به زبان C

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

ده + 8 =