1395/05/27 -> Update:1395/07/21
در این مقاله تصمیم داریم سنسور pH (پی هاش یا پی اچ) به شماره E-201-C را به وسیله میکروکنترلر ATmega8 از خانواده AVR و کامپایلر Bascom راه اندازی نماییم. pH یک کمیت لگاریتمی است که میزان اسیدی یا بازی بودن محلول ها را مشخص می کند. برای اندازه گیری pH روشهای مختلفی وجود دارد؛ از جمله تست محلول به وسیله کاغذ تورنسل یا لیتموس و یا استفاده از فنل فتالئین. اما برای نمایش میزان pH بصورت دیجیتال به روشی نیاز داریم تا این مقدار را به ولتاژ تبدیل نماییم. برای همین منظور میتوان از سنسورهای pH استفاده کرد. سنسورهای pH که متداول ترین آنها E-201-C می باشد از یک گوی شیشه ای تشکیل شده که داخل آن یک محلول شیمیایی و یک سیم قرار دارد و این گوی به یک لوله (احتمالا) شیشه ای متصل می باشد که سیم از طریق آن از انتهای سنسور خارج می شود. (شبیه لوله و گوی دماسنج) همچنین در اطراف این لوله یک جدار دیگر قرار دارد که درون آن نیز یک محلول دیگر و یک سیم قرار گرفته است و این سیم هم از انتهای سنسور خارج می شود. هر دو این سیمها به وسیله یک کابل با فیش BNC در اختیار کاربر قرار می گیرند.
برای آشنایی با نحوه عملکرد شیمیایی و الکتروشیمیایی این سنسور می توانید به این مقاله یا (فایل PDF ذخیره شده در سرور) مراجعه کنید.
تنها چیزی که برای ما مهم است اینست که هرگاه نوک این سنسور (گوی شیشه ای) در داخل محصول اسیدی یا قلیایی قرار گیرد خروجی این سنسور متناسب با pH محلول یک ولتاژ بسیار ضعیفی تولید می کند که پس از تقویت می توان آنرا به ADC میکرو تحویل داد و نتیجه را بر روی LCD مشاهده نمود. اما این ولتاز فوق العاده ضعیف بوده و تقویت آن فقط از عهده Op Amp های حساس امپدانس بالا و یا برخی از ترانزیستورهای FET بر می آید. ما برای تقویت این سنسور از ماژولی به نام Logo_pHsensor v1.1 استفاده کرده ایم که می توانید آن را از طریق تماس با سایت ما تهیه کنید. این ماژول دارای یک سوکت BNC بوده و براحتی به سنسور متصل می شود. همچنین تغذیه آن 5 ولت بوده و خروجی Po آن (که مربوط به pH است) بین 0 تا 5 ولت تغییر می کند.
از جمله نکات مهم اینست که خروجی این ماژول بصورت معکوس بوده و هر چه قدر عدد بیشتری را نمایش دهد به معنای pH کم تر و خاصیت اسیدی بیشتر است. این عدد پس از دریافت از ADC باید با فرمولی شبیه به W = 1023 - W معکوس شود. نکته دیگر وجود یک پتانسیومتر مولتی ترن برای کالیبراسیون pH می باشد که بر روی برد ماژول (در کنار سوکت BNC) قرار گرفته است. پتانسیومتر دیگر برای تنظیم صفر شدن پایه Do پس از بیشتر شدن pH از یک مقدار خاص است. (بدون نیاز به میکرو). با استفاده از این مکانیزم مثلا می توانید پتانسیومتر دوم را طوری تنظیم کنید که اگر مثلا pH از 7.0 بیشتر شد، LED قرمز روی ماژول روشن شده و خروجی Do نیز صفر شود و مثلا یک آلارم را روشن کرده و یا پمپ مایع قلیایی را راه اندازی نماید. خروجی To هم مربوط به سنسور دمای روی برد (ترمیستور) می باشد که دمای محیط را بصورت آنالوگ به خروجی ارسال می کند (برای محاسبات صحیح pH باید دما را نیز در فرمول ها دخالت داد). در شکل زیر خروجی های ماژول pH به شماره Logo_pHsensor v1.1 نوشته شده است:
G = Gnd
G = Gnd
Po = pH out Analog 0-5v
Do = relay - see above text --^
To = Temp out - Analog
یکی از ویژگیهایی که محلول های مختلف را از هم جدا می کند خاصیت اسیدی و یا قلیایی بودن آنهاست، همچنین یک محلول مشخص ممکن است در طول عمر خود به تدریج خاصیت اسیدی و یا بازی بودن خود را از دست بدهد (مثلا در دستگاه هیدروپونیک). به همین روی برای تعیین این خاصیت کمیتی به نام pH توسط متخصص بیوشیمی دانمارکی سورن سورنسن Soren Sorensen در سال 1909 ایجاد شد. pH، مخفف potential of hydrogen می باشد. pH کمیتی لگاریتمی برای بیان خاصیت اسیدی یا قلیایی بودن مواد است. این کمیت بین 0 تا 14 متغیر بوده و اسیدی ترین محلول با pH=0 و قلیایی ترین محلول با pH=14 مشخص می شود. pH آب خالص برابر با 7.0 بوده و در واقع خنثی است. اندازه گیری مداوم pH در برخی از محیط ها مثل آکواریوم، دستگاه کشت هیدروپونیک و صنایع غذایی و شیمیایی اهمیت فراوانی دارد. در شکل زیر بازه ی pH همراه با نمونه های واقعی مشاهده می شود:
منبع عکس
در شکل زیر نقشه ارتباط دهی سنسور و ماژول pH به میکروکنترلر ATmega8 نمایش داده شده است:
'www.avr64.com
'Date: 1395/04/23 [2016]
'Rev 1.1 @ 1395/07/20 [2016]
'Ref: https://forum.arduino.cc/index.php?topic=336012.0
$regfile = "m8adef.dat"
$crystal = 1000000
$hwstack = 64
$swstack = 64
$framesize = 64
'fusebits: Lock, Low, High, Extend(no)
$prog &HFF , &HA1 , &HD8 , &H00
'A2D
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Enable Adc
Start Adc
'LCD
Config Lcdpin = Pin , Rs = Portb.5 , E = Portb.4 , _
Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0
Config Lcd = 16 * 2
Cursor Off Noblink
Cls
Dim W As Word , Ph As Single , I As Byte , Sum As Dword
Dim Tmp1 As Single , Vout As Single , Ph_step As Single
Do
Sum = 0
For I = 1 To 100
W = Getadc(5)
Sum = Sum + W
Next I
Sum = Sum / 100
Vout = Sum * 5
Vout = Vout / 1024
'ph_step=[vout@ph7-vout@ph4]/[7-4]
'ph=[7-(2.5-vout)/ph_step]
Ph_step = -0.186 'Note: 0.186 is my -
' ph_step, yours -
' may different!
Tmp1 = 2.5 - Vout
Tmp1 = Tmp1 / Ph_step
Ph = 7 - Tmp1
If Ph < 0 Then Ph = 0
Home
Lcd "pH= " ; Fusing(ph , "#.&") ; Spc(8)
Waitms 250
Loop
End