فهرست مطالب:
- مرحله 1:
- مرحله 2: قطعات زیر را خریداری کنید:
- مرحله 3: سیم کشی
- مرحله 4: PH ، DO Circuits ، SD Card را آماده کنید
- مرحله 5: نرم افزار را آماده کنید
- مرحله 6: برنامه نویسی را شروع کنید
- مرحله 7: نتایج مربوط به سیم کشی (قابل بهبود است) و نمایشگر LCD
- مرحله 8: وارد کردن داده ها و ایجاد نمودار
- مرحله 9: کالیبراسیون
- مرحله 10: سیم کشی بیش از حد؟
- مرحله 11: تصدیق:
تصویری: نحوه ساخت دیتا لاگر برای دما ، PH و اکسیژن محلول: 11 مرحله (همراه با تصاویر)
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:56
اهداف:
- با 500 دلار پوند یک ثبت کننده داده بسازید. این داده ها را برای دما ، pH و DO با مهر زمان و با استفاده از ارتباط I2C ذخیره می کند.
- چرا I2C (مدار مجتمع)؟ با توجه به اینکه هر یک از آنها آدرس منحصر به فردی دارند ، می توان تعداد زیادی سنسور را در یک خط قرار داد.
مرحله 1:
مرحله 2: قطعات زیر را خریداری کنید:
- آردوینو MEGA 2560 ، 35 دلار ،
- آداپتور برق برای برد آردوینو ، 5.98 دلار ،
- ماژول LCD I2C (صفحه نمایش) ، 8.99 دلار ،
- شکست زمان واقعی (RTC) ، 7.5 دلار ،
- برد شکستن کارت MicroSD ، 7.5 دلار ،
- کارت SD 4 گیگابایتی ، 6.98 دلار ،
- سنسور دیجیتال ضد آب DS18B20 ، 9.95 دلار ،
- کاوشگر pH + کیت + بافرهای استاندارد ، 149.15 دلار ،
- DO probe + Kits + Standard buffers ، 247.45 دلار ،
- تخته نان ، کابل جامپر ، 7.98 دلار ،
- (اختیاری) عایق ولتاژ ، 24 دلار ،
مجموع: 510.48 دلار
* برخی قطعات (مانند تخته عمومی) را می توان از فروشندگان دیگر (eBay ، فروشنده چینی) با قیمت کمتر خریداری کرد. کاوشگرهای pH و DO برای دریافت آنها از اطلس علمی توصیه می شود.
* مولتی متر برای بررسی رسانایی و ولتاژ توصیه می شود. هزینه آن حدود 10-15 دلار است (https://goo.gl/iAMDJo)
مرحله 3: سیم کشی
- برای اتصال قطعات مطابق تصویر زیر ، از کابل های jumper/DuPont استفاده کنید.
- برای بررسی رسانایی از مولتی متر استفاده کنید.
- منبع تغذیه ولتاژ مثبت (VCC) و زمین (GND) را بررسی کنید (اگر با مدار آشنایی ندارید اشتباه می شود)
- آداپتور برق را وصل کرده و نشانگر قدرت را در هر قسمت بررسی کنید. در صورت شک و تردید ، از مولتی متر برای بررسی ولتاژ بین VCC و GND (5V) استفاده کنید.
مرحله 4: PH ، DO Circuits ، SD Card را آماده کنید
- برای مدارهای pH و DO به I2C تغییر دهید
- شکستهای pH و DO با ارتباط سریال به عنوان حالت پیش فرض انتقال/دریافت (TX/RX) ارسال می شود. برای استفاده از خط ساعت حالت I2C (SCL) و خط داده (SDA) ، حالت را با (1) تغییر دهید: کابل های VCC ، TX ، RX را جدا نکنید ، (2): پرش TX به Ground for Probe ، PGND (نه GND) ، (3) VCC را به مدار وصل کنید ، (4): منتظر بمانید تا LED از سبز به آبی تغییر کند. جزئیات بیشتر را در صفحه 39 بررسی کنید (برگه اطلاعات مدار pH ،
- همین مرحله را با مدار DO انجام دهید
- (اگر می دانید چگونه کد نمونه را روی برد بارگذاری کنید ، می توانید این کار را از طریق Serial monitor انجام دهید)
- فرمت کارت SD به فرمت FAT
مرحله 5: نرم افزار را آماده کنید
- دانلود محیط توسعه یکپارچه Arduino (IDE) ،
- نصب کتابخانه در Arduino IDE:
- اکثر آنها دارای نرم افزار آردوینو هستند. LiquidCrystal_I2C.h از طریق GitHub در دسترس است
- درایور را برای USB نصب کنید. برای آردوینو اصلی ، ممکن است نیازی به نصب آن نداشته باشید. برای یک نسخه عمومی ، باید درایور CH340 را نصب کنید (GitHub:
- با آزمایش LED چشمک زن ، بررسی کنید که آیا برد را به درستی وصل کرده اید یا خیر
- نحوه پیدا کردن آدرس MAC دمای دیجیتال 18B20. استفاده از الگوی اسکنر I2C در Arduino IDE با پروب وصل شده. هر دستگاه دارای یک آدرس MAC منحصر به فرد است ، بنابراین می توانید از تعداد زیادی پروب دما با یک خط مشترک استفاده کنید (شماره 9). 18B20 از یک سیم I2C استفاده می کند ، بنابراین مورد خاصی از روش ارتباط I2C است. در زیر یک روش برای یافتن MAC - کنترل دسترسی پزشکی ("ROM" هنگام اجرای روش زیر) آمده است.
مرحله 6: برنامه نویسی را شروع کنید
- کد زیر را در Arduino IDE کپی کنید:
- یا کد (.ino) را بارگیری کنید و یک پنجره جدید باید در Arduino IDE ظاهر شود.
/*
آموزش های مرجع:
1. دما ، ORP ، pH logger:
2. Secured Digital (SD) Shield:
این کد داده ها را به مانیتور سریال Arduino منتقل می کند. دستوراتی را در مانیتور سریال آردوینو تایپ کنید تا مدار PH EZO را در حالت I2C کنترل کنید.
اصلاح شده از آموزش های ذکر شده در بالا ، بیشتر از کد I2C توسط Atlas-Scientific
آخرین به روز رسانی: 26 ژوئیه 2017 توسط Binh Nguyen
*/
#include // I2C را فعال کنید.
#تعریف pH_ddress 99 // شماره ID پیش فرض I2C برای مدار pH EZO.
#تعریف DO_address 97 // شماره ID پیش فرض I2C برای EZO DO Circuit.
#شامل "RTClib.h" // توابع تاریخ و زمان با استفاده از RTC DS1307 متصل از طریق I2C و Wire lib
RTC_DS1307 rtc؛
#شامل // برای کتابخانه SD
#شامل // کارت SD برای ذخیره داده ها
const int chipSelect = 53؛ // باید برای Adafruit SD breakout // // https://learn.adafruit.com/adafruit-micro-sd-breakout-board-card-tutorial/wiring پیدا کنید
// DO = MISO ، DI = MOSI ، در پین ATmega#: 50 (MISO) ، 51 (MOSI) ، 52 (SCK) ، 53 (SS)
char logFileName = "dataLT.txt"؛ // اصلاح logFileName برای شناسایی آزمایش خود ، برای exampe PBR_01_02 ، datalog1
id طولانی = 1 ؛ // شماره شناسه برای وارد کردن دستور ورود
#عبارتند از
LiquidCrystal_I2C ال سی دی (0x27 ، 20 ، 4) ؛
#عبارتند از
#عبارتند از
# تعریف ONE_WIRE_BUS 9 // پین # را برای پروب دما تعریف کنید
OneWire oneWire (ONE_WIRE_BUS) ؛
سنسورهای دما دالاس (& oneWire) ؛
DeviceAddress ProbeP = {0x28 ، 0xC2 ، 0xE8 ، 0x37 ، 0x07 ، 0x00 ، 0x00 ، 0xBF} ؛ // آدرس MAC ، منحصر به فرد برای هر کاوشگر
رشته داده // نسخه اصلی برای ذخیره همه داده ها
رشته دادهString2؛ // یک نوع موقت برای ذخیره دما/pH/DO برای چاپ
char computerdata [20]؛ // دستورالعمل Atlas Scientific: ما یک آرایه کاراکتر 20 بایتی برای نگهداری داده های ورودی از رایانه/مک/دیگر ایجاد می کنیم.
بایت دریافت_از رایانه = 0؛ // ما باید بدانیم چند کاراکتر دریافت شده است.
byte serial_event = 0؛ // یک پرچم برای نشان دادن هنگامی که داده ها از رایانه/mac/other دریافت شده است.
کد بایت = 0 ؛ // برای نگه داشتن کد پاسخ I2C استفاده می شود.
کاراکتر pH_data [20]؛ // ما یک آرایه کاراکتر 20 بایتی برای نگهداری داده های ورودی از مدار pH می سازیم.
بایت in_char = 0؛ // به عنوان یک بافر 1 بایت برای ذخیره در بایت های محدود شده از مدار pH استفاده می شود.
بایت i = 0؛ // شمارنده مورد استفاده برای آرایه ph_data.
int time_ = 1800 ؛ // برای تغییر تأخیر مورد نیاز بسته به دستور ارسال شده به مدار PH کلاس EZO استفاده می شود.
شناور pH_float؛ // float var برای نگه داشتن مقدار float pH استفاده می شود.
char DO_data [20]؛
// float temp_C؛
void setup () // مقداردهی اولیه سخت افزار.
{
Serial.begin (9600)؛ // فعال کردن پورت سریال
Wire.begin (آدرس pH_) ؛ // پورت I2C را برای کاوشگر pH فعال کنید
Wire.begin (DO_address) ؛
lcd.init ()؛
lcd.begin (20 ، 4) ؛
lcd.lightlight ()؛
lcd.home ()؛
lcd.print ("سلام PBR!") ؛
lcd.setCursor (0 ، 1) ؛
lcd.print ("در حال راه اندازی…") ؛
Serial.print ("RTC است …") ؛
اگر (! rtc.begin ())
{
Serial.println ("RTC: ساعت در زمان واقعی … پیدا نشد") ؛
در حالی که (1) ؛ // (Serial.println ("RTC: ساعت در زمان واقعی … پیدا شد")) ؛
}
Serial.println ("در حال اجرا") ؛
Serial.print ("ساعت در زمان واقعی …") ؛
اگر (! rtc.isrunning ())
{rtc.adjust (DateTime (F (_ DATE_) ، F (_ TIME_))) ؛
}
Serial.println ("کار") ؛
lcd.setCursor (0 ، 0) ؛
lcd.println ("RTC: OK") ؛
Serial.print ("کارت SD …") ؛ // ببینید آیا کارت موجود است و می توان آن را مقداردهی کرد:
if (! SD.begin (chipSelect))
{Serial.println ("ناموفق") ؛ // بیشتر کاری نکن:
برگشت؛
}
Serial.println ("OK") ؛
lcd.setCursor (0 ، 1) ؛
lcd.println ("کارت SD: OK") ؛
Serial.print ("ورود فایل:")؛
Serial.print (logFileName) ؛
Serial.print ("…") ؛
فایل logFile = SD.open (logFileName ، FILE_WRITE) ؛ // فایل را باز کنید "datalog" و چاپ سرصفحه
if (logFile)
{
logFile.println ("، ، ،") ؛ // نشان می دهد داده هایی در اجرای قبلی وجود داشته است
سرصفحه رشته = "Date -Time، Temp (C)، pH، DO"؛
logFile.println (سرصفحه) ؛
logFile.close ()؛
Serial.println ("آماده") ؛
//Serial.println(dataString) ؛ // روی پورت سریال نیز چاپ کنید:
}
else {Serial.println ("خطای بازکردن فهرست داده")؛ } // اگر فایل باز نیست ، خطایی را باز کنید:
lcd.setCursor (0 ، 2) ؛
lcd.print ("ورود فایل:")؛
lcd.println (logFileName) ؛
تاخیر (1000) ؛
sensors.begin ()؛
sensors.setResolution (ProbeP ، 10) ؛ // 10 رزولوشن است (10 بیت)
lcd.clear ()؛
id = 0؛
}
حلقه خالی ()
{// حلقه اصلی
dataString = رشته (شناسه) ؛
dataString = String ('،')؛
DateTime now = rtc.now ()؛
dataString = String (now.year ()، DEC)؛
dataString += رشته ('/') ؛
dataString += String (now.month ()، DEC)؛
dataString += رشته ('/') ؛
dataString += String (now.day ()، DEC)؛
dataString += رشته ('')؛
dataString += String (now.hour () ، DEC) ؛
dataString += String (':')؛
dataString += String (now.minute () ، DEC) ؛
dataString += String (':')؛
dataString += رشته (now.second () ، DEC) ؛
lcd.home ()؛
lcd.print (dataString) ؛
sensors.request دما ()؛
displayTemperature (ProbeP) ؛
Wire.beginTransmission (pH_address)؛ // مدار را با شماره شناسه آن فراخوانی کنید
Wire.write ('r')؛ // سخت کد r برای خواندن مداوم
Wire.endTransmission ()؛ // پایان انتقال داده I2C.
زمان تاخیر_)؛ // مدت زمان صحیح را منتظر بمانید تا مدار دستورالعمل خود را کامل کند.
سیم. درخواست از (آدرس pH_ ، 20 ، 1) ؛ // با مدار تماس بگیرید و 20 بایت درخواست کنید (این ممکن است بیشتر از نیاز ما باشد)
در حالی که (Wire.available ()) // بایت هایی برای دریافت وجود دارد
{
in_char = Wire.read ()؛ // دریافت یک بایت
if ((in_char> 31) && (in_char <127)) // بررسی کنید آیا char قابل استفاده است (قابل چاپ)
{
pH_data = in_char؛ // این بایت را در آرایه ما بارگذاری کنید.
i+= 1 ؛
}
if (in_char == 0) // اگر دیدیم که یک دستور null برای ما ارسال شده است.
{
i = 0 ؛ // شمارنده i را به 0 بازنشانی کنید.
Wire.endTransmission ()؛ // پایان انتقال داده I2C.
زنگ تفريح؛ // از حلقه while خارج شوید.
}
}
serial_event = 0؛ // پرچم رویداد سریال را بازنشانی کنید.
dataString2 += "،"؛
dataString2 += رشته (pH_data) ؛
Wire.beginTransmission (DO_address) ؛ // مدار را با شماره شناسه آن فراخوانی کنید
Wire.write ('r')؛
Wire.endTransmission ()؛ // پایان انتقال داده I2C
زمان تاخیر_)؛ // مدت زمان صحیح را منتظر بمانید تا مدار دستورالعمل خود را کامل کند
سیم. درخواست از (DO_address، 20، 1)؛ // با مدار تماس بگیرید و 20 بایت درخواست کنید
در حالی که (Wire.available ()) // بایت هایی برای دریافت وجود دارد.
{
in_char = Wire.read ()؛ // دریافت یک بایت
if ((in_char> 31) && (in_char <127)) // بررسی کنید که آیا char قابل استفاده است (قابل چاپ) ، در غیر این صورت in_char دارای نمادی در ابتدا در فایل.txt است
{DO_data = in_char؛ // این بایت را در آرایه ما بارگذاری کنید
i+= 1 ؛ // باعث ایجاد شمارنده برای عنصر آرایه می شود
}
if (in_char == 0)
{// اگر دیدیم که یک دستور null برای ما ارسال شده است
i = 0 ؛ // شمارنده i را به 0 بازنشانی کنید.
Wire.endTransmission ()؛ // پایان انتقال داده I2C.
زنگ تفريح؛ // از حلقه while خارج شوید.
}
}
serial_event = 0؛ // پرچم رویداد سریال را بازنشانی کنید
pH_float = atof (pH_data) ؛
dataString2 += "،"؛
dataString2 += رشته (DO_data) ؛
lcd.setCursor (0 ، 1) ؛
lcd.print ("دما/ pH/ DO") ؛
lcd.setCursor (0 ، 2) ؛
lcd.print (dataString2) ؛
dataString += '،'؛
dataString += dataString2؛
file dataFile = SD.open (logFileName، FILE_WRITE)؛ // فایل را باز کنید توجه داشته باشید که فقط یک فایل می تواند در یک زمان باز شود ، بنابراین قبل از باز کردن فایل دیگر باید آن را ببندید.
if (dataFile) // اگر فایل موجود است ، برای آن بنویسید:
{
dataFile.println (dataString) ؛
dataFile.close ()؛
Serial.println (dataString) ؛ // روی پورت سریال نیز چاپ کنید:
}
else {Serial.println ("خطا در باز کردن فایل datalog") ؛ } // اگر فایل باز نیست ، خطایی را باز کنید:
lcd.setCursor (0 ، 3) ؛
lcd.print ("در حال اجرا (x5 متر):")؛
lcd.setCursor (15 ، 3) ؛
lcd.print (id) ؛
شناسه ++ ؛ // یک ID را در تکرار بعدی افزایش دهید
dataString = ""؛
تاخیر (300000) ؛ // تأخیر 5 دقیقه = 5*60*1000 میلی ثانیه
lcd.clear ()؛
} // پایان حلقه اصلی
void displayTemperature (DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC (deviceAddress) ؛
if (tempC == -127.00) lcd.print ("خطای دما") ؛
else dataString2 = رشته (tempC)؛
} // کد در اینجا به پایان می رسد
- پورت COM مناسب را از طریق Arduino IDE در قسمت Tools/Port انتخاب کنید
- برد مناسب آردوینو را انتخاب کنید. من از مگا 2560 استفاده کردم چون حافظه داخلی بیشتری دارد. Arduino Nano یا Uno با این تنظیمات خوب کار می کند.
- بررسی و کدگذاری و بارگذاری کد
مرحله 7: نتایج مربوط به سیم کشی (قابل بهبود است) و نمایشگر LCD
- توجه: من پس از 2-3 ماه کار مداوم با سر و صدای پروب DO به کاوشگر pH برخورد کردم. به گفته اطلس علمی ، هنگامی که pH ، پروبهای رسانایی با هم کار می کنند ، یک جداساز ولتاژ خطی توصیه می شود. جزئیات بیشتر در صفحه 9 (https://goo.gl/d62Rqv) آمده است
- داده های ثبت شده (اولین مورد دارای نویسه های چاپ نشده قبل از داده های pH و DO است). با اجازه دادن فقط نویسه های قابل چاپ ، کد را فیلتر کردم.
مرحله 8: وارد کردن داده ها و ایجاد نمودار
- وارد کردن داده ها از متن زیر برگه DATA (Excel 2013)
- داده ها را با کاما جدا کنید (به همین دلیل داشتن کاما بعد از هر ورودی داده مفید است)
- داده ها را ترسیم کنید هر داده زیر حدود 1700 امتیاز دارد. فاصله اندازه گیری 5 دقیقه (قابل تنظیم) است. حداقل مدارهای DO و pH برای خواندن داده ها 1.8 ثانیه است.
مرحله 9: کالیبراسیون
- سنسور دما دیجیتال (18B20) را می توان با تنظیم تفاوت به طور مستقیم کالیبره کرد. در غیر این صورت ، اگر جبران و شیب نیاز به کالیبراسیون دارد ، می توانید با تغییر مقادیر در خط شماره 453 ، DallasTemperature.cpp در پوشه / libraries / DallasTemperature.
- برای پروبهای pH و DO ، می توانید پروبها را با محلولهای همراه کالیبره کنید. شما باید از کد نمونه Atlas Scientific استفاده کنید و دستورالعمل های این فایل را دنبال کنید.
- لطفاً صفحات 26 و 50 را برای کاوشگر pH (https://goo.gl/d62Rqv) برای کالیبراسیون و جبران درجه حرارت و همچنین صفحات 7-8 و 50 را برای کاوشگر DO (https://goo.gl/mA32mp) دنبال کنید. ابتدا ، لطفاً کد عمومی ارائه شده توسط اطلس را مجدداً بارگذاری کنید ، Serial Monitor را باز کرده و دستور مناسب را وارد کنید.
مرحله 10: سیم کشی بیش از حد؟
- با استفاده از Dragino Yun Shield برای بردهای آردوینو (https://goo.gl/J9PBTH) می توانید کارت SD و ماژول ساعت واقعی را حذف کنید. برای کار با Yun Shield ، کد باید اصلاح شود. اینجا یک مکان خوب برای شروع است (https://goo.gl/c1x8Dm)
- هنوز سیم کشی بسیار زیاد است: اطلس علمی راهنمای مدارهای 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: "غنی سازی و تحویل CO2 اتمسفری (ACED)" ، از وزارت انرژی ایالات متحده ، دفتر بهره وری انرژی و انرژی های تجدید پذیر با هدف سوخت های زیستی جلبک ها و محصولات بیولوژیکی. من از دکتر Bruce E. Rittmann در Biodesign Swette Center for Environmental Biotechnology ، University State Arizona تشکر می کنم که به من این فرصت را داد تا با وسایل الکترونیکی و آردوینو کار کنم. من مهندسی محیط زیست ، بیشتر شیمی ، کمی میکروبیولوژی آموزش دیده بودم.
توصیه شده:
سنج اکسیژن خون DIY: 5 مرحله (همراه با تصاویر)
سنج اکسیژن خون DIY: در سال 2020 ، جهان با یک هیولای نامرئی به نام کرونا ویروس روبرو شد. این ویروس مردم را بسیار بیمار کرد & amp؛ ضعیف. بسیاری از افراد موارد خوب خود را از دست دادند. در ابتدا یک مشکل بزرگ وجود داشت ، مشکل عدم دسترسی به تجهیزات پزشکی مناسب مانند
نحوه افزودن اکسیژن محلول به کنتور هیدروپونیک وای فای: 6 مرحله
نحوه افزودن اکسیژن محلول به سنج هیدروپونیک وای فای: این آموزش نحوه افزودن مدار EBO D.O و کاوشگر به کیت هیدروپونیک WiFi از اطلس ساینتیک را نشان می دهد. فرض بر این است که کاربر کیت هیدروپونیک wifi کار می کند و اکنون آماده افزودن اکسیژن محلول است. هشدارها: Atlas Sci
نحوه ساخت هواپیمای بدون سرنشین با استفاده از Arduino UNO - ساخت کوادکوپتر با استفاده از میکروکنترلر: 8 مرحله (همراه با تصاویر)
نحوه ساخت هواپیمای بدون سرنشین با استفاده از Arduino UNO | ساخت کوادکوپتر با استفاده از میکروکنترلر: مقدمه دیدن کانال یوتیوب من یک پهپاد یک ابزار (محصول) بسیار گران قیمت برای خرید است. در این پست من قصد دارم در مورد اینکه چگونه آن را با قیمت ارزان تهیه کنم بحث کنم؟ و چگونه می توانید چنین چیزی را با قیمت ارزان تهیه کنید … خوب در هند همه مواد (موتورها ، ESC ها
ساخت دیتا لاگر با رزبری پای: 3 مرحله (همراه با تصاویر)
ساخت دیتا لاگر با رزبری پای: این دیتا لاگر ساده اندازه گیری های منظم نور را با LDR آنالوگ (Photoresistor) انجام می دهد و آنها را در یک فایل متنی روی رزبری پای شما ذخیره می کند. این دیتا لاگر هر 60 ثانیه سطح نور را اندازه گیری و ثبت می کند و به شما این امکان را می دهد که بر روی
نحوه ساخت جعبه بلندگوی گیتار یا ساخت دو دستگاه برای استریو: 17 مرحله (همراه با تصاویر)
نحوه ساخت جعبه بلندگوی گیتار یا ساختن دو دستگاه برای استریو: من می خواستم یک بلندگوی گیتار جدید با آمپول لوله ای که می سازم همراه شود. بلندگو در مغازه من بیرون می ماند ، بنابراین لازم نیست چیز خاصی باشد. روکش تولکس ممکن است خیلی راحت آسیب ببیند ، بنابراین من بعد از یک ماسه سبک ، قسمت خارجی را با رنگ سیاه اسپری کردم