در قسمت سی و چهارم از آموزش آردوینو به بررسی تشخیص ارتعاش و تشخیص صدا پرداختیم. در این قسمت قصد داریم درباره اندازهگیری دما و خواندن تگهای RFID (NFC) صحبت کنیم.
فرض کنید میخواهید دما را نمایش دهید یا از مقدار آن برای کنترل یک دستگاه استفاده کنید؛ برای مثال، وقتی دما به یک آستانه مشخص رسید، چیزی روشن شود. این دما را هم میتوان بر حسب فارنهایت و هم بر حسب سلسیوس (سانتیگراد) نمایش داد.
برای این کار از سنسور تشخیص دما TMP36 استفاده میشود. این سنسور شبیه یک ترانزیستور به نظر میرسد و همانطور که در شکل 1 نشان داده شده، متصل میگردد.
1 2 | float millivolts = (value / 1024.0) * 5000; |
را به این صورت تغییر دهید:
1 2 | float millivolts = (value / 1024.0) * 3300; |
شکل 1: اتصال سنسور دمای TMP36
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | /* * tmp36 sketch * prints the temperature to the Serial Monitor * and turns on the LED when a threshold is reached */ const int inPin = A0; // analog pin const int ledPin = LED_BUILTIN; const int threshold = 80; // Turn on the LED over 80F void setup() { Serial.begin(9600); } void loop() { int value = analogRead(inPin); // Use 3300 instead of 5000 for 3.3V boards float millivolts = (value / 1024.0) * 5000; // 10mV per degree Celsius with a 500mv offset float celsius = (millivolts - 500) / 10; float fahrenheit = (celsius * 9)/ 5 + 32; Serial.print("C:"); Serial.print(celsius); Serial.print(","); Serial.print("F:"); Serial.println( fahrenheit ); // converts to fahrenheit if (fahrenheit > threshold){ // is the temperature over the threshold? digitalWrite(ledPin, HIGH); // if it is turn on the LED } else { digitalWrite(ledPin, LOW); // if it isn't turn the LED off } delay(1000); // wait for one second } |
سنسور دمای TMP36 ولتاژ آنالوگی تولید میکند که مستقیماً با دما متناسب است، بهطوریکه برای هر 0.1 درجه سلسیوس، 1 میلیولت (یا 10 میلیولت برای هر درجه سلسیوس) خروجی میدهد، اما دارای افست ۵۰۰ میلیولت است.
این برنامه مقادیر analogRead را به میلیولت تبدیل میکند. سپس ۰.۵ ولت (۵۰۰ میلیولت) که ولتاژ آفست مشخص شده در دیتاشیت TMP36 است، از آن کم میکند و در نهایت نتیجه را بر ۱۰ تقسیم میکند تا دما بر حسب درجه سلسیوس به دست آید. اگر دما از مقدار آستانه عبور کند، برنامه LED داخلی برد را روشن میکند. شما میتوانید بهراحتی سنسور را بالای ۸۰ درجه فارنهایت برسانید، کافی است سنسور را بین دو انگشت خود نگه دارید، اما از لمسکردن پایههای سنسور با انگشتان خود خودداری کنید تا در سیگنال الکتریکی تداخل ایجاد نشود.
سنسورهای دمای زیادی در دسترس هستند، اما یک جایگزین جالب، سنسور دمای دیجیتال ضدآب DS18B20 است (قطعه Adafruit شماره ۳۸۱، قطعه SparkFun شماره SEN-11050 و از سایر تأمینکنندگان نیز قابلتهیه است). این سنسور بهصورت متفاوت نسبت به TMP36 سیمکشی و استفاده میشود.
سنسور DS18B20 بر اساس پروتکل 1-Wire که توسط شرکت Dallas Semiconductor (اکنون Maxim) معرفی شد، کار میکند و نیاز به دو کتابخانه دارد. کتابخانه اول OneWire است. چندین کتابخانه با نام OneWire موجود است، بنابراین مطمئن شوید که کتابخانه OneWire توسط Jim Studt ،Tom Pollard و همکاران را انتخاب کنید. همچنین به کتابخانه DallasTemperature نیز نیاز خواهید داشت. میتوانید هر دو کتابخانه را با استفاده از Library Manager نصب کنید.
برای سیمکشی DS18B20، سیم قرمز را به 5 ولت (یا 3.3 ولت در بردهای 3.3 ولتی) متصل کنید، سیم سیاه را به زمین (GND) وصل کنید و سیم سیگنال (زرد، سفید یا رنگ دیگری) را به پین دیجیتال 2 متصل کنید، با یک مقاومت 4.7 کیلو اهم بین سیم سیگنال و پایه تغذیه (5 V یا 3.3 V)، همانطور که در شکل زیر نشان داده شده است.
شکل 2: اتصال سنسور دمای DS18B20
در اینجا اسکچ خواندن دما آورده شده است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | /* DS18B20 temperature * Reads temperature from waterproof sensor probe */ #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 2 // The pin that the sensor wire is connected to const int ledPin = LED_BUILTIN; const int threshold = 80; // Turn on the LED over 80F OneWire oneWire(ONE_WIRE_BUS); // Prepare the OneWire connection DallasTemperature sensors(&oneWire); // Declare the temp sensor object void setup(void) { Serial.begin(9600); // Initialize the sensor sensors.begin(); } void loop(void) { sensors.requestTemperatures(); // Request a temperature reading // Retrieve the temperature reading in F and C float fahrenheit = sensors.getTempFByIndex(0); float celsius = sensors.getTempCByIndex(0); // Display the temperature readings in a Serial Plotter-friendly format Serial.print("C:"); Serial.print(celsius); Serial.print(","); Serial.print("F:"); Serial.println(fahrenheit); if (fahrenheit > threshold){ // is the temperature over the threshold? digitalWrite(ledPin, HIGH); // if it is turn on the LED } else { digitalWrite(ledPin, LOW); // if it isn't turn the LED off } delay(1000); } |
این اسکچ فایلهای هدر هر کتابخانه را وارد میکند و ساختارهای دادهای لازم برای کار با پروتکل 1-Wire و سنسور را مقداردهی اولیه میکند. درون حلقه (loop) برنامه، دما را درخواست میکند و سپس دما را به درجه سلسیوس و سپس درجه فارنهایت میخواند. توجه داشته باشید که نیازی به انجام هیچ تبدیل ریاضی روی نتایج دریافتی از سنسور نیست؛ همه چیز توسط کتابخانه انجام میشود. همچنین توجه کنید که هنگام استفاده از برد ۳.۳ ولتی، نیازی به تغییر کد ندارید، اما مطمئن شوید که تغذیه سنسور به ۳.۳ ولت متصل باشد، نه ۵ ولت.
فرض میکنید میخواهید یک تگ RFID/NFC را بخوانید و به شناسههای خاص پاسخ دهید.
شکل 3 یک NFC reader مدل PN532 را نشان میدهد که از طریق پینهای سریال TX و RX به آردوینو متصل شده است. readerهای PN532 NFC از چندین تأمینکننده قابل تهیه هستند. reader Seeed Studio Grove NFC قطعه شماره همانطور که در نمودار نشان داده شده است، متصل میشود.
همچنین میتوانید reader PN532 را به شکل شیلد پیدا کنید. قطعه SeeedStudio شماره 113030001، قطعه Adafruit شماره 789.
برای استفاده از این ماژول، باید کتابخانه Seeed_Arduino_NFC از SeeedStudio را نصب کنید. کتابخانه Seeed شامل نسخهای اصلاحشده از کتابخانه NDEF است، بنابراین نیازی به نصب جداگانه آن ندارید.
شکل 3: NFC reader متصل به آردوینو
این برنامه (Sketch) یک تگ NFC را میخواند و شناسهی یکتای (Unique ID) آن را نمایش میدهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /* NFC Tag Scanner - Serial * Look for an NFC tag and display its unique identifier. */ #include <NfcAdapter.h> #include <PN532/PN532/PN532.h> #include <PN532/PN532_HSU/PN532_HSU.h> PN532_HSU pn532hsu(Serial1); NfcAdapter nfc(pn532hsu); void setup() { Serial.begin(9600); nfc.begin(); // Initialize the NFC reader } void loop() { Serial.println("Waiting for a tag"); if (nfc.tagPresent()) // If the reader sees an NFC tag { NfcTag tag = nfc.read(); // read the NFC tag Serial.println(tag.getUidString()); // Display its id } delay(500); } |
NFC (Near-Field Communication) یک نوع خاص از فناوری RFID (Radio Frequency Identification) است که در فرکانس 13.56 مگاهرتز کار میکند و از یک فرمت داده به نام NDEF (NFC Data Exchange Format) پشتیبانی میکند. NDEF مجموعهای از پیامهای ساختاریافته را فراهم میکند که میتوانید روی یک تگ ذخیره کنید. تگ یک وسیلهی الکترونیکی کوچک است که میتواند در کارتها، برچسبها، جاسوئیچیها و سایر اشیاء تعبیه شود.
تگ شامل یک آنتن نسبتاً بزرگ است که سیگنالها را از یک reader RFID/NFC دریافت میکند. reader میتواند در یک کامپیوتر یا تلفن همراه تعبیه شده باشد، یا یک ماژول جداگانه باشد که به آردوینو وصل میکنید؛ مانند ماژول PN532. وقتی تگ سیگنال را دریافت میکند، انرژی لازم را از همان سیگنال برداشت کرده و مدار داخلی تگ را فعال میکند؛ سپس با ارسال اطلاعات ذخیرهشده در حافظه خود، به سیگنال پاسخ میدهد. همچنین تگهایی وجود دارند که منبع تغذیه مستقل دارند، مانند ترانسپوندر خودرو که در سیستمهای پرداخت عوارض خودکار استفاده میشود. این نوع تگها بهعنوان Active Tag (تگ فعال) شناخته میشوند، درحالیکه نوعی که انرژی را از reader برداشت میکند، Passive Tag (تگ غیرفعال) نامیده میشود.
یک تگ NDEF هنگامی که توسط یک reader فعال شود، مجموعهای از دادهها را منتقل میکند. این دادهها شامل اطلاعات شناسایی تگ و همچنین هر اطلاعاتی است که روی تگ ذخیره شده است.
در این راهحل از کتابخانه NDEF نوشتهی Don Coleman برای سادهسازی خواندن دادههای تگ استفاده شده است. کدی که در راهحل نشاندادهشده، با ماژول Seeed Studio Grove NFC که از طریق Serial1 متصل شده است، کار میکند. این کد از اتصال سریال USB برای ارسال اطلاعات استفاده میکند که میتوانید آن را در Serial Monitor مشاهده کنید.
برد Arduino Uno که دارای Serial1 نیست، به این معنی که باید از SoftwareSerial همراه با این ماژول استفاده کنید؛ زیرا در برد Uno و دیگر بردهای سازگار با ATmega328، پینهای USB Serial و TX/RX مشترک هستند، بنابراین این بردها نمیتوانند همزمان با یک دستگاه سریال و از طریق USB Serial ارتباط برقرار کنند. همچنین، میتوانید ماژول Grove NFC را طوری کانفیگ کنید که از I2C استفاده کند.
شیلد Seeed Studio NFC از طریق SPI ارتباط برقرار میکند. اگر بخواهید از آن استفاده کنید، باید کد را بهصورت زیر تغییر دهید:
1 2 3 4 5 6 | #include <SPI.h> #include <NfcAdapter.h> #include <PN532/PN532/PN532.h> #include <PN532/PN532_SPI/PN532_SPI.h> PN532_SPI pn532spi(SPI, 10); NfcAdapter nfc = NfcAdapter(pn532spi); |
اگر بخواهید از آن با شیلد Adafruit یا ماژول Grove NFC در حالت I2C استفاده کنید، باید کد را بهصورت زیر تغییر دهید:
1 2 3 4 5 6 | #include <Wire.h> #include <NfcAdapter.h> #include <PN532/PN532/PN532.h> #include <PN532/PN532_I2C/PN532_I2C.h> PN532_I2C pn532i2c(Wire); NfcAdapter nfc = NfcAdapter(pn532i2c); |
با استفاده از کتابخانه NDEF میتوانید هر پیامی را که روی تگ قرار دارد بخوانید و پیام دلخواه خودتان را روی آن بنویسید (به شرطی که تگ قفل نشده باشد). اگر تابع loop را با کد زیر جایگزین کنید، برنامه ابتدا تگ را میخواند و سپس با استفاده از تابع print شیء NfcTag شناسهی تگ (Tag ID) و هر پیامی که روی آن ذخیره شده باشد را نمایش میدهد.
سپس یک شمارش معکوس نشان داده میشود. اگر تگ را همچنان در محل خود نگه دارید، برنامه یک آدرس اینترنتی (URL) روی تگ خواهد نوشت. اگر یک تلفن همراه دارای قابلیت NFC داشته باشید، میتوانید تگ را نزدیک تلفن بگیرید و باید مرورگر وب گوشی به طور خودکار آن آدرس اینترنتی را باز کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | void loop() { Serial.println("Waiting for a tag"); if (nfc.tagPresent()) // If the reader sees an NFC tag { NfcTag tag = nfc.read(); // read the NFC tag tag.print(); // print whatever is currently on it // Give the user time to avoid writing to the tag Serial.print("Countdown to writing the tag: 3"); for (int i = 2; i >= 0; i--) { delay(1000); Serial.print("..."); Serial.print(i); } Serial.println(); // Write a message to the tag NdefMessage message = NdefMessage(); message.addUriRecord("http://oreilly.com"); bool success = nfc.write(message); if (!success) Serial.println("Write failed."); else Serial.println("Success."); } delay(500); } |
تشخیص ارتعاش و صدا | قسمت سی و...
من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.