در این آمورش قصد داریم اتصال ماژول ml8511uv به آردوینو را آموزش دهیم 🙂 ML8511 یکی از پر کاربردترین ماژولهای تشخیص فرابنفش میباشد. سنسور به کار رفته در این ماژول از نوع MP8511 میباشد که با تغییر شدت نور فرابنفش به صورت تغییر در ولتاژ نمایان میشود. ابعاد این ماژول به قدری کوچک است که به راحتی میتوان در گجتهای پوشیدنی، جهت اطلاع از شدت نور UV خورشید از آن استفاده کرد. در ادامه آموزش با مرجع تخصصی آردوینو ، دیجی اسپارک همراه باشید.
سخت افزار مورد نیاز
اتصالات
اتصال GND ماژول به GND آردوینو
اتصال ۳٫۳ ماژول رطوبت به ۳٫۳V آردوینو
اتصال OUT ماژول به A0 آردوینو
اتصال ۳٫۳ ماژول به A1
اتصال EN ماژول به ۳٫۳V آردوینو
کد نویسی
/* Connect the following ML8511 breakout board to Arduino: ۳٫۳V = 3.3V OUT = A0 GND = GND EN = 3.3V ۳٫۳V = A1 */ int UVOUT = A0; //Output from the sensor int REF_3V3 = A1; //3.3V power on the Arduino board void setup() { Serial.begin(9600); pinMode(UVOUT, INPUT); pinMode(REF_3V3, INPUT); Serial.println("ML8511 example"); } void loop() { int uvLevel = averageAnalogRead(UVOUT); int refLevel = averageAnalogRead(REF_3V3); //Use the 3.3V power pin as a reference to get a very accurate output value from sensor float outputVoltage = 3.3 / refLevel * uvLevel; float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0); //Convert the voltage to a UV intensity level Serial.print("output: "); Serial.print(refLevel); Serial.print("ML8511 output: "); Serial.print(uvLevel); Serial.print(" / ML8511 voltage: "); Serial.print(outputVoltage); Serial.print(" / UV Intensity (mW/cm^2): "); Serial.print(uvIntensity); Serial.println(); delay(100); } //Takes an average of readings on a given pin //Returns the average int averageAnalogRead(int pinToRead) { byte numberOfReadings = 8; unsigned int runningValue = 0; for(int x = 0 ; x < numberOfReadings ; x++) runningValue += analogRead(pinToRead); runningValue /= numberOfReadings; return(runningValue); } float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
شرح برنامه:
در این مثال از یک تکنیک جالب استفاده کردیم، تبدیل تغذیه آنالوگ به دیجیتال! فرض گرفتیم که ورودی ۵ولت است منتها ممکن است تغذیه را از usb بگیریم که ولتاژی بیشتر در حد ۵٫۲۵ یا کمتر در حد ۴٫۷۵ بدهد. بخاطر همین ممکن است خروجی نادرست بگیریم. برای رفع این مشکل از ۳٫۳ ولت روی برد آردوینو استفاده کردیم. بنابراین با تبدیل آنالوگ به دیجیتال بر اساس ۳٫۳ ولت (با وصل کردن A1 به ۳٫۳) و مقایسه آن با چیزی که از سنسور خوانده میشود صحیح بودن آن را دریابیم و دیگر مهم نیست مثلا ولتاژ ۳٫۴ شود.
برای مثال ما میدانیم ADC آردوینو وقتی VCC خوانده میشود خروجی ۱۰۲۳ میدهد. اگر ۶۶۹ خوانده شد برای ۳٫۳ ولت قدرت ولتاژ آردوینو چقدر است؟ از این رابطه محاسبه میشود:
VCC / 1023 = 3.3V / 669
حالا که دقیقا VCC را میدانیم میتوانیم دقیق تر ADC را روی ولتاژ UV محاسبه کنیم:
UV_Voltage / uvLevel = 3.3 / refLevel
متغییر uvLevel مقداریست که از OUT سنسور میخوانیم و refLevel مقدار ولتاژ ۳٫۳ است که ولتاژ UV را دقیقا به ما میدهد.
این تابع مقدار پورت آنالوگ را چندین بار میخواند و برای دقت بیشتر از بین آنها میانگین میگیرد و مقدار نهایی را برمیگرداند.
int averageAnalogRead(int pinToRead) { byte numberOfReadings = 8; unsigned int runningValue = 0; for(int x = 0 ; x < numberOfReadings ; x++) runningValue += analogRead(pinToRead); runningValue /= numberOfReadings; return(runningValue); }
خط زیر ولتاژ خوانده شده از سنسور را به واحد mW/cm2 تبدیل میکند.
float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0); //Convert the voltage to a UV intensity level
تابع زیر نیز برای محاسبه مقادیر متناظر است:
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
گراف زیر مقدار متناظر ولتاژ با شدت uv با واحد mW/cm2 را نمایش میدهد.
جهت تست سنسور باید آن را مقابل نور خورشید یا LED UV بگیرید و خروجی را روی serial monitor آردوینو مشاهده کنید.