پروژه های آردوینو

اتصال ماژول سنسور ML8511 UV به آردوینو

UV sensor-digispark
نوشته شده توسط شهاب کمالی

در این آمورش قصد داریم اتصال ماژول ml8511uv به آردوینو را آموزش دهیم 🙂 ML8511 یکی از پر کاربردترین ماژول‌های تشخیص فرابنفش می‌باشد. سنسور به کار رفته در این ماژول از نوع MP8511 می‌باشد که با تغییر شدت نور فرابنفش به صورت تغییر در ولتاژ نمایان می‌شود. ابعاد این ماژول به قدری کوچک است که به راحتی می‌توان در گجت‌های پوشیدنی، جهت اطلاع از شدت نور UV خورشید از آن استفاده کرد. در ادامه  آموزش با مرجع تخصصی آردوینو ، دیجی اسپارک همراه باشید.

 

 

 

 


 /*
 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   را نمایش میدهد.

The ML8511 intensity graph

The ML8511 intensity graph

جهت تست سنسور باید آن را مقابل نور خورشید یا LED UV بگیرید  و خروجی را روی serial monitor آردوینو مشاهده کنید.

درباره نویسنده

شهاب کمالی

تبادل نظر و رفع عیب با ثبت دیدگاه