در این پروژه یک یخچال قدیمی را با استفاده از آردوینو پرو مینی دیجیتالی می کنیم. برای اندازه گیری دما از سنسور دمای DS18B20 استفاده می کنیم.
وسایل مورد نیاز :
- LCD 16*2
- پتانسیومتر 5KΩ
- آردوینو پرو مینی
- مقاومت 220Ω
- مقاومت 4.7KΩ
- سیم برد بورد
- کابل پروگرام کردن (تبدیل سریال به TTL)
- LED
- سنسور DS18B20
اول از همه مدار را مانند شکل زیر می بندیم. و قطعات را به هم اتصال می دهیم.
بعد از بستن مدار برنامه ی زیر را در آردوینو آپلود می کنیم. توجه داشته باشید که برای پروگرام کردن اردوینو پرو مینی قبل از آپلود برنامه حتما باید اردوینو ریست شود. برای اینکه دقیقا زمان آپلود را نمی دانیم. از زمانی که کامپایلر شروع به کامپایل برنامه ما می کند. شروع به ریست کردن می کنیم. تا اینکه بخواهد آپلود کند، که در آن زمان دیگه ریست نمی کنیم. برای آشنایی بیشتر به این مطلب مراجعه کنید.
/********************************************************************/ // First we include the libraries #include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal.h> #include <TimerOne.h> #include <EEPROM.h> /********************************************************************/ // Data wire is plugged into pin 2 on the Arduino #define ONE_WIRE_BUS 10 /********************************************************************/ //motor pin #define DOWNButton 8 #define UPButton 9 #define ADDR 10 #define LEDIN 11 #define CHECKDOOR 12 #define MOTOR 13 #define ERRORTEMP 1.44 //because my 18b20 with wire show 1.44 less than real temp //declare global value volatile bool *door; volatile bool vaziat; volatile int timeopen=0; /********************************************************************/ // Setup a oneWire instance to communicate with any OneWire devices // (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); /********************************************************************/ // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); /********************************************************************/ LiquidCrystal lcd(2,3,4,5,6,7); /********************************************************************/ /********************************************************************/ // declare value int _min , _max; int settime=0; bool L=0; byte temp=10; /********************************************************************/ //Creat Character byte sotoon1[8] = { B10000, B10000, B10000, B10000, B10000, B10000, B10000, B10000 }; byte sotoon2[8] = { B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000 }; byte sotoon3[8] = { B11100, B11100, B11100, B11100, B11100, B11100, B11100, B11100 }; byte sotoon4[8] = { B11110, B11110, B11110, B11110, B11110, B11110, B11110, B11110 }; byte sotoon5[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 }; byte daraje[8] = { B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 }; /********************************************************************/ /******************************************************************************************************************************************/ void setup(void) //START VOID SETUP { pinMode (MOTOR,OUTPUT); pinMode (CHECKDOOR,INPUT); pinMode (LEDIN,OUTPUT); pinMode (UPButton, INPUT_PULLUP); pinMode (DOWNButton, INPUT_PULLUP); /********************************************************************/ // Set Timer one Interrupt Timer1.initialize(500000); Timer1.attachInterrupt(Opendoor); /********************************************************************/ //set eeprom for first time temp = EEPROM.read(ADDR); if (temp > 15 || temp < 7) temp=10; /********************************************************************/ //set number to charector lcd.createChar(0,sotoon1); lcd.createChar(1,sotoon2); lcd.createChar(2,sotoon3); lcd.createChar(3,sotoon4); lcd.createChar(4,sotoon5); lcd.createChar(5,daraje); /********************************************************************/ //WellComing WellComing lcd.begin(16,2); // start serial port Serial.begin(9600); Serial.println(F("refrigerator")); lcd.setCursor(0,0); lcd.print("--refrigerator--"); lcd.setCursor(0,1); lcd.print("produceby Sobhan"); delay(2000); lcd.setCursor(0,1); lcd.print(" "); /********************************************************************/ //delay for power on for(int k=0;k<4;k++) { delay(1000); lcd.setCursor(0,1); lcd.print("Time Delay : "); lcd.print(k,DEC); if (L == 1) { digitalWrite(LEDIN, LOW); L=0; } else { digitalWrite(LEDIN,HIGH); L=1; } } delay(1000); /********************************************************************/ // use charector for change display for(int i=0;i<16;i++) { for(int j=0;j<5;j++) { lcd.setCursor(i,1); lcd.write(j); delay(100); } } lcd.clear(); // Start up the library sensors.begin(); } /********************************************************************/ // Time of Door Open interrupt void Opendoor() { vaziat = digitalRead(CHECKDOOR); door = &vaziat; if (vaziat == 1) { timeopen++; if (timeopen==30) { Serial.println("ALARM"); delay(500); alarm(); } } else { timeopen = 0; } Serial.print("vaziat"); Serial.println(timeopen,DEC); } /********************************************************************/ //function of alarm ALARM void alarm(void) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Close The Door"); lcd.setCursor(0,1); lcd.print(" "); while (*door == 1) { vaziat = digitalRead(CHECKDOOR); for (int a=0;a<255;a++) { analogWrite(LEDIN,a); delay(50); } lcd.display(); for (int a=255;a>=0;a--) { analogWrite(LEDIN,a); delay(50); } lcd.noDisplay(); } digitalWrite(LEDIN,LOW); lcd.display(); lcd.clear(); } /****************************************************************************************************************************************/ // START LOOOOOOOOOOOOOOOOOOOOOOP void loop(void) { /****************************************************************************************************************************************/ // SET Temperature if (digitalRead(UPButton) == LOW && digitalRead(DOWNButton) == LOW) { settime=0; Serial.println("in set temp"); lcd.clear(); lcd.setCursor(0,0); lcd.print("Set Temperature"); delay(2000); while(!(digitalRead(UPButton) == LOW && digitalRead(DOWNButton) ==LOW)) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Set Temperature"); lcd.setCursor(8,1); lcd.print(" "); lcd.setCursor(8,1); lcd.print(temp,DEC); lcd.write(5); delay(500); Serial.println(temp,DEC); if (digitalRead(UPButton) == LOW && temp < 15) { temp++; settime = 0; EEPROM.write(ADDR,temp); delay(50); } else if (digitalRead(DOWNButton) == LOW && temp > 7) { temp--; EEPROM.write(ADDR,temp); delay(50); settime = 0; } settime++; if(settime==60) { break; } } lcd.clear(); } /********************************************************************/ // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus /********************************************************************/ Serial.println(); Serial.println(F(" Requesting temperatures...")); sensors.requestTemperatures(); // Send the command to get temperature readings Serial.println("DONE"); /********************************************************************/ //Set Min And Max For Temp _min = temp-3; _max = temp+3; /*******************************************************************************************************************************************/ //control motor of refrigerator MOTOR if ((sensors.getTempCByIndex(1)+ERRORTEMP) < _min) { digitalWrite (MOTOR,LOW); } if ((sensors.getTempCByIndex(1)+ERRORTEMP) > _max) { digitalWrite (MOTOR, HIGH); } /*******************************************************************************************************************************/ // Check Door For Open And Alarm When It Open Long ALARM /*************************************************************************************************************************/ //Show Temperature SHOW TEMP Serial.print(F("Temperature Out is: ")); Serial.println(sensors.getTempCByIndex(0)); // Why "byIndex"? Serial.print(F("Temperature In is: ")); Serial.println(sensors.getTempCByIndex(1)+ERRORTEMP); // You can have more than one DS18B20 on the same bus. // 0 refers to the first IC on the wire lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,0); lcd.print("Temp Out= "); lcd.print(sensors.getTempCByIndex(0)); lcd.write(5); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("Temp In = "); lcd.print(sensors.getTempCByIndex(1)+ERRORTEMP); lcd.write(5); delay(1000); }
حال به تفصیر برنامه دیجیتالی کردن یخچال می پردازیم
در آغاز تمام کتابخانه هایی که احتیاج داریم را فرا خوانی می کنیم.
برای ارتباط تک سیم باید کتاخانه onewire را صدا بزنبم. بعد از آن برای راحتی استفاده از سنسور دمای DS18B20 کتابخانه dallasTemperature را صدا می زنیم. برای استفاده از LCD، کتابخانه ی liquidcrystal را صدا می زنیم. برای استفاده از اینتراپت تایمر یک کتابخانه ی Timerone را صدا می زنیم. و در آخر هم برای اینکه بتوانیم از حافظه ی EEPROM میکرو کنترلر اسنفاده کنیم کتابخانه ی EEPROM را صدا می زنیم.
از define برای این استفاده می کنیم که، اگر بخواهیم یک پایه را عوض کنیم. در کل برنامه لازم نباشد که جستجو کنیم و فقط define ان را عوض می کنیم.
ای سه متغیر را در بالای برنامه تعریف می کنیم تا در همه ی توابع قابل دسترس باشند.
برای نصب و استفاده از LCD به این مطلب مراجعه کنید.
اینتراپت تایمر یک را فعال میکنیم. هر وقت وقفه ایجاد شود تابع Opendoor را صدا می زند.
برای خواندن یک خانه مشخص از حافظه ی EEPROM از این دستور استفاده میکنیم. ما از خانه 10 استفاده کردیم.
برای استفاده از ارتباط سریال این مطلب را بخوانید.
چون ممکن است یخچخال با قطع و وصل شدن برق آسیب ببیند. یک تاخیر در اول برنامه ایجاد می کنیم. تا با تاخیر شروع به کار کند.
تابع opendoor توسط وقفه صدا زده می شود تا زمان باز ماندن در را حساب کند.
تابع ALARM زمانی که در باز بماند صدا زده می شود. توجه داشته باشید که چون این تابع در داخل وقفه صدا زده شده، هنوز داخل وقفه هستیم. و بعد از اتمام این تابع، برنامه دوباره از همان جایی که به وقفه رفته، دنبال می شود.
در قسمت تنظیم دما با فشار دادن دو کلید به منوی تنظیم می رویم. با فشار دادن همزمان همان کلید ها از منو خارج می شویم. اگر مدت زمانی هم هیچ کلیدی را فشار ندهیم باز هم از این منو خارج می شود. در ضمن دمای تنظیم شده را در حافظه ی EEPROM ذخیره می کند. که اگر برق رفت تنظیمات باقی مانده باشد.
در قسمت کنترل موتور از دمای تنظیم شده یک سطح پایین و سطح بالا ایجاد می کنیم. هر وقت دما از سطح پایین کمتر شد موتور را خاموش می کند. و هر وقت دما از سطح بالا بیشتر شد، موتور را روشن می کند.
آخر برنامه هم که مربوط به نمایش دما بر روی LCD می باشد.
در نقشه توجه به اتصال چند سنسور دما به هم داشته باشید. و دسترسی آن در برنامه که به راحتی قابل انجام است.
در ادامه فیلم تست شده ی مدار را هم قرار داده ام.
دیدگاه ها :