معرفی DigiSpark
یک برد کوچک و مقرون به صرفه که بر اساس تراشه Attiny85 ساخته شده است. مشابه با مجموعه بردهای آردوینو، دارای شیلدهای متنوع بوده و علاوه بر آن به دلیل ارزانی، کوچکی و توان مصرفی پایین گزینهی مناسبی برای شروع یادگیری میکروکنترلر و استفاده از آن در پروژههای متفاوت میباشد. برای برنامه نویسی آن، میتوان از Arduino IDE استفاده کرد. البته توجه نمایید به دلیل استفاده از تراشه Attiny85، بعضی از کتابخانههایی که بر روی بردهای Arduino قابل پیادهسازی هستند بر روی این برد نمیتوانند آپلود شوند.
مشخصات فنی شامل موارد زیر می شود:
– توسط USB یا منبع تغذیه 5 ولت کار میکند
– دارای 6 پایه I/O است (2 پایه برای ارتباط USB استفاده میشود-در صورتی که در برنامه این ارتباط وجود داشته باشد و در غیر این صورت میتوان از این دو پایه نیز استفاده نمود)(به دلیل استفاده از پایه 2 و 4 در ارتباط USB، از عدم اتصال این دو در مدار، اطمینان حاصل نمایید)
– 8 کیلو بایت حافظه فلش (در واقع، 6 کیلوبایت بعد از استفاده از bootloader)
– پروتکل I2C و SPI
– PWM بر روی 3 پایه تعریف شده است (میتوان به صورت نرمافزاری بر روی پایههای دیگر نیز تعریف نمود)
– ADC روی 4 پین
– LED نشاندهنده اتصال منبع تغذیه و یک LED جهت نمایش وضعیت و استفاده در برنامه
همچنین شماتیک این برد از اینجا قابل دسترس میباشد.
جهت اتصال برد به کامپیوتر و برنامهریزی آن توسط Arduino IDE به ترتیب زیر عمل میکنیم:
1. ابتدا به منوی File->preferences رفته و در قسمت Additional Boards Manager URLs لینک زیر را اضافه مینماییم :
http://digistump.com/package_digistump_index.json
2. سپس به منو Tools->Board->Board Manager رفته و عبارت “Digistump AVR Boards” را جستجو مینماییم و آن را نصب میکنیم.
3. حال از منوی Tools->Board گزینه DigiSpark (Default – 16.5 Mhz) را انتخاب میکنیم.
4. برای آپلود کد روی برد ابتدا کلید Upload را فشرده و سپس برد را به سیستم متصل نمایید و منتظر بمانید تا فرایند کامپایل و آپلود به اتمام برسد.
برد Digispark از ارتباط سریال برخوردار نمیباشد و در نتیجه نمی توان از این قابلیت در Arduino IDE استفاده نمود. همچنین برای استفاده از پروتکل I2C باید از کتابخانه TinyWireM که به صورت نرم افزاری این پروتکل را پیادهسازی میکند استفاده نمود.
پایهها بر روی این برد بر اساس زیر عمل میکنند :
• تمام پایهها میتوانند به عنوان I/O دیجیتال استفاده شوند
• Pin 0 → I2C SDA, PWM (LED on Model B)
• Pin 1 → PWM (LED on Model A)
• Pin 2 → I2C SCK, Analog In
• Pin 3 → Analog In (also used for USB+ when USB is in use)
• Pin 4 → PWM, Analog (also used for USB- when USB is in use)
• Pin 5 → Analog In
معرفی حسگر DHT11
یک حسگر دیجیتال با قابلیت اندازهگیری دما و رطوبت محیط میباشد. ارسال دادهها در این حسگر با استفاده از پروتکل ارتباطی 1-wire انجام میشود. اندازهگیری دما در بازه 0 تا 50 درجه سانتیگراد و رطوبت نسبی 20 تا 90 درصد به وسیله این سنسور امکانپذیر میباشد. ولتاژ کاری بین 3.3 تا 5.5 ولت بوده و عملکرد پایههای آن به شرح زیر میباشد:
Dout : خروجی دیجیتال
GND : زمین
Vcc : ولتاژ تغذیه 3.3 تا 5.5 ولت
در جدول زیر میتوانید مشخصات فنی مربوط به این حسگر را مشاهده نمایید :
نحوه ارتباط حسگر با MCU:
ابتدا MCU یک سیگنال شروع (در ادامه در مورد مشخصات این سیگنال توضیح داده خواهد شد) به حسگر ارسال میکند. حسگر با دریافت این سیگنال، از حالت توان پایین به حالت اجرا میرود و منتظر میماند تا MCU سیگنال شروع را به اتمام برساند. سپس 40 بیت اطلاعات مربوط به دما و رطوبت اندازهگیری شده توسط حسگر به MCU ارسال شده و MCU، این دادهها را دریافت کرده و ذخیره مینماید. بعد از اتمام ارسال، حسگر به حالت توان پایین برگشته و منتظر ارسال مجدد سیگنال شروع توسط MCU میماند.
سیگنال شروع:
ولتاژ باس (پایه داده) ابتدا در حالت بالا میباشد (زیرا با توجه به شکل شماتیک، توسط مقاومت pull-up شده است). MCU سطح ولتاژ سیگنال را از حالت بالا به پایین برده و حداقل 18 میلیثانیه در این حالت نگه میدارد تا حسگر زمان کافی برای شناسایی این تغییر حالت را داشته باشد. سپس MCU سیگنال را مجددا به حالت بالا برده و 20 تا 40 میکرو ثانیه منتظر میماند تا حسگر اطلاعات را برای او ارسال نماید.
سیگنال شروع توسط دستورات زیر در کتابخانه dht پیادهسازی شده است:
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(wakeupDelay);
pinMode(pin, INPUT);
delayMicroseconds(40);
پاسخ حسگر به MCU :
به محض اینکه حسگر سیگنال شروع را دریافت کرد، سطح ولتاژ را به حالت پایین تغییر داده و 80 میکرو ثانیه در این حالت باقی میماند (این حالت نشان دهنده وضعیت “ارسال سیگنال پاسخ” توسط حسگر میباشد). سپس سطح را از حالت پایین به بالا تغییر داده و 80 میکرو ثانیه در این حالت باقی میماند (این حالت نشان دهنده “آماده شدن برای ارسال داده” توسط حسگر میباشد).
تشخیص این وضعیت توسط دستورات زیر از کتابخانه dht انجام میگردد:
uint16_t loopCnt = DHTLIB_TIMEOUT;
while(digitalRead(pin) == LOW)
{
if (–loopCnt == 0) return -2;
}
loopCnt = DHTLIB_TIMEOUT;
while(digitalRead(pin) == HIGH)
{
if (–loopCnt == 0) return -2;
}
سپس داده ها بیت به بیت از حسگر به MCU منتقل می شوند. هر بیت از داده ها با یک ولتاژ سطح پایین به مدت 50 میکرو ثانیه آغاز می شوند، سپس سطح سیگنال به مقدار بالا تغییر میکند. برای بیت 0 این سطح باید به میزان 26 تا 28 میکرو ثانیه ادامه پیدا کند و برای بیت 1 این سطح باید به مدت 70 میکرو ثانیه ادامه یابد.
تشخیص 40 بیت در کتابخانه dht توسط دستورات زیر انجام میشود:
for (uint8_t i = 40; i != 0; i–)
{
loopCnt = DHTLIB_TIMEOUT;
while(digitalRead(pin) == LOW)
{
if (–loopCnt == 0) return -2;
}
uint32_t t = micros();
loopCnt = DHTLIB_TIMEOUT;
while(digitalRead(pin) == HIGH)
{
if (–loopCnt == 0) return -2;
}
if ((micros() – t) > 40)
{
bits[idx] |= mask;
}
mask >>= 1;
if (mask == 0) // next byte?
{
mask = 128;
idx++;
}
}
زمانی که آخرین بیت منتقل شد، حسگر سطح ولتاژ را به پایین تغییر میدهد و آن را 50 میکرو ثانیه در این حالت نگه میدارد. در نهایت ولتاژ توسط مقاومت pull-up به سطح بالا برمیگردد تا حالت آزاد را نشان دهد.
اتصال حسگر و نمایشگر به برد و پیادهسازی کد
برای اتصال حسگر به برد DigiSpark پین های Vcc و GND را به ترتیب به Vcc و GND بر روی برد متصل کنید و پین داده حسگر را به پین P3 متصل نمایید.
همچنین جهت اتصال LCD به برد، پایه SDA روی LCD را به پین P0 و پایه SCL را به پین P2 متصل نمایید.
در شکل زیر میتوانید نحوه اتصال حسگر و نمایشگر به برد DigiSpark را مشاهده نمایید:
کد
#include <LiquidCrystal_attiny.h>
#include <TinyWireM.h>
#include <dht.h>
#define GPIO_ADDR 0x27
// ============================================================================
dht DHT12;
#define DHT12_PIN 3
LiquidCrystal_I2C lcd(GPIO_ADDR,16,2); // set address & 16 chars / 2 lines
void setup() {
pinMode(3, INPUT); //Read DHT12 on P3
TinyWireM.begin(); // initialize I2C lib – comment this out to use with standard arduinos
lcd.init(); // initialize the lcd
lcd.backlight(); // Print a message to the LCD.
lcd.print(“EmbeddedLab.ir!”);
delay(500);
}
void loop() {
int chk = DHT12.read12(DHT12_PIN);
lcd.setCursor(0,0);
lcd.print(“in DegreeC= “);
lcd.setCursor(0,1);
lcd.print(DHT12.temperature);
delay(15000); //Change the delay to how often read the data.
}
با دستور
pinMode(3, INPUT)
پایه 3 روی برد را برای دریافت دادههای حسگر تعریف می نماییم.
دستورات
TinyWireM.begin();
lcd.init();
lcd.backlight();
برای تعریف و مقداردهی اولیه LCD به کار میروند.
دستور
int chk = DHT12.read12(DHT12_PIN)
داده ها را از حسگر میخواند.
دستورات
lcd.setCursor(0,0);
lcd.print(“in DegreeC= “);
lcd.setCursor(0,1);
lcd.print(DHT12.temperature);
مقدار خوانده شده را بر روی LCD نمایش میدهند.
منابع
1. Digispark USB Development Board – Digistump [Internet]. Digistump.com. 2021 [cited 15 December 2021]. Available from: http://digistump.com/products/1
2. digispark:tutorials:digispark [Digistump Wiki] [Internet]. Digistump.com. 2021 [cited 15 December 2021]. Available from: http://digistump.com/wiki/digispark/tutorials/digispark
3. digispark:tutorials:connecting [Digistump Wiki] [Internet]. Digistump.com. 2021 [cited 15 December 2021]. Available from: http://digistump.com/wiki/digispark/tutorials/connecting
4. DHT11 – Elecrow [Internet]. Elecrow.com. 2021 [cited 15 December 2021]. Available from: https://www.elecrow.com/wiki/index.php?title=DHT11
5. DHT11 Temperature-Humidity Sensor – Waveshare Wiki [Internet]. Waveshare.com. 2021 [cited 15 December 2021]. Available from: https://www.waveshare.com/wiki/DHT11_Temperature-Humidity_Sensor
6. DHT11 Humidity & Temperature Sensor [Internet]. mouser; 2021 [cited 15 December 2021]. Available from: https://www.mouser.com/datasheet/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf
7. DHT Library. https://github.com/UDOOboard/DHT; 2021.