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

پیوند های این نوشته :
- آموزش نماوایی ( ویدئویی ) راه اندازی تند کتابخانه ی AM2303 / DHT22 با STM32 در یوتوب به انگلیسی
- آموزش نماوایی ( ویدئویی ) به زبان انگلیسی : نوشتن کتابخانه راه اندازی AM2303 / DHT22 با STM32 بدون تابع تاخیر و با 2 تایمر و 2 کانال DMA در یوتوب به انگلیسی
- آموزش فارسی راه اندازی AM2303 / DHT22 در دوره آموزش پیشرفته ی STM32F1
- بارگیری برنامه AM2303 / DHT22 با STM32f103 از گیت هاب
آشنایی با چگونگی کارکرد سنسور دما و رطوبت AM2303 / DHT22
حسگر دما و رطوبت AM2302 یا DHT22 در گلخانه های بکار میره و چهار پایه داره که سه تاش استفاده میشه .
- پایه ی 1 : vcc = 3.3 v
- پایه 2 : این پایه باید با یک ایستاگر ( مقاومت ) 1K بالاکش ( پول آپ ) بشه و نه حسگر و نه میکرو نباید بتونند این پایه رو به VCC ببندند.
- پایه 4 : زمین
بسامد نمونه برداری این حسگر هم 2s هست ، هر 2 ثانیه میتونیم دما و رطوبت رو بخونیم .

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

- برای آغاز هر اندازه گیری ، میکرو باید به اندازه 1ms پایه ی دیتا رو زمین کنه و سپس پایه رو رها میکنه تا بالاکش بشه . سپس میکرو منتظر حسگر میمونه تا باس رو زمین کنه .
- حسگر به اندازه ی 80us باس رو زمین میکنه و سپس 80us هم باس رو رها میکنه ، این یعنی حسگر میخواد فرستادن داده رو آغاز کنه.
- حسگر 40 پالس میفرسته که بیانگر 40 بیت دما و رطوبت هستند . از روی زمان یک بودن هر پالس میفهمیم بیت فرستاده شده ، یک هست یا هیچا ( صفر ) .
- پس از فرستادن بیت آخر ، یک بار دیگر هم سنسور باس رو زمین میکنه و سپس باس رو رها میکنه .
بیت 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 از گیت هاب
گام به گام راه اندازی :
- فایل am.c را در پوشه ی src و فایل am.h را در پوشه ی header بگذارید.
- فایل am.h را بر فایل main.c افزون کنید (include کنید) .
- کارنوشت ( تابع ) am_init را در کارنوشت main فراخوانی کنید.
- دما و رطوبت بصورت خودکار در دو پویای جهانی ( متغیر گلوبال ) به نام های am_RH و am_TMP نوشته میشود .
اگر میخواهید یادبگیرید که از پایه چجوری باید این کتابخونه رو بنویسید ، دوره ی آموزش پیشرفته ی STM32F103 رو ببینید .
تفاوت STM32 و AVR در راه اندازی سنسور دما و رطوبت AM2302 / DHT22
چون میکروکنترلر AVR ، تایمر و DMA میکروکنترلر STM32 رو نداره ، باید از CPU برای راه اندازی سنسور استفاده بشه ، یعنی چی ؟ یعنی باید برای انجام کارها ، CPU برنامه این رو اجرا کنه . مشکل اینجاست که خیلی ها همون برنامه ی آردوئینو و AVR رو میان با STM32 هم اجرا میکنند.
به برنامه ی زیر توجه کنید ، که برای فرستادن پالس استارت توسط میکروکنترلر هست :
- CPU پایه رو در حالت خروجی میگذارد.
- CPU پایه را هیچا ( صفر ) میکند .
- CPU در کارنوشت دیرکرد ( تابع تاخیر ) ، صبر میکند تا زمان بگذرد.
- CPU دوباره پایه را یک میکند .
- CPU به اندازه 20 us دوباره در کارنوشت دیرکرد ( تابع تاخیر ) صبر میکند .
- 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 هست .
- التراسونیک = فراسدا .
- فاصله سنج = دوری سنج .
- جهند = پالس .
- پیرارونگ = رونگ پیرامونی = مدار جانبی = پریفرال
- کارگون = حالت کاری

