جدول المحتويات:

كيفية عمل مسجل بيانات لدرجة الحرارة ودرجة الحموضة والأكسجين المذاب: 11 خطوة (بالصور)
كيفية عمل مسجل بيانات لدرجة الحرارة ودرجة الحموضة والأكسجين المذاب: 11 خطوة (بالصور)

فيديو: كيفية عمل مسجل بيانات لدرجة الحرارة ودرجة الحموضة والأكسجين المذاب: 11 خطوة (بالصور)

فيديو: كيفية عمل مسجل بيانات لدرجة الحرارة ودرجة الحموضة والأكسجين المذاب: 11 خطوة (بالصور)
فيديو: دورة تحصيلي لمادة الكيمياء - مع الأستاذة / هديل جميل حلواني 2024, يوليو
Anonim
Image
Image
صورة
صورة

أهداف:

  • قم بعمل مسجل بيانات بمبلغ 500 دولار. يخزن بيانات لدرجة الحرارة ، ودرجة الحموضة ، و DO مع طابع زمني وباستخدام اتصال I2C.
  • لماذا I2C (الدائرة المتكاملة)؟ يمكن للمرء تكديس أكبر عدد ممكن من أجهزة الاستشعار في نفس السطر بالنظر إلى أن كل واحد منهم له عنوان فريد.

الخطوة 1:

الخطوة 2: شراء الأجزاء أدناه:

شراء الأجزاء أدناه
شراء الأجزاء أدناه
  1. Arduino MEGA 2560 ، 35 دولارًا ،
  2. محول الطاقة للوحة Arduino ، $ 5.98 ،
  3. وحدة LCD I2C (عرض) ، $ 8.99 ،
  4. اختراق الساعة في الوقت الفعلي (RTC) ، 7.5 دولارات ،
  5. لوحة اندلاع بطاقة MicroSD ، 7.5 دولار ،
  6. بطاقة SD سعة 4 غيغابايت ، 6.98 دولارات ،
  7. مستشعر رقمي DS18B20 مقاوم للماء ، 9.95 دولار ،
  8. مسبار الأس الهيدروجيني + مجموعات + المخازن المؤقتة القياسية ، 149.15 دولارًا ، https://www.atlas-scientific.com/product_pages/kit …
  9. هل التحقيق + أطقم + المخازن المؤقتة القياسية ، 247.45 دولارًا ، https://www.atlas-scientific.com/product_pages/kit …
  10. Breadboard ، كابل توصيل ، 7.98 دولار ،
  11. (اختياري) عازل الجهد ، 24 دولارًا ،

المجموع: 510.48 دولار

* يمكن شراء أجزاء معينة (مثل اللوحة العامة) من بائعين آخرين (eBay ، بائع صيني) بسعر أقل. يوصى باستخدام مجسات الأس الهيدروجيني و DO للحصول عليها من Atlas Scientific.

