Refrigeretor Arduino Pro Mini

دیجیتالی کردن یخچال

            در این پروژه یک یخچال قدیمی را با استفاده از آردوینو پرو مینی دیجیتالی می کنیم. برای اندازه گیری دما از سنسور دمای DS18B20 استفاده می کنیم.

وسایل مورد نیاز :

  • LCD 16*2
  • پتانسیومتر 5KΩ
  • آردوینو پرو مینی
  • مقاومت 220Ω
  • مقاومت 4.7KΩ
  • سیم برد بورد
  • کابل پروگرام کردن (تبدیل سریال به TTL)
  • LED
  • سنسور DS18B20

اول از همه مدار را مانند شکل زیر می بندیم. و قطعات را به هم اتصال می دهیم.

DS18B20 LCD Arduino Pro Mini

DS18B20 LCD Arduino Pro Mini

            بعد از بستن مدار برنامه ی زیر را در آردوینو آپلود می کنیم.  توجه داشته باشید که برای پروگرام کردن اردوینو پرو مینی قبل از آپلود برنامه حتما باید اردوینو ریست شود. برای اینکه دقیقا زمان آپلود را نمی دانیم. از زمانی که کامپایلر شروع به کامپایل برنامه ما می کند. شروع به ریست کردن می کنیم. تا اینکه بخواهد آپلود کند، که در آن زمان دیگه ریست نمی کنیم. برای آشنایی بیشتر به این مطلب مراجعه کنید.

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

            در نقشه توجه به اتصال چند سنسور دما به هم داشته باشید. و دسترسی آن در برنامه که به راحتی قابل انجام است.

در ادامه فیلم تست شده ی مدار را هم قرار داده ام.

 

 

 

دیدگاه ها :

من بات نیستم

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *