السن

سنسور دما و رطوبت DHT22 یا AM2302 با STM32 بدون تاخیر

در این نوشته یادمیگیرید چطوری سنسور دما و رطوبت DHT22 یا AM2302 رو با STM32 راه اندازی کنید ، با برنامه ای که در اون تابع دیرکرد ( تاخیر ) وجود ندارد . چجوری ؟ با دو تایمر و دو کانال DMA میکروکنترلر STM32 . 

آشنایی با چگونگی کارکرد سنسور دما و رطوبت AM2303 / DHT22

حسگر دما و رطوبت AM2302 یا DHT22 در گلخانه های بکار میره و چهار پایه داره که سه تاش استفاده میشه .

  • پایه ی 1 : vcc = 3.3 v
  • پایه 2 : این پایه باید با یک ایستاگر ( مقاومت ) 1K بالاکش ( پول آپ ) بشه و نه حسگر و نه میکرو نباید بتونند این پایه رو به VCC ببندند.
  • پایه 4 : زمین

بسامد نمونه برداری این حسگر هم 2s هست ، هر 2 ثانیه میتونیم دما و رطوبت رو بخونیم .

 

 

چگونگی کارکرد

 

پروتکل ارتباطی این سنسور 1-wire هست ، و داده روی یک سیم جابجا میشه ، این سیم هیچ وقت نباید به VCC بسته بشه و تنها دو حالت داره:

  1. بالاکش شده ( پول آپ شده ).
  2. بوسیله ی حسگر یا میکرو به زمین بسته شده.

 

  1. برای آغاز هر اندازه گیری ، میکرو باید به اندازه 1ms پایه ی دیتا رو زمین کنه و سپس پایه رو رها میکنه تا بالاکش بشه . سپس میکرو منتظر حسگر میمونه تا باس رو زمین کنه .
  2. حسگر به اندازه ی 80us باس رو زمین میکنه و سپس 80us هم باس رو رها میکنه ، این یعنی حسگر میخواد فرستادن داده رو آغاز کنه.
  3. حسگر  40 پالس میفرسته که بیانگر 40 بیت دما و رطوبت هستند . از روی زمان یک بودن هر پالس میفهمیم بیت فرستاده شده ، یک هست یا هیچا ( صفر ) . 
  4. پس از فرستادن بیت آخر ، یک بار دیگر هم سنسور باس رو زمین میکنه و سپس باس رو رها میکنه .

بیت 1 یا 0 :

  • اگر زمان یک بودن پالس 26-28us باشه ، بیت 0 توسط سنسور DHT22 فرستاده شده .
  • اگر زمان یک بودن پالس 70us باشه ، بیت 1 توسط سنسور DHT22 فرستاده شده . 

 

در 40 بیت دریافت شده از سنسور دما و رطوبت DHT22 / AM2302 :

  • 16 بیت اول رطوبت 
  • 16 بیت دوم دما
  • 8 بیت آخر چک سام checksum

برای محاسبه ی checksum باید چهار بایت اول را جمع کنید . 8 بیت کم ارزش حاصل جمع میشه chechsum .  

 

بارگیری برنامه و راه اندازی حسگر دما و رطوبت AM2303 / DHT22 با میکروکنترلر STM32

ویژگی های برنامه ای که نوشتم :

  • فرستادن و دریافت پالس بدون دست اندرکاری CPU و به شکل سخت افزاری با کانال های تایمر انجام میشود .
  • این برنامه بدون بکارگیری کتابخونه ی HAL هست ولی شما میتونید در هر برنامه ای چه با HAL چه بدون آن، این کتابخونه رو بکاربگیرید.
  • این برنامه TIM3 و TIM4 و DMA1_CH1 و DMA1_CH4 و پایه های PB4 و PB6 رو بکارمیگیره ، در بخش های دیگه ی برنامه ی خودتون هیچ کاری درباره ی این بخش ها نکنید .

 

بارگیری برنامه راه اندازی سنسور دما و رطوبت AM2303 / DHT22 از گیت هاب

 

گام به گام راه اندازی :

  1. فایل am.c را در پوشه ی src و فایل am.h را در پوشه ی header بگذارید.
  2. فایل am.h را بر فایل main.c افزون کنید (include کنید) . 
  3. کارنوشت ( تابع ) am_init را در کارنوشت main فراخوانی کنید.
  4. دما و رطوبت بصورت خودکار در دو پویای جهانی ( متغیر گلوبال ) به نام های am_RH و am_TMP نوشته میشود .

اگر میخواهید یادبگیرید که از پایه چجوری باید این کتابخونه رو بنویسید ، دوره ی آموزش پیشرفته ی STM32F103 رو ببینید .

تفاوت STM32 و AVR در راه اندازی سنسور دما و رطوبت AM2302 / DHT22

 

چون میکروکنترلر AVR ، تایمر و DMA میکروکنترلر STM32 رو نداره ، باید از CPU برای راه اندازی سنسور استفاده بشه ، یعنی چی ؟ یعنی باید برای انجام کارها ، CPU برنامه این رو اجرا کنه . مشکل اینجاست که خیلی ها همون برنامه ی آردوئینو و AVR رو میان با STM32 هم اجرا میکنند.