* يوصى باستخدام مقياس متعدد للتحقق من الموصلية والجهد. يكلف حوالي 10-15 دولارًا (https://goo.gl/iAMDJo)

الخطوة 3: الأسلاك

الأسلاك
الأسلاك
  • استخدم كبلات العبور / DuPont لتوصيل الأجزاء كما هو موضح في الرسم أدناه.
  • استخدم المتر المتعدد للتحقق من التوصيل.
  • تحقق من مصدر الجهد الإيجابي (VCC) والأرضي (GND) (من السهل الخلط إذا لم تكن معتادًا على الدائرة)
  • قم بتوصيل محول الطاقة وتحقق من مؤشر الطاقة في كل جزء. عندما تكون في شك ، استخدم المتر المتعدد للتحقق من الجهد بين VCC و GND ليكون (5V)

الخطوة 4: تحضير PH و DO الدوائر وبطاقة SD

قم بإعداد PH و DO الدوائر وبطاقة SD
قم بإعداد PH و DO الدوائر وبطاقة SD
  1. قم بالتبديل إلى I2C لدوائر الأس الهيدروجيني و DO
  2. يتم شحن فواصل الأس الهيدروجيني و DO مع الاتصال التسلسلي كوضع افتراضي للإرسال / التلقي (TX / RX). لاستخدام وضع I2C ، خط الساعة (SCL) ، وخط البيانات (SDA) ، قم بالتبديل عن طريق (1): فك كبلات VCC ، TX ، RX ، (2): الانتقال إلى TX إلى الأرض للمسبار ، PGND (وليس GND) ، (3) قم بتوصيل VCC بالدائرة ، (4): انتظر حتى يتغير مؤشر LED من الأخضر إلى الأزرق. تحقق من مزيد من التفاصيل في الصفحة 39 (ورقة البيانات لدائرة الأس الهيدروجيني ،
  3. قم بنفس الخطوة مع دائرة DO
  4. (إذا كنت تعرف كيفية تحميل نموذج التعليمات البرمجية إلى اللوحة ، فيمكنك القيام بذلك من خلال الشاشة التسلسلية)
  5. قم بتهيئة بطاقة SD إلى تنسيق FAT

الخطوة 5: إعداد البرنامج

إعداد البرامج
إعداد البرامج
إعداد البرامج
إعداد البرامج
إعداد البرامج
إعداد البرامج
إعداد البرامج
إعداد البرامج
  1. قم بتنزيل Arduino Integrated Development Environment (IDE) ،
  2. قم بتثبيت المكتبة على Arduino IDE:
  3. يأتي معظمهم مع برنامج Arduino. LiquidCrystal_I2C.h متاح عبر GitHub
  4. قم بتثبيت برنامج تشغيل USB. بالنسبة إلى Arduino الأصلي ، قد لا تحتاج إلى تثبيت واحد. للحصول على برنامج عام ، تحتاج إلى تثبيت برنامج تشغيل CH340 (GitHub:
  5. تحقق مما إذا كنت قد قمت بتوصيل اللوحة بشكل صحيح عن طريق إجراء اختبار LED وامض
  6. كيفية العثور على عنوان MAC لدرجة الحرارة الرقمية 18B20. استخدام قالب الماسح الضوئي I2C في Arduino IDE مع توصيل المجس. لكل جهاز عنوان MAC فريد ، لذا يمكنك استخدام أكبر عدد من تحقيقات درجة الحرارة مع خط مشترك واحد (# 9). يستخدم 18B20 سلكًا واحدًا I2C ، لذلك فهو حالة خاصة لطريقة اتصال I2C. يوجد أدناه طريقة واحدة للعثور على MAC - Medical Access Control ("ROM" عند تشغيل الإجراء أدناه).

الخطوة 6: ابدأ الترميز

ابدأ الترميز
ابدأ الترميز
  • انسخ الكود أدناه والصقه إلى Arduino IDE:
  • أو قم بتنزيل الكود (.ino) وستظهر نافذة جديدة في Arduino IDE.

/*

الدروس المرجعية:

1. درجة الحرارة ، ORP ، مسجل الأس الهيدروجيني:

2. درع رقمي (SD) آمن:

سيقوم هذا الرمز بإخراج البيانات إلى شاشة Arduino التسلسلية. اكتب الأوامر في شاشة Arduino التسلسلية للتحكم في دائرة EZO pH في وضع I2C.

تم التعديل من البرامج التعليمية المشار إليها أعلاه ، ومعظمها من رمز I2C بواسطة Atlas-Scientific

آخر تحديث: 26 يوليو 2017 بواسطة Binh Nguyen

*/

# تضمين // تمكين I2C.

#define pH_address 99 // رقم معرف I2C الافتراضي لدائرة EZO pH.

#define DO_address 97 // رقم معرف I2C الافتراضي لدائرة EZO DO.

# تضمين "RTClib.h" // دالتا التاريخ والوقت باستخدام DS1307 RTC المتصل عبر I2C و Wire lib

RTC_DS1307 rtc ؛

# تضمين // لـ SD libarary

# تضمين // بطاقة SD لتخزين البيانات

شريحة const intSelect = 53 ؛ // بحاجة إلى معرفة اندلاع Adafruit SD //

// DO = MISO ، DI = MOSI ، على دبوس ATmega #: 50 (MISO) ، 51 (MOSI) ، 52 (SCK) ، 53 (SS)

char logFileName = "dataLT.txt" ؛ // قم بتعديل logFileName لتحديد تجربتك ، على سبيل المثال PBR_01_02 ، datalog1

معرف طويل = 1 ؛ // رقم الهوية لإدخال ترتيب السجل

#يشمل

LiquidCrystal_I2C lcd (0x27 ، 20 ، 4) ؛

#يشمل

#يشمل

#define ONE_WIRE_BUS 9 // حدد رقم الدبوس لمسبار درجة الحرارة

OneWire oneWire (ONE_WIRE_BUS) ،

مستشعرات دالاس درجة الحرارة (وسلك واحد) ؛

DeviceAddress ProbeP = {0x28، 0xC2، 0xE8، 0x37، 0x07، 0x00، 0x00، 0xBF} ؛ // عنوان MAC ، فريد لكل مسبار

سلسلة dataString ؛ // المتغير الرئيسي لتخزين جميع البيانات

سلسلة dataString2 ؛ // متغير مؤقت لتخزين درجة الحرارة / الأس الهيدروجيني / DO للطباعة

char computerdata [20] ؛ // تعليمات من Atlas Scientific: نصنع مصفوفة أحرف 20 بايت للاحتفاظ بالبيانات الواردة من جهاز كمبيوتر / ماك / آخر.

البايت المستلم_from_computer = 0 ؛ // نحتاج إلى معرفة عدد الأحرف التي تم استلامها.

بايت serial_event = 0 ؛ // علامة للإشارة عند تلقي البيانات من جهاز الكمبيوتر / ماك / غيره.

كود البايت = 0 ؛ // تستخدم للاحتفاظ برمز استجابة I2C.

char pH_data [20] ؛ // نصنع مصفوفة أحرف 20 بايت للاحتفاظ بالبيانات الواردة من دائرة الأس الهيدروجيني.

بايت in_char = 0 ؛ // تستخدم كمخزن مؤقت 1 بايت للتخزين بالبايتات المقيدة من دائرة الأس الهيدروجيني.

البايت أنا = 0 ؛ // العداد المستخدم لمصفوفة ph_data.

int time_ = 1800 ؛ // تستخدم لتغيير التأخير المطلوب اعتمادًا على الأمر المرسل إلى دائرة EZO Class pH.

تعويم pH_float ؛ // float var يستخدم للاحتفاظ بقيمة تعويم الأس الهيدروجيني.

char DO_data [20] ؛

// تعويم temp_C ؛

إعداد باطل () // تهيئة الأجهزة.

{

Serial.begin (9600) ؛ // تمكين المنفذ التسلسلي.

Wire.begin (pH_address) ؛ // تمكين منفذ I2C لمسبار الأس الهيدروجيني

Wire.begin (DO_address) ؛

lcd.init () ،

lcd.begin (20 ، 4) ؛

اضاءه خلفيه ال سى دى()؛

lcd.home () ؛

lcd.print ("Hello PBR!") ؛

lcd.setCursor (0 ، 1) ؛

lcd.print ("تهيئة …") ؛

Serial.print ("RTC is…") ؛

إذا (! rtc.begin ())

{

Serial.println ("RTC: ساعة الوقت الحقيقي … لم يتم العثور عليها") ؛

while (1) ؛ // (Serial.println ("RTC: ساعة الوقت الحقيقي … وجدت")) ؛

}

Serial.println ("RUNNING") ؛

Serial.print ("ساعة الوقت الحقيقي …") ؛

إذا (! rtc.isrunning ())

{rtc.adjust (DateTime (F (_ DATE_)، F (_ TIME_))) ؛

}

Serial.println ("العمل") ؛

lcd.setCursor (0 ، 0) ؛

lcd.println ("RTC: موافق") ؛

Serial.print ("بطاقة SD …") ؛ // معرفة ما إذا كانت البطاقة موجودة ويمكن تهيئتها:

إذا (! SD.begin (chipSelect))

{Serial.println ("فشل") ؛ // لا تفعل أي شيء آخر:

إرجاع؛

}

Serial.println ("موافق") ؛

lcd.setCursor (0 ، 1) ؛

lcd.println ("بطاقة SD: موافق") ؛

Serial.print ("ملف السجل:") ؛

Serial.print (logFileName) ،

Serial.print ("…") ؛

ملف سجل الملف = SD.open (logFileName ، FILE_WRITE) ، // افتح الملف. "سجل البيانات" وطباعة الرأس

إذا (ملف السجل)

{

logFile.println ("،،")؛ // تشير إلى وجود بيانات في التشغيل السابق

عنوان السلسلة = "التاريخ-الوقت ، درجة الحرارة (C) ، الرقم الهيدروجيني ، DO" ؛

logFile.println (رأس) ؛

logFile.close () ،

Serial.println ("جاهز") ؛

//Serial.println(dataString) ؛ // طباعة إلى المنفذ التسلسلي أيضًا:

}

آخر {Serial.println ("خطأ في فتح البيانات")؛ } // إذا لم يكن الملف مفتوحًا ، فانبثق خطأ:

lcd.setCursor (0 ، 2) ؛

lcd.print ("ملف السجل:") ؛

lcd.println (logFileName) ؛

تأخير (1000) ؛

أجهزة الاستشعار. beegin () ؛

مجموعة الدقة (ProbeP ، 10) ؛ // 10 هو القرار (10 بت)

lcd.clear () ؛

معرف = 0 ؛

}

حلقة فارغة()

{// الحلقة الرئيسية.

dataString = String (id) ؛

dataString = String ('،') ؛

DateTime now = rtc.now () ؛

dataString = String (now.year ()، DEC) ،

dataString + = String ('/') ؛

dataString + = String (now.month ()، DEC) ؛

dataString + = String ('/') ؛

dataString + = String (now.day ()، DEC) ؛

dataString + = String ('') ؛

dataString + = String (now.hour ()، DEC) ؛

dataString + = String (':') ؛

dataString + = String (now.minute ()، DEC) ؛

dataString + = String (':') ؛

dataString + = String (now.second ()، DEC) ؛

lcd.home () ؛

lcd.print (سلسلة البيانات) ؛

مجسات.طلب درجات الحرارة () ؛

displayTemperature (ProbeP) ؛

Wire.beginTransmission (pH_address) ؛ // استدعاء الدائرة برقم معرفها

Wire.write ('r') ؛ // الكود الثابت r للقراءة باستمرار

Wire.endTransmission () ؛ // إنهاء نقل البيانات I2C.

وقت التأخير_)؛ // انتظر المقدار الصحيح من الوقت حتى تكمل الدائرة تعليماتها.

Wire.request From (pH_address، 20، 1) ؛ // اتصل بالدائرة واطلب 20 بايت (قد يكون هذا أكثر مما نحتاج)

while (Wire.available ()) // هل هناك بايتات لاستلامها

{

in_char = Wire.read () ، // تلقي بايت.

if ((in_char> 31) && (in_char <127)) // تحقق مما إذا كان الحرف قابلاً للاستخدام (قابل للطباعة)

{

pH_data = in_char ؛ // قم بتحميل هذا البايت في صفيفنا.

أنا + = 1 ؛

}

if (in_char == 0) // إذا رأينا أننا قد أرسلنا أمرًا فارغًا.

{

أنا = 0 ؛ // إعادة تعيين العداد أنا إلى 0.

Wire.endTransmission () ؛ // إنهاء نقل البيانات I2C.

استراحة؛ // الخروج من حلقة الوقت.

}

}

الحدث التسلسلي = 0 ؛ // إعادة تعيين علامة الحدث التسلسلي.

dataString2 + = "،" ؛

dataString2 + = String (pH_data) ؛

Wire.beginTransmission (DO_address) ؛ // استدعاء الدائرة برقم معرفها

Wire.write ('r') ؛

Wire.endTransmission () ؛ // إنهاء نقل البيانات I2C

وقت التأخير_)؛ // انتظر المقدار الصحيح من الوقت حتى تكمل الدائرة تعليماتها

Wire.request From (DO_address، 20، 1) ؛ // اتصل بالدائرة واطلب 20 بايت

while (Wire.available ()) // هل هناك بايت لتلقيها.

{

in_char = Wire.read () ، // تلقي بايت.

if ((in_char> 31) && (in_char <127)) // تحقق مما إذا كان الحرف قابلاً للاستخدام (قابل للطباعة) ، وإلا فإن in_char يحتوي على رمز في البداية في ملف.txt

{DO_data = in_char ؛ // قم بتحميل هذا البايت في صفيفنا

أنا + = 1 ؛ // تحمل العداد لعنصر المصفوفة

}

إذا (in_char == 0)

{// إذا رأينا أنه قد تم إرسال أمر فارغ إلينا

أنا = 0 ؛ // إعادة تعيين العداد أنا إلى 0.

Wire.endTransmission () ؛ // إنهاء نقل البيانات I2C.

استراحة؛ // الخروج من حلقة الوقت.

}

}

الحدث التسلسلي = 0 ؛ // إعادة تعيين علامة الحدث التسلسلي

pH_float = atof (pH_data) ؛

dataString2 + = "،" ؛

dataString2 + = String (DO_data) ؛

lcd.setCursor (0 ، 1) ؛

lcd.print ("درجة الحرارة / درجة الحموضة / DO") ؛

lcd.setCursor (0 ، 2) ؛

lcd.print (dataString2) ؛

dataString + = '،'؛

dataString + = dataString2 ؛

ملف dataFile = SD.open (logFileName، FILE_WRITE) ، // افتح الملف. لاحظ أنه يمكن فتح ملف واحد فقط في كل مرة ، لذلك عليك إغلاق هذا الملف قبل فتح ملف آخر.

إذا كان (ملف البيانات) // إذا كان الملف متاحًا ، فاكتب إليه:

{

dataFile.println (dataString) ؛

dataFile.close () ،

Serial.println (dataString) ؛ // طباعة إلى المنفذ التسلسلي أيضًا:

}

آخر {Serial.println ("خطأ في فتح ملف datalog")؛ } // إذا لم يكن الملف مفتوحًا ، فانبثق خطأ:

lcd.setCursor (0 ، 3) ؛

lcd.print ("الجري (x5 م):") ؛

lcd.setCursor (15 ، 3) ؛

lcd.print (معرف) ؛

معرف ++ ؛ // زيادة معرّف واحد التكرار التالي

dataString = "" ؛

تأخير (300000) ؛ // تأخير 5 دقائق = 5 * 60 * 1000 مللي ثانية

lcd.clear () ؛

} // نهاية الحلقة الرئيسية

عرض باطل درجة الحرارة (عنوان الجهاز عنوان)

{

تعويم tempC = sensors.getTempC (deviceAddress) ،

if (tempC == -127.00) lcd.print ("خطأ في درجة الحرارة") ؛

else dataString2 = String (tempC) ؛

} // الكود ينتهي هنا

  • اختر منفذ COM الصحيح عبر Arduino IDE ضمن الأدوات / المنفذ
  • اختر لوحة Arduino الصحيحة. لقد استخدمت Mega 2560 لأنه يحتوي على ذاكرة داخلية أكبر. يعمل Arduino Nano أو Uno بشكل جيد مع هذا الإعداد.
  • تحقق من الكود وقم بتحميل الكود

الخطوة 7: النتائج على الأسلاك (يمكن تحسينها) وشاشة LCD

النتائج على الأسلاك (يمكن تحسينها) وشاشة LCD
النتائج على الأسلاك (يمكن تحسينها) وشاشة LCD
النتائج على الأسلاك (يمكن تحسينها) وشاشة LCD
النتائج على الأسلاك (يمكن تحسينها) وشاشة LCD
النتائج على الأسلاك (يمكن تحسينها) وشاشة LCD
النتائج على الأسلاك (يمكن تحسينها) وشاشة LCD
النتائج على الأسلاك (يمكن تحسينها) وشاشة LCD
النتائج على الأسلاك (يمكن تحسينها) وشاشة LCD
  • ملاحظة: لقد واجهت ضوضاء من مسبار DO إلى مسبار الأس الهيدروجيني بعد 2-3 أشهر من التشغيل المستمر. وفقًا لـ Atlas Scientific ، يوصى باستخدام عازل جهد في الخط عندما يعمل الرقم الهيدروجيني ، مجسات التوصيل معًا. مزيد من التفاصيل في الصفحة 9 (https://goo.gl/d62Rqv)
  • البيانات المسجلة (تحتوي الأولى على أحرف غير مطبوعة قبل بيانات الرقم الهيدروجيني و DO). لقد قمت بالتصفية للرمز بالسماح للأحرف القابلة للطباعة فقط.

الخطوة 8: استيراد البيانات وعمل رسم بياني

استيراد البيانات وعمل رسم بياني
استيراد البيانات وعمل رسم بياني
استيراد البيانات وعمل رسم بياني
استيراد البيانات وعمل رسم بياني
استيراد البيانات وعمل رسم بياني
استيراد البيانات وعمل رسم بياني
  1. استيراد البيانات من نص ضمن علامة التبويب بيانات (Excel 2013)
  2. افصل البيانات بالفاصلة (وهذا هو السبب في أن وجود الفاصلات بعد كل إدخال بيانات مفيد)
  3. ارسم البيانات. كل البيانات أدناه لديها حوالي 1700 نقطة. الفاصل الزمني للقياس 5 دقائق (قابل للتعديل). الحد الأدنى لدارات DO و pH لقراءة البيانات هو 1.8 ثانية.

الخطوة 9: المعايرة

معايرة
معايرة
  1. يمكن معايرة مستشعر درجة الحرارة الرقمي (18B20) عن طريق ضبط الاختلاف مباشرة على. خلاف ذلك ، إذا كان التعويض والمعايرة مطلوبان ، فيمكنك القيام بذلك عن طريق تغيير القيم في السطر # 453 ، DallasTemperature.cpp في المجلد / libraries / DallasTemperature.
  2. بالنسبة إلى مجسات الأس الهيدروجيني والأكسجين المذاب ، يمكنك معايرة المجسات بالمحاليل المصاحبة لها. يجب عليك استخدام نموذج التعليمات البرمجية بواسطة Atlas Scientific واتباع التعليمات الموجودة في هذا الملف.
  3. يرجى اتباع الصفحتين 26 و 50 لمسبار الأس الهيدروجيني (https://goo.gl/d62Rqv) للمعايرة وتعويض درجة الحرارة ، وكذلك الصفحات 7-8 و 50 لمسبار DO (https://goo.gl/mA32mp). أولاً ، يرجى إعادة تحميل الكود العام الذي قدمه أطلس ، وافتح Serial Monitor وأدخل الأمر المناسب.

الخطوة 10: الكثير من الأسلاك؟

  1. يمكنك التخلص من بطاقة SD ووحدة ساعة الوقت الفعلي باستخدام Dragino Yun Shield للوحات Arduino (https://goo.gl/J9PBTH). يجب تعديل الكود للعمل مع Yun Shield. هنا مكان جيد للبدء (https://goo.gl/c1x8Dm)
  2. لا يزال الكثير من الأسلاك: قدم Atlas Scientific دليلًا لدارات EZO الخاصة بهم (https://goo.gl/dGyb12) ولوحة اللحام (https://goo.gl/uWF51n). دمج درجة الحرارة الرقمية 18B20 هنا (https://goo.gl/ATcnGd). يجب أن تكون على دراية بالأوامر الموجودة على Raspbian (نسخة من Debian Linux) التي تعمل على Raspberry Pi (https://goo.gl/549xvk)

الخطوة 11: الإقرار:

هذا هو مشروعي الجانبي خلال بحثي بعد الدكتوراه الذي عملت فيه على مفاعل حيوي ضوئي متقدم لزراعة الطحالب الدقيقة. لذلك اعتقدت أنه من الضروري أن ينسب الفضل إلى أن الأطراف وفرت الشروط لتحقيق ذلك. أولاً ، المنحة ، DE-EE0007093: "إثراء الغلاف الجوي لثاني أكسيد الكربون وتسليمه (ACED) ،" من وزارة الطاقة الأمريكية ، مكتب كفاءة الطاقة والطاقة المتجددة المستهدفة للوقود الحيوي الطحالب والمنتجات الحيوية. أشكر الدكتور Bruce E. Rittmann في Biodesign Swette Center for Environmental Biotechnology ، في جامعة ولاية أريزونا لإعطائي الفرصة للتلاعب بالإلكترونيات و Arduino. لقد تدربت على الهندسة البيئية ، معظمها في الكيمياء ، وقليلاً من علم الأحياء الدقيقة.

موصى به: