آموزش BASCOM AVR – بسکام – جلسه دهم
خیلی خب 🌟
حالا میریم سراغ جلسه دهم و این بار هم مفصل و کامل مینویسم تا شبیه یک فصل آموزشی باشه.
📘 آموزش BASCOM AVR – بسکام – جلسه دهم
حافظه EEPROM
۱. مقدمه
تا اینجا یاد گرفتیم دادهها را در RAM ذخیره کنیم یا روی LCD نمایش دهیم. اما مشکل RAM این است که با قطع برق همه دادهها پاک میشوند. برای ذخیره اطلاعات دائمی مثل رمز عبور، شماره تلفن یا تنظیمات دستگاه باید از EEPROM استفاده کنیم.
EEPROM مخفف Electrically Erasable Programmable Read-Only Memory است. این حافظه داخل میکروکنترلر قرار دارد و دادهها حتی بعد از قطع برق باقی میمانند.
۲. ویژگیهای EEPROM
- ظرفیت معمولی در ATmega32: ۱ کیلوبایت.
- دادهها به صورت بایت ذخیره میشوند.
- سرعت نوشتن کندتر از RAM است.
- تعداد دفعات نوشتن محدود (حدود ۱۰۰ هزار بار).
- مناسب برای ذخیره تنظیمات و دادههای مهم.
۳. دستورات EEPROM در BASCOM
Writeeeprom Value , Address→ نوشتن مقدار در آدرس مشخص.Readeeprom Variable , Address→ خواندن مقدار از آدرس مشخص.Eraseeeprom→ پاک کردن کل حافظه EEPROM.
۴. کدنویسی در BASCOM
مثال: ذخیره و خواندن داده
' پروژه ذخیره داده در EEPROM
$regfile = "m32def.dat"
$crystal = 1000000
Dim A As Byte
Writeeeprom 123 , 10 ' ذخیره عدد 123 در آدرس 10
Readeeprom A , 10 ' خواندن عدد از آدرس 10
Do
Locate 1 , 1
Lcd "Value=" ; A
Loop
End
توضیح: عدد 123 در آدرس 10 ذخیره میشود و سپس خوانده شده و روی LCD نمایش داده میشود.
۵. پروژه عملی: ذخیره رمز عبور
کد:
Dim Pass As String * 4
Dim InputPass As String * 4
' ذخیره رمز عبور پیشفرض
Writeeeprom "1234" , 0
' خواندن رمز عبور
Readeeprom Pass , 0
Do
InputPass = ""
InputPass = "1234" ' فرضاً از کیپد خوانده شده
If InputPass = Pass Then
Lcd "Access OK"
Else
Lcd "Denied"
End If
Loop
End
توضیح: رمز عبور “1234” در EEPROM ذخیره میشود. سپس کاربر رمز وارد میکند و برنامه بررسی میکند درست است یا نه.
۶. پروژه عملی: ذخیره تنظیمات
فرض کنید میخواهیم شدت نور LED را ذخیره کنیم تا بعد از قطع برق دوباره همان مقدار تنظیم شود.
کد:
Dim Bright As Byte
' خواندن مقدار ذخیرهشده
Readeeprom Bright , 5
Do
Pwm1a = Bright
Wait 1
' فرضاً کاربر مقدار جدید وارد کند
Bright = 200
Writeeeprom Bright , 5
Loop
End
توضیح: مقدار Bright از EEPROM خوانده میشود و برای PWM استفاده میشود. اگر کاربر مقدار جدید وارد کند، در EEPROM ذخیره میشود.
۷. نکات عملی
- همیشه قبل از نوشتن در EEPROM بررسی کنید که مقدار تغییر کرده باشد؛ چون تعداد دفعات نوشتن محدود است.
- برای ذخیره رشتهها (String) باید آدرسهای متوالی استفاده کنید.
- اگر دادههای زیادی دارید، بهتر است یک جدول آدرس طراحی کنید.
۸. تمرینها
- برنامهای بنویسید که یک عدد را از کاربر بگیرد و در EEPROM ذخیره کند.
- برنامهای بسازید که رمز عبور را ذخیره کند و بعد از قطع برق همچنان معتبر باشد.
- یک تنظیمات ساده (مثل شدت نور LED) ذخیره کنید و بعد از روشن شدن دوباره همان مقدار اعمال شود.
نتیجه جلسه دهم
در این جلسه یاد گرفتیم:
- حافظه EEPROM چیست و چه کاربردی دارد.
- دستورات نوشتن و خواندن داده در BASCOM.
- پروژههای عملی ذخیره رمز عبور و تنظیمات.
🔹 جلسه یازدهم: کار با سنسورهای آنالوگ (ADC) و ساخت دماسنج دیجیتال.
آموزش BASCOM AVR – بسکام – جلسه یازدهم
خیلی خب 🌟
حالا میریم سراغ جلسه یازدهم و این بار هم مفصل و کامل مینویسم تا شبیه یک فصل آموزشی باشه.
📘 آموزش BASCOM AVR – بسکام – جلسه یازدهم
سنسورهای آنالوگ (ADC) و ساخت دماسنج دیجیتال
۱. مقدمه
تا اینجا یاد گرفتیم دادههای دیجیتال (۰ و ۱) را بخوانیم و ذخیره کنیم. اما بسیاری از سنسورها خروجی آنالوگ دارند؛ یعنی ولتاژی بین ۰ تا ۵ ولت. برای خواندن این ولتاژ باید از مبدل آنالوگ به دیجیتال (ADC) داخلی میکروکنترلر استفاده کنیم.
کاربردهای ADC:
- خواندن دما از سنسور LM35
- خواندن نور از LDR
- خواندن ولتاژ یا جریان
- کنترل سرعت موتور با پتانسیومتر
۲. معرفی ADC در ATmega32
- تعداد کانالها: ۸ کانال (ADC0 تا ADC7)
- رزولوشن: ۱۰ بیت (۰ تا ۱۰۲۳)
- ولتاژ مرجع: میتواند AVCC یا ولتاژ داخلی باشد.
- سرعت تبدیل: قابل تنظیم با Prescaler
۳. سنسور LM35
- سنسور دما با خروجی آنالوگ.
- هر ۱۰ میلیولت = ۱ درجه سانتیگراد.
- محدوده اندازهگیری: ۰ تا ۱۵۰ درجه سانتیگراد.
- اتصال: پایه خروجی به ADC0، پایه تغذیه به +۵ ولت، پایه زمین به GND.
۴. کدنویسی در BASCOM
مثال: خواندن مقدار ADC
' پروژه خواندن دما از LM35
$regfile = "m32def.dat"
$crystal = 1000000
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Value As Word
Dim Temp As Single
Do
Value = Getadc(0) ' خواندن مقدار از کانال ADC0
Temp = Value * 5 / 1024 * 100 ' تبدیل به درجه سانتیگراد
Locate 1 , 1
Lcd "Temp=" ; Temp ; "C"
Wait 1
Loop
End
۵. توضیح خطبهخط کد
Config Adc = Single→ تنظیم ADC به حالت تککاناله.Prescaler = Auto→ تقسیم کلاک به صورت خودکار.Reference = Avcc→ ولتاژ مرجع = ۵ ولت.Start Adc→ فعالسازی ADC.Getadc(0)→ خواندن مقدار از کانال ۰.- تبدیل مقدار به دما:
- مقدار ADC بین ۰ تا ۱۰۲۳ است.
- ولتاژ = (Value × 5) ÷ 1024
- دما = ولتاژ × 100
۶. پروژه عملی: دماسنج دیجیتال
- سنسور LM35 → پایه ADC0
- نمایش دما روی LCD کاراکتری
- اگر دما بیشتر از ۳۰ درجه شد، LED روشن شود.
کد:
Dim Value As Word
Dim Temp As Single
Do
Value = Getadc(0)
Temp = Value * 5 / 1024 * 100
Locate 1 , 1
Lcd "Temp=" ; Temp ; "C"
If Temp > 30 Then
Set PORTA.0
Else
Reset PORTA.0
End If
Wait 1
Loop
End
۷. نکات عملی
- سیمهای سنسور باید کوتاه باشند تا نویز کمتر شود.
- برای دقت بیشتر میتوان چند بار مقدار ADC را خواند و میانگین گرفت.
- ولتاژ مرجع باید دقیق باشد؛ بهتر است از AVCC با خازن فیلتر استفاده کنید.
۸. تمرینها
- برنامهای بنویسید که دما را بخواند و اگر بیشتر از ۴۰ درجه شد، فن روشن شود.
- مقدار نور را با LDR بخوانید و شدت نور را روی LCD نمایش دهید.
- یک ولتمتر ساده بسازید که ولتاژ ورودی را روی LCD نشان دهد.
نتیجه جلسه یازدهم
در این جلسه یاد گرفتیم:
- مفهوم ADC و کاربرد آن.
- نحوه خواندن داده آنالوگ در BASCOM.
- پروژه عملی دماسنج دیجیتال با سنسور LM35.
🔹 جلسه دوازدهم: کار با ساعت و تقویم دیجیتال (RTC) و نمایش زمان دقیق روی LCD.
آموزش BASCOM AVR – بسکام – جلسه دوازدهم
خیلی خب 🌟
حالا میریم سراغ جلسه دوازدهم و این بار هم مفصل و کامل مینویسم تا شبیه یک فصل آموزشی باشه.
📘 آموزش BASCOM AVR – بسکام – جلسه دوازدهم
ساعت و تقویم دیجیتال (RTC)
۱. مقدمه
در جلسات قبل با تایمرها و ADC کار کردیم. حالا میخواهیم یک پروژه مهم بسازیم: ساعت و تقویم دیجیتال. برای این کار باید بتوانیم زمان را دقیق بشماریم. میکروکنترلر ATmega32 یک تایمر ویژه (Timer2) دارد که میتواند با کریستال ساعت (۳۲.۷۶۸ کیلوهرتز) مستقل از CPU کار کند و زمان دقیق را نگه دارد. این قابلیت برای ساخت ساعت دیجیتال بسیار مناسب است.
۲. مفهوم RTC
RTC یا Real Time Clock به معنای ساعت واقعی است.
- میتواند ثانیه، دقیقه، ساعت، روز، ماه و سال را نگه دارد.
- حتی اگر CPU خاموش شود، با یک باتری کوچک (مثل سکهای ۳ ولت) ادامه میدهد.
- در میکروکنترلرها میتوان با تایمر۲ و کریستال ساعت این قابلیت را پیادهسازی کرد.
۳. نحوه اتصال کریستال ساعت
- کریستال ۳۲.۷۶۸ کیلوهرتز به پایههای TOSC1 و TOSC2 وصل میشود.
- یک خازن کوچک (۲۰ پیکوفاراد) به هر پایه وصل میشود.
- این کریستال باعث میشود تایمر۲ مستقل از CPU کار کند.
۴. کدنویسی در BASCOM
مثال: شمارش ثانیهها با تایمر۲
' پروژه ساعت دیجیتال با تایمر2
$regfile = "m32def.dat"
$crystal = 1000000
Config Timer2 = Timer , Async = On , Prescale = 128
Enable Interrupts
Enable Ovf2
On Ovf2 Timer2_ISR
Dim Sec As Byte , Min As Byte , Hour As Byte
Start Timer2
Do
Locate 1 , 1
Lcd "Time=" ; Hour ; ":" ; Min ; ":" ; Sec
Loop
End
Timer2_ISR:
Incr Sec
If Sec = 60 Then
Sec = 0
Incr Min
If Min = 60 Then
Min = 0
Incr Hour
If Hour = 24 Then
Hour = 0
End If
End If
End If
Return
۵. توضیح خطبهخط کد
Config Timer2 = Timer , Async = On→ تایمر۲ به حالت مستقل (Async) تنظیم میشود.Prescale = 128→ تقسیم کلاک برای تنظیم زمان دقیق.Enable Ovf2→ فعالسازی وقفه سرریز تایمر۲.- در بخش
Timer2_ISRهر بار سرریز تایمر۲، یک ثانیه به شمارنده اضافه میشود. - سپس دقیقه و ساعت محاسبه میشوند.
۶. نمایش تاریخ
برای نمایش تاریخ باید روز، ماه و سال را نیز ذخیره کنیم.
کد ساده:
Dim Day As Byte , Month As Byte , Year As Word
Day = 1 : Month = 1 : Year = 2025
Do
Locate 2 , 1
Lcd "Date=" ; Day ; "/" ; Month ; "/" ; Year
Loop
End
توضیح: تاریخ اولیه تنظیم میشود و روی LCD نمایش داده میشود. میتوان با کلیدها تاریخ را تغییر داد.
۷. پروژه عملی: ساعت و تقویم دیجیتال کامل
- تایمر۲ برای شمارش ثانیهها.
- LCD برای نمایش زمان و تاریخ.
- کیپد برای تنظیم ساعت و تاریخ.
- EEPROM برای ذخیره تنظیمات بعد از قطع برق.
۸. نکات عملی
- برای دقت بیشتر باید کریستال ساعت دقیق و خازنهای مناسب استفاده شوند.
- اگر زمان سریع یا کند شد، مقدار Prescaler را تغییر دهید.
- برای ذخیره تنظیمات ساعت و تاریخ از EEPROM استفاده کنید.
۹. تمرینها
- برنامهای بنویسید که ساعت را روی LCD نمایش دهد و هر بار کلید خاصی فشار داده شد، زمان یک دقیقه جلو برود.
- یک تقویم ساده بسازید که روز و ماه را نمایش دهد.
- برنامهای بنویسید که ساعت و تاریخ را در EEPROM ذخیره کند و بعد از قطع برق دوباره بارگذاری شود.
نتیجه جلسه دوازدهم
در این جلسه یاد گرفتیم:
- مفهوم RTC و کاربرد آن.
- نحوه استفاده از تایمر۲ برای ساخت ساعت دیجیتال.
- نمایش ساعت و تاریخ روی LCD.
- پروژه عملی ساعت و تقویم دیجیتال کامل.
🔹 جلسه سیزدهم: پروژه قفل رمز دیجیتال با ترکیب LCD، کیپد و EEPROM.
آموزش BASCOM AVR – بسکام – جلسه سیزدهم
خیلی خب 🌟
حالا میریم سراغ جلسه سیزدهم و این بار هم مفصل و کامل مینویسم تا شبیه یک فصل آموزشی باشه.
📘 آموزش BASCOM AVR – بسکام – جلسه سیزدهم
پروژه قفل رمز دیجیتال (Digital Password Lock)
۱. مقدمه
یکی از کاربردهای مهم میکروکنترلرها در سیستمهای امنیتی است. در این جلسه یک قفل رمز دیجیتال طراحی میکنیم که با وارد کردن رمز صحیح، خروجی فعال شود (مثلاً رله یا LED روشن شود). این پروژه ترکیبی از مباحث قبلی است:
- LCD کاراکتری برای نمایش پیامها
- کیپد ماتریسی برای ورود رمز
- EEPROM برای ذخیره رمز عبور
- شرطها و حلقهها برای بررسی صحت رمز
۲. اجزای مورد نیاز
- میکروکنترلر ATmega32
- LCD کاراکتری ۲×۱۶
- کیپد ۴×۴
- رله یا LED برای نمایش وضعیت قفل
- مقاومت و سیمهای اتصال
۳. الگوریتم کار
- کاربر رمز عبور را با کیپد وارد میکند.
- رمز وارد شده روی LCD نمایش داده میشود (یا به صورت ستاره * برای امنیت).
- برنامه رمز وارد شده را با رمز ذخیرهشده در EEPROM مقایسه میکند.
- اگر درست بود، خروجی فعال میشود (قفل باز میشود).
- اگر اشتباه بود، پیام خطا نمایش داده میشود.
- امکان تغییر رمز با کلید خاص وجود دارد.
۴. کدنویسی در BASCOM
کد پایه:
' پروژه قفل رمز دیجیتال
$regfile = "m32def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Kbd = PortC
Dim Pass As String * 4
Dim InputPass As String * 4
Dim K As Byte
' ذخیره رمز پیشفرض در EEPROM
Writeeeprom "1234" , 0
Readeeprom Pass , 0
Cls
Lcd "Enter Password:"
Do
InputPass = ""
For I = 1 To 4
Do
K = Getkbd()
Loop Until K <> 0
InputPass = InputPass + Chr(K)
Lcd "*"
Next I
If InputPass = Pass Then
Cls
Lcd "Access Granted"
Set PORTA.0
Else
Cls
Lcd "Access Denied"
Reset PORTA.0
End If
Wait 2
Cls
Lcd "Enter Password:"
Loop
End
۵. توضیح خطبهخط کد
Writeeeprom "1234" , 0→ رمز پیشفرض “1234” در EEPROM ذخیره میشود.Readeeprom Pass , 0→ رمز ذخیرهشده خوانده میشود.- حلقه
For I = 1 To 4→ چهار رقم رمز از کیپد خوانده میشود. Chr(K)→ تبدیل کد کلید به کاراکتر.If InputPass = Pass Then→ بررسی صحت رمز.- اگر درست بود، پیام “Access Granted” نمایش داده میشود و خروجی فعال میشود.
- اگر اشتباه بود، پیام “Access Denied” نمایش داده میشود و خروجی غیرفعال میشود.
۶. پروژه پیشرفته: تغییر رمز عبور
میتوان کلید خاصی (مثلاً *) را برای تغییر رمز تعریف کرد.
کد:
If K = 42 Then ' کلید * برای تغییر رمز
Cls
Lcd "New Password:"
InputPass = ""
For I = 1 To 4
Do
K = Getkbd()
Loop Until K <> 0
InputPass = InputPass + Chr(K)
Lcd "*"
Next I
Pass = InputPass
Writeeeprom Pass , 0
Cls
Lcd "Password Changed"
End If
۷. نکات عملی
- برای امنیت بیشتر میتوان تعداد دفعات ورود اشتباه را محدود کرد.
- میتوان رمز را به صورت ستاره (*) نمایش داد تا کسی نتواند آن را بخواند.
- برای کنترل بارهای بزرگ (مثل قفل برقی) باید از رله یا ماسفت استفاده کرد.
۸. تمرینها
- برنامهای بنویسید که بعد از سه بار ورود اشتباه، سیستم قفل شود.
- رمز عبور را به صورت ۶ رقمی طراحی کنید.
- امکان تغییر رمز با ترکیب کلیدهای خاص (مثلاً # و *) اضافه کنید.
نتیجه جلسه سیزدهم
در این جلسه یاد گرفتیم:
- طراحی قفل رمز دیجیتال با LCD، کیپد و EEPROM.
- نحوه ذخیره و خواندن رمز عبور.
- پروژه عملی تغییر رمز عبور.
🔹 جلسه چهاردهم: پروژه کنترل دما هوشمند با سنسور LM35، رله و LCD.
آموزش BASCOM AVR – بسکام – جلسه چهاردهم
خیلی خب 🌟
حالا میریم سراغ جلسه چهاردهم و این بار هم مفصل و کامل مینویسم تا شبیه یک فصل آموزشی باشه.
📘 آموزش BASCOM AVR – بسکام – جلسه چهاردهم
پروژه کنترل دما هوشمند (Smart Temperature Control)
۱. مقدمه
در جلسه یازدهم یاد گرفتیم چطور دما را با سنسور LM35 بخوانیم و روی LCD نمایش دهیم. حالا میخواهیم یک پروژه پیشرفتهتر بسازیم: کنترل دما هوشمند. در این پروژه اگر دما از حد مشخصی بالاتر رفت، یک فن یا رله روشن میشود و وقتی دما پایین آمد، خاموش میشود. این پروژه ترکیبی از مباحث قبلی است:
- ADC برای خواندن دما
- LCD کاراکتری برای نمایش دما
- رله یا ترانزیستور برای کنترل بار
- شرطها برای تصمیمگیری
۲. اجزای مورد نیاز
- میکروکنترلر ATmega32
- سنسور LM35
- LCD کاراکتری ۲×۱۶
- رله ۵ ولت یا ترانزیستور برای کنترل فن/هیتر
- مقاومت و سیمهای اتصال
۳. الگوریتم کار
- دما توسط سنسور LM35 خوانده میشود.
- مقدار دما روی LCD نمایش داده میشود.
- اگر دما بیشتر از ۳۰ درجه شد، فن روشن میشود.
- اگر دما کمتر از ۳۰ درجه شد، فن خاموش میشود.
- میتوان مقدار آستانه دما را با کیپد تغییر داد و در EEPROM ذخیره کرد.
۴. کدنویسی در BASCOM
کد پایه:
' پروژه کنترل دما هوشمند
$regfile = "m32def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Value As Word
Dim Temp As Single
Dim Threshold As Byte
Threshold = 30
Do
Value = Getadc(0)
Temp = Value * 5 / 1024 * 100
Locate 1 , 1
Lcd "Temp=" ; Temp ; "C"
If Temp > Threshold Then
Set PORTA.0
Locate 2 , 1
Lcd "Fan=ON "
Else
Reset PORTA.0
Locate 2 , 1
Lcd "Fan=OFF"
End If
Wait 1
Loop
End
۵. توضیح خطبهخط کد
Threshold = 30→ آستانه دما روی ۳۰ درجه تنظیم شده است.Getadc(0)→ خواندن مقدار دما از کانال ADC0.- تبدیل مقدار به دما:
(Value × 5 ÷ 1024) × 100. - اگر دما بیشتر از آستانه باشد، فن روشن میشود.
- اگر کمتر باشد، فن خاموش میشود.
۶. پروژه پیشرفته: تنظیم آستانه با کیپد
میتوان مقدار آستانه دما را با کیپد وارد کرد و در EEPROM ذخیره کرد.
کد:
Dim InputVal As Byte
' خواندن آستانه از EEPROM
Readeeprom Threshold , 0
Do
InputVal = Getkbd()
If InputVal <> 0 Then
Threshold = InputVal
Writeeeprom Threshold , 0
End If
Loop
End
۷. نکات عملی
- برای کنترل فن یا هیتر باید از رله یا ماسفت استفاده کنید؛ خروجی مستقیم میکرو توان کافی ندارد.
- برای جلوگیری از نویز، بهتر است از دیود هرزگرد (Flyback Diode) کنار رله استفاده کنید.
- میتوانید هیسترزیس اضافه کنید (مثلاً فن وقتی دما بالای ۳۰ روشن شود و وقتی زیر ۲۸ خاموش شود) تا از روشن/خاموش شدن سریع جلوگیری شود.
۸. تمرینها
- برنامهای بنویسید که آستانه دما را با کیپد تغییر دهد و روی LCD نمایش دهد.
- یک سیستم دوحالته بسازید: اگر دما پایین بود، هیتر روشن شود؛ اگر بالا بود، فن روشن شود.
- مقدار آستانه را در EEPROM ذخیره کنید تا بعد از قطع برق باقی بماند.
نتیجه جلسه چهاردهم
در این جلسه یاد گرفتیم:
- طراحی سیستم کنترل دما هوشمند با سنسور LM35.
- استفاده از شرطها برای کنترل فن یا هیتر.
- پروژه پیشرفته تنظیم آستانه با کیپد و ذخیره در EEPROM.
🔹 جلسه پانزدهم: پروژه پایانی سیستم کنترل خانگی هوشمند با ترکیب LCD، کیپد، تایمر، وقفه، EEPROM، سنسور و رله.
آموزش BASCOM AVR – بسکام – جلسه پانزدهم
خیلی خب 🌟
حالا میریم سراغ جلسه پانزدهم که آخرین جلسه این دوره است و به عنوان پروژه پایانی همه مباحث قبلی را ترکیب میکنیم.
📘 آموزش BASCOM AVR – بسکام – جلسه پانزدهم
پروژه پایانی: سیستم کنترل خانگی هوشمند (Smart Home Control System)
۱. مقدمه
در طول ۱۴ جلسه گذشته با مفاهیم پایهای و پیشرفتهی میکروکنترلر AVR و محیط BASCOM آشنا شدیم:
- ورودی/خروجی دیجیتال
- LCD کاراکتری و گرافیکی
- کیپد ماتریسی
- تایمرها و وقفهها
- PWM برای کنترل موتور و LED
- ارتباط سریال (UART)
- حافظه EEPROM
- سنسورهای آنالوگ (ADC)
- ساعت و تقویم دیجیتال (RTC)
- پروژههای ترکیبی مثل قفل رمز و کنترل دما
حالا وقت آن است که همه اینها را در یک پروژه بزرگ ترکیب کنیم: سیستم کنترل خانگی هوشمند.
۲. قابلیتهای سیستم
این پروژه میتواند چندین عملکرد داشته باشد:
- نمایش ساعت و تاریخ روی LCD
- کنترل دما محیط با فن یا هیتر
- قفل رمز دیجیتال برای ورود
- کنترل روشنایی LED با PWM
- ذخیره تنظیمات در EEPROM
- ارتباط با کامپیوتر یا ماژول بلوتوث از طریق UART
۳. اجزای مورد نیاز
- میکروکنترلر ATmega32
- LCD کاراکتری ۲×۱۶
- کیپد ۴×۴
- سنسور LM35 برای دما
- رله برای کنترل فن/هیتر
- LED برای کنترل روشنایی
- کریستال ساعت ۳۲.۷۶۸ کیلوهرتز برای RTC
- پروگرمر AVR
۴. الگوریتم کلی
- هنگام روشن شدن، سیستم ساعت و تاریخ را از EEPROM میخواند و روی LCD نمایش میدهد.
- کاربر باید رمز عبور را با کیپد وارد کند تا وارد منوی اصلی شود.
- در منوی اصلی گزینهها وجود دارند:
- کنترل دما
- کنترل روشنایی
- تنظیم ساعت و تاریخ
- تغییر رمز عبور
- هر گزینه با کلیدهای کیپد انتخاب میشود.
- خروجیها (فن، LED، رله) بر اساس شرایط فعال یا غیرفعال میشوند.
۵. کدنویسی در BASCOM (نمونه ترکیبی)
' پروژه سیستم کنترل خانگی هوشمند
$regfile = "m32def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Kbd = PortC
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Pass As String * 4
Dim InputPass As String * 4
Dim Temp As Single
Dim Value As Word
Dim Threshold As Byte
Dim Bright As Byte
Dim K As Byte
' خواندن رمز و تنظیمات از EEPROM
Readeeprom Pass , 0
Readeeprom Threshold , 10
Readeeprom Bright , 20
Cls
Lcd "Enter Password:"
Do
InputPass = ""
For I = 1 To 4
Do
K = Getkbd()
Loop Until K <> 0
InputPass = InputPass + Chr(K)
Lcd "*"
Next I
If InputPass = Pass Then
Cls
Lcd "Smart Home Menu"
Wait 2
Do
K = Getkbd()
If K = 49 Then ' کلید 1: کنترل دما
Value = Getadc(0)
Temp = Value * 5 / 1024 * 100
Locate 1 , 1
Lcd "Temp=" ; Temp ; "C"
If Temp > Threshold Then
Set PORTA.0
Lcd "Fan=ON "
Else
Reset PORTA.0
Lcd "Fan=OFF"
End If
End If
If K = 50 Then ' کلید 2: کنترل روشنایی
For Bright = 0 To 255
Pwm1a = Bright
Waitms 10
Next Bright
End If
If K = 51 Then ' کلید 3: تغییر رمز
Cls
Lcd "New Password:"
InputPass = ""
For I = 1 To 4
Do
K = Getkbd()
Loop Until K <> 0
InputPass = InputPass + Chr(K)
Lcd "*"
Next I
Pass = InputPass
Writeeeprom Pass , 0
Cls
Lcd "Password Changed"
End If
Loop
Else
Cls
Lcd "Access Denied"
Wait 2
Cls
Lcd "Enter Password:"
End If
Loop
End
۶. توضیح عملکرد
- رمز عبور از EEPROM خوانده میشود.
- اگر رمز درست وارد شود، منوی اصلی نمایش داده میشود.
- گزینه ۱: کنترل دما با سنسور LM35 و رله فن.
- گزینه ۲: کنترل روشنایی LED با PWM.
- گزینه ۳: تغییر رمز عبور و ذخیره در EEPROM.
۷. نکات عملی
- برای کنترل بارهای AC باید از رله و دیود هرزگرد استفاده کنید.
- برای امنیت بیشتر میتوان تعداد دفعات ورود اشتباه را محدود کرد.
- برای ذخیره تنظیمات بیشتر میتوان از EEPROM استفاده کرد.
- برای ارتباط با کامپیوتر یا موبایل میتوان از UART و ماژول بلوتوث استفاده کرد.
۸. تمرینها
- گزینهای اضافه کنید که ساعت و تاریخ را تنظیم کند و در EEPROM ذخیره شود.
- یک سیستم هشدار بسازید که اگر دما خیلی بالا رفت، آلارم فعال شود.
- یک منوی گرافیکی روی LCD گرافیکی طراحی کنید.
نتیجه جلسه پانزدهم
در این جلسه همه مباحث قبلی را ترکیب کردیم و یک پروژه بزرگ ساختیم: سیستم کنترل خانگی هوشمند. این پروژه نشان میدهد که با یادگیری اصول BASCOM و AVR میتوان سیستمهای واقعی و کاربردی طراحی کرد.
🎉 تبریک! تو حالا یک دوره کامل ۱۵ جلسهای را پشت سر گذاشتی و میتوانی پروژههای حرفهای با AVR و BASCOM بسازی.
آموزش BASCOM AVR – بسکام – جلسه دوم
📘 آموزش BASCOM AVR – بسکام – جلسه دوم
ورودیها و کلیدها (Input/Output)
۱. مقدمه
در جلسه قبل یاد گرفتیم چطور یک LED را با میکروکنترلر روشن و خاموش کنیم. اما یک سیستم واقعی فقط خروجی ندارد؛ باید بتواند از محیط بیرون فرمان بگیرد. سادهترین ورودی، کلید فشاری (Push Button) است. در این جلسه یاد میگیریم چطور وضعیت کلید را بخوانیم و بر اساس آن LED را کنترل کنیم.
۲. کلید فشاری چیست؟
کلید فشاری یک قطعه مکانیکی است که با فشار دادن آن، دو پایه به هم وصل میشوند و جریان عبور میکند.
- در حالت عادی: مدار باز (قطع).
- هنگام فشار: مدار بسته (وصل).
کلیدها معمولاً چهار پایه دارند که دو به دو به هم متصلاند. در بردبورد کافی است دو پایه مقابل هم را استفاده کنیم.
۳. مقاومت Pull-Up و Pull-Down
مشکل کلیدها این است که وقتی آزاد هستند، پایه ورودی میکرو در حالت شناور (Floating) قرار میگیرد و نویز باعث میشود مقدار آن نامشخص باشد. برای حل این مشکل از مقاومتهای Pull-Up یا Pull-Down استفاده میکنیم:
- Pull-Up: پایه ورودی در حالت عادی به +۵ ولت وصل است و هنگام فشار کلید به زمین وصل میشود.
- Pull-Down: پایه ورودی در حالت عادی به زمین وصل است و هنگام فشار کلید به +۵ ولت وصل میشود.
در AVR یک مقاومت Pull-Up داخلی وجود دارد که میتوانیم با نرمافزار فعال کنیم و دیگر نیازی به مقاومت خارجی نیست.
۴. شماتیک مدار
- LED به پایه PA0 وصل شده (مثل جلسه قبل).
- کلید فشاری به پایه PB0 وصل شده.
- یک سر کلید به زمین، سر دیگر به پایه PB0.
- مقاومت Pull-Up داخلی فعال میشود تا در حالت عادی پایه PB0 برابر ۱ منطقی باشد.
۵. کدنویسی در BASCOM
کد کامل:
' پروژه کنترل LED با کلید
$regfile = "m32def.dat"
$crystal = 1000000
Config PINA.0 = Output ' LED روی پایه PA0
Config PINB.0 = Input ' کلید روی پایه PB0
Set PORTB.0 ' فعالسازی Pull-Up داخلی
Do
If PINB.0 = 0 Then ' اگر کلید فشار داده شد
Set PORTA.0 ' LED روشن شود
Else
Reset PORTA.0 ' LED خاموش شود
End If
Loop
End
۶. توضیح خطبهخط کد
Config PINB.0 = Input→ پایه PB0 به عنوان ورودی تعریف میشود.Set PORTB.0→ مقاومت Pull-Up داخلی فعال میشود.If PINB.0 = 0 Then→ اگر کلید فشار داده شود (پایه به زمین وصل شود)، شرط برقرار است.Set PORTA.0→ LED روشن میشود.Else … Reset PORTA.0→ در غیر این صورت LED خاموش میشود.
۷. نکات عملی
- اگر LED همیشه روشن بود، جهت اتصال کلید را بررسی کنید.
- اگر LED هیچوقت روشن نشد، مطمئن شوید Pull-Up فعال شده است.
- کلیدهای مکانیکی هنگام فشار چندین پالس کوچک تولید میکنند (پدیده Bounce). برای جلوگیری از خطا باید از دیبانس نرمافزاری استفاده کنیم.
۸. دیبانس نرمافزاری
برای حذف نویز کلید، پس از فشار باید کمی صبر کنیم تا پالسهای اضافی تمام شوند.
کد با دیبانس:
Do
If PINB.0 = 0 Then
Waitms 50 ' صبر برای حذف نویز
If PINB.0 = 0 Then
Toggle PORTA.0 ' تغییر وضعیت LED
Waitms 300 ' جلوگیری از چند بار تغییر
End If
End If
Loop
End
۹. پروژه عملی: کلید روشن/خاموش
در این پروژه با هر بار فشار کلید، LED وضعیتش تغییر میکند (اگر خاموش بود روشن شود و برعکس). این کار با دستور Toggle انجام میشود.
۱۰. تمرینها
۱. دو کلید اضافه کنید: یکی برای روشن کردن LED و دیگری برای خاموش کردن.
۲. با هر بار فشار کلید، LED برای مدت ۲ ثانیه روشن شود و سپس خاموش شود.
۳. یک شمارنده بسازید که تعداد دفعات فشار کلید را روی LCD نمایش دهد.
نتیجه جلسه دوم
در این جلسه یاد گرفتیم:
- چطور یک پایه را ورودی تعریف کنیم.
- مفهوم Pull-Up داخلی و استفاده از آن.
- خواندن وضعیت کلید و کنترل LED.
- دیبانس نرمافزاری برای حذف نویز کلید.
- پروژه عملی روشن/خاموش کردن LED با کلید.
🔹 جلسه سوم: کار با LCD کاراکتری و نمایش متن روی آن.
آموزش BASCOM AVR – بسکام – جلسه هفتم
📘 آموزش BASCOM AVR – بسکام – جلسه هفتم
وقفهها (Interrupts)
۱. مقدمه
تا اینجا یاد گرفتیم چطور با تایمرها کار کنیم. اما در بسیاری از پروژهها لازم است میکروکنترلر بدون اینکه ما مرتباً وضعیت پایهها یا تایمرها را بررسی کنیم، خودش به صورت خودکار واکنش نشان دهد. این قابلیت با وقفهها (Interrupts) فراهم میشود.
وقفه یعنی: وقتی یک رویداد خاص اتفاق افتاد، CPU اجرای برنامه اصلی را متوقف کند و به یک بخش ویژه از برنامه برود، آن را اجرا کند و سپس دوباره به ادامه برنامه برگردد.
۲. انواع وقفهها در AVR
- وقفه تایمر (Timer Overflow): وقتی تایمر پر شود و سرریز کند.
- وقفه خارجی (External Interrupt): وقتی یک پایه خاص تغییر وضعیت دهد (مثلاً کلید فشرده شود).
- وقفه سریال (UART Interrupt): وقتی دادهای دریافت یا ارسال شود.
- وقفه ADC: وقتی تبدیل آنالوگ به دیجیتال تمام شود.
۳. معماری وقفه در AVR
- هر وقفه یک بردار (Vector) دارد؛ یعنی آدرس خاصی در حافظه فلش که CPU به آن پرش میکند.
- در BASCOM نیازی نیست آدرس را دستی بنویسیم؛ کافی است با دستور
Onمشخص کنیم بعد از وقوع وقفه به کدام بخش برنامه برویم.
۴. فعالسازی وقفهها در BASCOM
Enable Interrupts→ فعالسازی وقفههای سراسری.Enable Ovf0→ فعالسازی وقفه سرریز تایمر۰.On Ovf0 Label→ تعیین برچسبی که بعد از وقوع وقفه اجرا شود.
۵. کدنویسی در BASCOM
مثال: وقفه تایمر۰
' پروژه شمارش وقفه تایمر0
$regfile = "m32def.dat"
$crystal = 1000000
Config Timer0 = Timer , Prescale = 1024
Enable Interrupts
Enable Ovf0
On Ovf0 Timer0_ISR
Dim I As Word
Start Timer0
Do
Locate 1 , 1
Lcd "Count=" ; I
Loop
End
Timer0_ISR:
Incr I
Return
۶. توضیح خطبهخط کد
Enable Interrupts→ وقفههای سراسری فعال میشوند.Enable Ovf0→ وقفه سرریز تایمر۰ فعال میشود.On Ovf0 Timer0_ISR→ وقتی تایمر۰ سرریز کند، به بخشTimer0_ISRمیرود.- در بخش
Timer0_ISRیک واحد به متغیر I اضافه میشود. - سپس با
Returnبرنامه به ادامه کار خود برمیگردد.
۷. وقفه خارجی (External Interrupt)
AVR دارای پایههای مخصوص وقفه خارجی است (INT0، INT1، INT2).
میتوانیم تنظیم کنیم که روی لبه بالا رونده یا پایین رونده فعال شوند.
مثال:
Config Int0 = Falling
Enable Interrupts
Enable Int0
On Int0 Key_ISR
Do
' برنامه اصلی
Loop
End
Key_ISR:
Toggle PORTA.0
Return
توضیح: با هر بار فشار کلید روی پایه INT0، LED تغییر وضعیت میدهد.
۸. نکات عملی
- هنگام اجرای وقفه، CPU به طور خودکار وقفههای دیگر را غیرفعال میکند تا تداخل ایجاد نشود.
- زمان اجرای وقفه باید کوتاه باشد؛ اگر طولانی شود، برنامه اصلی کند میشود.
- برای کارهای سنگین بهتر است فقط یک فلگ در وقفه تنظیم شود و پردازش اصلی در حلقه اصلی انجام شود.
۹. پروژه عملی: شمارنده با کلید
کد:
Dim Count As Byte
Config Int0 = Falling
Enable Interrupts
Enable Int0
On Int0 Inc_ISR
Do
Locate 2 , 1
Lcd "Count=" ; Count
Loop
End
Inc_ISR:
Incr Count
Return
توضیح: هر بار کلید روی پایه INT0 فشار داده شود، شمارنده یک واحد افزایش مییابد و روی LCD نمایش داده میشود.
۱۰. تمرینها
- برنامهای بنویسید که با هر بار فشار کلید، LED روشن و خاموش شود.
- یک شمارنده بسازید که تعداد فشار کلید را بشمارد و روی LCD نمایش دهد.
- برنامهای بنویسید که با وقفه تایمر هر ۱ ثانیه یک بار LED چشمک بزند.
نتیجه جلسه هفتم
در این جلسه یاد گرفتیم:
- مفهوم وقفه و کاربرد آن.
- نحوه فعالسازی وقفهها در BASCOM.
- وقفه تایمر و وقفه خارجی.
- پروژه عملی شمارنده با کلید.
🔹 جلسه هشتم: کار با PWM و کنترل موتور/دیمر LED.
آموزش BASCOM AVR – بسکام – جلسه هشتم
خیلی خب 🌟
حالا میریم سراغ جلسه هشتم و این بار هم مفصل و کامل مینویسم تا شبیه یک فصل آموزشی باشه.
📘 آموزش BASCOM AVR – بسکام – جلسه هشتم
PWM و کنترل موتور / دیمر LED
۱. مقدمه
در جلسات قبل با تایمرها و وقفهها آشنا شدیم. یکی از مهمترین کاربردهای تایمرها تولید PWM است. PWM یا Pulse Width Modulation روشی است برای کنترل توان خروجی با تغییر نسبت زمان روشن بودن به زمان خاموش بودن یک سیگنال مربعی.
کاربردهای PWM:
- کنترل سرعت موتورهای DC
- کنترل شدت نور LED (دیمر)
- تولید صدا یا موج آنالوگ با فیلتر
۲. مفهوم PWM
- سیگنال PWM یک موج مربعی است.
- Duty Cycle درصد زمان روشن بودن نسبت به کل دوره است.
- مثال: اگر دوره ۱ میلیثانیه باشد و ۰.۵ میلیثانیه روشن باشد → Duty Cycle = 50%.
- با تغییر Duty Cycle میتوان توان متوسط را تغییر داد.
۳. تایمرها و PWM در AVR
- تایمر۱ و تایمر۲ قابلیت تولید PWM دارند.
- خروجی PWM روی پایههای خاصی ظاهر میشود:
- OC1A، OC1B برای تایمر۱
- OC2 برای تایمر۲
۴. کدنویسی در BASCOM
مثال: تولید PWM روی تایمر۱
' پروژه PWM برای کنترل LED
$regfile = "m32def.dat"
$crystal = 1000000
Config Timer1 = Pwm , Pwm = 8 , CompareA = Clear , Prescale = 64
Do
Pwm1a = 128 ' Duty Cycle = 50% (128 از 255)
Loop
End
۵. توضیح خطبهخط کد
Config Timer1 = Pwm→ تایمر۱ به حالت PWM تنظیم میشود.Pwm = 8→ رزولوشن ۸ بیتی (۰ تا ۲۵۵).CompareA = Clear→ حالت خروجی روی پایه OC1A.Prescale = 64→ تقسیم کلاک برای تنظیم فرکانس PWM.Pwm1a = 128→ مقدار Duty Cycle (نصف توان).
۶. پروژه عملی: دیمر LED
با تغییر مقدار Pwm1a میتوان شدت نور LED را تغییر داد.
کد:
Dim I As Byte
Do
For I = 0 To 255
Pwm1a = I
Waitms 10
Next I
Loop
End
توضیح: شدت نور LED به آرامی زیاد و کم میشود (افکت Fade).
۷. پروژه عملی: کنترل سرعت موتور DC
- موتور DC را با ترانزیستور یا ماسفت به پایه PWM وصل کنید.
- با تغییر Duty Cycle سرعت موتور تغییر میکند.
کد:
Dim Speed As Byte
Do
Speed = Getadc(0) ' خواندن مقدار از پتانسیومتر
Pwm1a = Speed ' تنظیم Duty Cycle بر اساس ورودی
Loop
End
توضیح: با چرخاندن پتانسیومتر سرعت موتور تغییر میکند.
۸. نکات عملی
- برای کنترل بارهای بزرگ (موتور یا لامپ) باید از ترانزیستور یا ماسفت استفاده کنید.
- برای بارهای AC باید از رله یا مدارهای خاص استفاده شود.
- فرکانس PWM باید متناسب با بار انتخاب شود (مثلاً برای LED چند کیلوهرتز، برای موتور چند صد هرتز).
۹. تمرینها
- برنامهای بنویسید که با فشار کلید Duty Cycle بین 25%، 50% و 75% تغییر کند.
- یک دیمر LED بسازید که شدت نور را با کیپد تنظیم کند.
- یک کنترل سرعت موتور بسازید که سرعت را روی LCD نمایش دهد.
نتیجه جلسه هشتم
در این جلسه یاد گرفتیم:
- مفهوم PWM و کاربرد آن.
- نحوه تولید PWM با تایمر۱ در BASCOM.
- پروژههای عملی دیمر LED و کنترل سرعت موتور.
🔹 جلسه نهم: کار با ارتباط سریال (UART) برای ارتباط میکرو با کامپیوتر یا ماژولهای دیگر.
آموزش BASCOM AVR – بسکام – جلسه نهم
خیلی خب 🌟
حالا میریم سراغ جلسه نهم و این بار هم مفصل و کامل مینویسم تا شبیه یک فصل آموزشی باشه.
📘 آموزش BASCOM AVR – بسکام – جلسه نهم
ارتباط سریال (UART)
۱. مقدمه
در پروژههای واقعی، میکروکنترلر باید بتواند با دستگاههای دیگر ارتباط برقرار کند. یکی از سادهترین و پرکاربردترین روشها، ارتباط سریال (UART) است.
با UART میتوانیم دادهها را بین میکرو و کامپیوتر یا بین دو میکروکنترلر منتقل کنیم. این روش در ماژولهای بلوتوث، GPS، GSM و بسیاری از سنسورها استفاده میشود.
۲. مفهوم ارتباط سریال
- دادهها به صورت بیت به بیت ارسال میشوند.
- هر بسته شامل:
- بیت شروع (Start Bit)
- ۸ بیت داده
- بیت توقف (Stop Bit)
- سرعت انتقال داده با Baud Rate مشخص میشود (مثلاً 9600 بیت در ثانیه).
۳. پایههای UART در ATmega32
- TXD (PD1): پایه ارسال داده.
- RXD (PD0): پایه دریافت داده.
- این پایهها باید به دستگاه دیگر وصل شوند (TX به RX و RX به TX).
۴. کدنویسی در BASCOM
مثال: ارسال داده به کامپیوتر
' پروژه ارسال داده سریال
$regfile = "m32def.dat"
$crystal = 1000000
Config Com1 = 9600 , Synchrone = 0
Do
Print "Hello PC"
Wait 1
Loop
End
توضیح: متن “Hello PC” هر ثانیه به کامپیوتر ارسال میشود.
مثال: دریافت داده از کامپیوتر
Dim A As String * 10
Config Com1 = 9600 , Synchrone = 0
Do
Input A
Lcd A
Loop
End
توضیح: دادهای که از کامپیوتر ارسال شود، روی LCD نمایش داده میشود.
۵. توضیح خطبهخط کد
Config Com1 = 9600→ تنظیم سرعت ارتباط سریال روی 9600 بیت در ثانیه.Print "Text"→ ارسال متن به پورت سریال.Input A→ دریافت داده و ذخیره در متغیر A.
۶. اتصال به کامپیوتر
- برای اتصال مستقیم به کامپیوتر باید از مبدل USB به سریال یا MAX232 استفاده کنید.
- TX میکرو به RX کامپیوتر وصل میشود.
- RX میکرو به TX کامپیوتر وصل میشود.
- زمین مشترک باید برقرار باشد.
۷. پروژه عملی: ارتباط دوطرفه
کد:
Dim A As String * 10
Config Com1 = 9600 , Synchrone = 0
Do
Input A
If A = "ON" Then
Set PORTA.0
ElseIf A = "OFF" Then
Reset PORTA.0
End If
Loop
End
توضیح: اگر از کامپیوتر کلمه “ON” ارسال شود، LED روشن میشود. اگر “OFF” ارسال شود، LED خاموش میشود.
۸. نکات عملی
- سرعت (Baud Rate) باید در هر دو دستگاه یکسان باشد.
- اگر دادهها بههمریخته نمایش داده شدند، احتمالاً Baud Rate اشتباه است.
- برای ارتباط با ماژولهای بلوتوث یا GSM، کافی است همان دستورات سریال را استفاده کنید.
۹. تمرینها
- برنامهای بنویسید که متن وارد شده از کامپیوتر را روی LCD نمایش دهد.
- یک کنترل از راه دور بسازید که با ارسال دستور از کامپیوتر LED روشن و خاموش شود.
- یک برنامه بنویسید که هر بار کلید فشار داده شد، متن “Key Pressed” به کامپیوتر ارسال شود.
نتیجه جلسه نهم
در این جلسه یاد گرفتیم:
- مفهوم ارتباط سریال (UART).
- نحوه ارسال و دریافت داده در BASCOM.
- اتصال میکرو به کامپیوتر با مبدل سریال.
- پروژه عملی کنترل LED با دستورات سریال.
🔹 جلسه دهم: کار با حافظه EEPROM برای ذخیره دادههای دائمی مثل رمز عبور یا تنظیمات.