به برنامه ی زیر توجه کنید ، که برای فرستادن پالس استارت توسط میکروکنترلر هست :

  1. CPU پایه رو در حالت خروجی میگذارد. 
  2. CPU پایه را هیچا ( صفر ) میکند . 
  3. CPU در کارنوشت دیرکرد ( تابع تاخیر ) ، صبر میکند تا زمان بگذرد.
  4. CPU دوباره پایه را یک میکند . 
  5. CPU به اندازه 20 us دوباره در کارنوشت دیرکرد ( تابع تاخیر ) صبر میکند .
  6. CPU پین را در حالت ورودی تنظیم میکند تا پس از این پالس های دریافتی از سنسور را بخواند.

 

برای دریافت جهند ها ( پالس ) هم همین آش است و همین کاسه و CPU باید همه ی کارها را انجام دهد .

به این کار میگونید پیاده سازی نرم افزاری ، چون باید نرم افزاری ( کد ) نوشته بشه و CPU اون رو اجرا کنه . مشکلش این هست که زمان CPU رو میگیره و هنگامی که شما سنسور های بیشتری دارید یا میکروکنترلر باید کارهای دیگری هم انجام بدهد مشکل ساز میشه. 

به همین خاطر هست که پروژه های آردوئینویی ، تنهایی کار میکنند ولی وقتی در یک پروژه ی بزرگتر قرار بگیرند ، مشکل آفرین هستند.

بسیاری از کد های آموزش راه اندازی AM2302 / DHT22 با میکروکنترلر STM32 هم ، با روش نرم افزاری پیاده سازی شده اند و کپی کد های آردوئینو هستند که بسیار اشتباهه.

 

روش سخت افزاری راه اندازی AM2302 / DHT22  با تایمر و DMA  میکروکنترلر STM32

در ” دوره آموزش پیشرفته ی STM32F103 ” پیاده سازی سخت افزاری رو هم با بکارگیری اینتراپت و هم با DMA گفتم ، اینجا تنها با روش DMA آَشنا میشید. این امکانات میکروکنترلر STM32 رو میخواهم بکار بگیرم:

  • کانال 1 تایمر 4 در گونش ( حالت ) input capture تا هر زمان لبه پایین رونده روی پایه ی دیتا هست ، مقدار رجیستر شمارنده رو در خودش نگه داره .
  • کانال 1 از DMA1 تا هر زمان کانال 1 تایمر 4 لبه پایین رونده دریافت کرد ، برود و  مقدار نوشته شده در رجیستر CCR1 را به آرایه ای در یادگاه ( حافظه ) ببرد ، چون در لبه ی پایین رونده ی پسین ( بعدی ) در رجیستر CCR1 ، مقداری نو نوشته میشود .
  • کانال 2 تایمر 4 در گونش input capture تا هر زمان لبه ی بالارونده روی پایه ی دیتای سنسور AM2303 / DHT22 بود ، مقدار رجیستر شمارنده ی تایمر 4 در رجیستر CCR2  نوشته شود .
  • کانال 4 از DMA1 تا هر زمان کانال 2 تایمر 4 لبه ی بالارونده یافت ، برود و مقدار رجیستر CCR2 را به آرایه ای در یادگاه ( حافظه ) ببرد ، چون در لبه ی بالارونده ی پسین ( بعدی ) اندازه ای نو در رجیستر CCR2 نوشته میشود .

دو کانال تایمر 4 و دو کانال DMA1 رو برای دریافت جهند ( پالس ) ها بکار گرفتم . تایمر 3 هم : 

  • تایمر 3 برای آغاز بکار کردن تایمر 4 هر 2 ثانیه . تایمر 3 master و تایمر 4 slave است. 
  • کانال 1 تایمر 3 برای فرستادن پالس استارت به سنسور AM2303 / DHT22  هر 2 ثانیه .

حالا تنها در پایان نمونه برداری ، CPU باید برود و از روی زمان های لبه های بالارونده و پایین رونده که کانال های DMA1 به آرایه هایی در یادگاه برده اند ، زمان یک بودن هر جهند ( پالس ) را بدست بیاورد و بفهمد که سنسور DHT22  چه عدد فرستاده است . 

ولی در پیاده سازی با روش آردوئینویی ، CPU از آغاز تا پایان نمونه برداری درگیر کار هست .

 

نوشتن این کتابخونه خیلی نکات ریزی داره ، آموزش کاملش به انگلیسی رو در یوتوب گذاشتم ، آموزش کامل به چند روش هم با اینتراپت و هم با DMA هم در دوره آموزش پیشرفته ی STM32F1 هست . 

  • التراسونیک = فراسدا .
  • فاصله سنج = دوری سنج .
  • جهند = پالس .
  • پیرارونگ = رونگ پیرامونی = مدار جانبی = پریفرال 
  • کارگون = حالت کاری

دیدگاه‌ خود را بنویسید

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

پیمایش به بالا