2016年9月24日土曜日

arduino uno control inverter control fridge sketch.

#include <LiquidCrystal.h>

LiquidCrystal lcd(6,7,8,9,10,11); // comp relay =normalopen type
int eva_temp,fre_temp,ref_temp,volume,level,h1,h2,h3,l,ev,ft,last_ft=1,rt,sample1=0,sample2=0,sample3=0,time=0,show_all,t,s,leveltemp; // 実際のサーミスターとカップリング抵抗の位置と計算に気をつける、timeは強制霜取りボタンの長押し用
unsigned long curr_time,last_def,display_int,last_display,compon,compon1,compoff,comp_interval,temp_int,last_temp; //defrost interval time
const int ry_comp=4,ry_heater=5,disclose=12,def_switch=19; //relay,defrost led,discloseはメンテナンス用の表示目的

void setup(){
 lcd.begin(16,2);
 pinMode(ry_comp,OUTPUT);
 pinMode(ry_heater,OUTPUT);
 pinMode(disclose,OUTPUT);  //表示切り替え用ピン
 pinMode(def_switch,INPUT);
 last_def=millis();
 last_display=millis();
 last_temp=millis();
 compoff=millis();
}
void loop(){
 while (millis()<=3000){
   digitalWrite(ry_comp,LOW);
   lcd.print("  >> test <<"); // display "brand name"
   lcd.setCursor(0,1);
   lcd.print(" INVERTER MODEL"); // display "model number"
 }
 while (millis()<=180000){
   digitalWrite(ry_comp,LOW);  //3 min delay start compressor after reset
  display_int=millis();
  if((display_int-last_display)>1000){ // モニタイングの為 全てを表示 1秒毎 必要に応じて温度表示をパラメーターに変更
 lcd.clear();
 lcd.print("> 3 min safety <");
 lcd.setCursor(0,1);
 lcd.print(">delay starting<");
 last_display=display_int;
  }
 }
  sample3=digitalRead(def_switch); // 3sec push for defrost
  if (sample3==LOW){
    time++;
    delay(1);
  }else{
    time=0;
  }
  if(time>3000){
    time=0;
    goto defrost;
  }
 eva_temp=analogRead(1); // 6k thermister + 10k
 volume=analogRead(2);   // 10k
 fre_temp=analogRead(3); // 6k thermister + 10k
 ref_temp=analogRead(4); // 6k thermister + 10k
 ft=fre_temp/12-54; //-18c stanrad
 rt=ref_temp/9-71; // 3c standard
 level=volume/7+383; // -22c min max -10c
 leveltemp=level/12-54;
 h1=level+90;  // low speed +7.5c
 h2=level+102; // 2nd speed +8.5c
 h3=level+138; // 3rd speed +11.5c
 l=level-90;  // differencial -7.5c to start with 1.5c

compon=millis();
 if (h3<fre_temp&&(compon-compoff>180000)){      // h3以上の温度で尚且つ前回コンプレッサー停止後3分経過している。
 digitalWrite(ry_comp,HIGH); // コンプレッサーが回るときはいつでもfan motorを回転させる為にry_compのリレーはON

  t=87;
  tone(13,t);
    eva_temp=analogRead(1); // 6k thermister + 10k
    volume=analogRead(2);   // 10k
    fre_temp=analogRead(3); // 6k thermister + 10k
    ref_temp=analogRead(4); // 6k thermister + 10k
    ft=fre_temp/12-54; //-18c stanrad
    rt=ref_temp/9-71; // 3c standard
    level=volume/7+383; // -22c min max -10c
    leveltemp=level/12-54;
    h1=level+90;  // low speed +7.5c
    h2=level+102; // 2nd speed +8.5c
    h3=level+138; // 3rd speed +11.5c
    l=level-90;  // differencial -7.5c to start with 1.5c
  display_int=millis();
  if((display_int-last_display)>1000){                  // モニタイングの為 全てを表示 1秒毎 必要に応じて温度表示をパラメーターに変更
 lcd.clear();
 lcd.print(t);
 lcd.print("Hz/FR");
 lcd.setCursor(8,0);
 lcd.print(ft);
 lcd.print("c");
 lcd.setCursor(13,0);
 lcd.print(eva_temp);
 lcd.setCursor(0,1);
 lcd.print("h3");
 lcd.setCursor(4,1);
 lcd.print(h3);

 lcd.setCursor(9,1);
 lcd.print(leveltemp);
 lcd.print("c");
 lcd.setCursor(13,1);
 lcd.print(level);
 last_display=display_int;
  }
 }
 compon=millis();
 if (h2<fre_temp&&fre_temp<=h3&&(compon-compoff>180000)){  
digitalWrite(ry_comp,HIGH);
  t=75;
  tone(13,t); // top speed
    eva_temp=analogRead(1); // 6k thermister + 10k
    volume=analogRead(2);   // 10k
    fre_temp=analogRead(3); // 6k thermister + 10k
    ref_temp=analogRead(4); // 6k thermister + 10k
    ft=fre_temp/12-54; //-18c stanrad
    rt=ref_temp/9-71; // 3c standard
    level=volume/7+383; // -22c min max -10c
    leveltemp=level/12-54;
    h1=level+90;  // +7.5c
    h2=level+102; // 2nd speed at +8.5c
    h3=level+138; // 3rd speed at +11.5c
    l=level-90;  // -7.5 c to start with 1.5c
  display_int=millis();
  if((display_int-last_display)>1000){                    // モニタイングの為 全てを表示 1秒毎 必要に応じて温度表示をパラメーターに変更
 lcd.clear();
 lcd.print(t);
 lcd.print("Hz/FR");
 lcd.setCursor(8,0);
 lcd.print(ft);
 lcd.print("c");
 lcd.setCursor(13,0);
 lcd.print(eva_temp);
 lcd.setCursor(0,1);
 lcd.print("h2");
 lcd.setCursor(4,1);
 lcd.print(h2);

 lcd.setCursor(9,1);
 lcd.print(leveltemp);
 lcd.print("c");
 lcd.setCursor(13,1);
 lcd.print(level);
 last_display=display_int;
  }
  }
  compon=millis();
  if (h1<fre_temp&&fre_temp<=h2&&(compon-compoff>180000)){  
  digitalWrite(ry_comp,HIGH);
  t=66;
  tone(13,t); // top speed
    eva_temp=analogRead(1); // 6k thermister + 10k
    volume=analogRead(2);   // 10k
    fre_temp=analogRead(3); // 6k thermister + 10k
    ref_temp=analogRead(4); // 6k thermister + 10k
    ft=fre_temp/12-54; //-18c stanrad
    rt=ref_temp/9-71; // 3c standard
    level=volume/7+383; // -22c min max -10c
    leveltemp=level/12-54;
    h1=level+90;  // +7.5c
    h2=level+102; // 2nd speed at 8.5c
    h3=level+138; // 3rd speed at 11.5c
    l=level-90;  // -7.5c to start with 1.5c
  display_int=millis();
  if((display_int-last_display)>1000){                    // モニタイングの為 全てを表示 1秒毎 必要に応じて温度表示をパラメーターに変更
 lcd.clear();
 lcd.print(t);
 lcd.print("Hz/FR");
 lcd.setCursor(8,0);
 lcd.print(ft);
 lcd.print("c");
 lcd.setCursor(13,0);
 lcd.print(eva_temp);
 lcd.setCursor(0,1);
 lcd.print("h1");
 lcd.setCursor(4,1);
 lcd.print(h1);

 lcd.setCursor(9,1);
 lcd.print(leveltemp);
 lcd.print("c");
 lcd.setCursor(13,1);
 lcd.print(level);
 last_display=display_int;
  }
   }
  if (l<fre_temp&&fre_temp<=h1){  
    eva_temp=analogRead(1); // 6k thermister + 10k
    volume=analogRead(2);   // 10k
    fre_temp=analogRead(3); // 6k thermister + 10k
    ref_temp=analogRead(4); // 6k thermister + 10k
    ft=fre_temp/12-54; //-18c stanrad
    rt=ref_temp/9-71; // 3c standard
    level=volume/7+383; // -22c min max -10c
    leveltemp=level/12-54;
    h1=level+90;  // +7.5c
    h2=level+102; // 2nd speed at 8.5c
    h3=level+138; // 3rd speed at 11.5c
    l=level-90;  // -7.5c to start with 1.5c
  display_int=millis();
  if((display_int-last_display)>1000){                    // モニタイングの為 全てを表示 1秒毎 必要に応じて温度表示をパラメーターに変更
 lcd.clear();
 lcd.print(t);
 lcd.print("Hz/FR");
 lcd.setCursor(8,0);
 lcd.print(ft);
 lcd.print("c");
 lcd.setCursor(13,0);
 lcd.print(eva_temp);
 lcd.setCursor(0,1);
 lcd.print("low < h1");
 lcd.setCursor(9,1);
 lcd.print(leveltemp);
 lcd.print("c");
 lcd.setCursor(13,1);
 lcd.print(level);
 last_display=display_int;
  }
   }
 
   if (fre_temp<=l){                                              // ftがl以下になったらコンプレッサーとファンモーターを停止
    digitalWrite(ry_comp,LOW);
    t=0;
    noTone(13);
    compoff=millis();
 eva_temp=analogRead(1); // 6k thermister + 10k
    volume=analogRead(2);   // 10k
    fre_temp=analogRead(3); // 6k thermister + 10k
    ref_temp=analogRead(4); // 6k thermister + 10k
    ft=fre_temp/12-54; //-18c stanrad
    rt=ref_temp/9-71; // 3c standard
    level=volume/7+383; // -22c min max -10c
    leveltemp=level/12-54;
    h1=level+90;  // +7.5c
    h2=level+102; // 2nd speed at 8.5c
    h3=level+138; // 3rd speed at 11.5c
    l=level-90;  // -7.5c to start with 1.5c
  display_int=millis();
  if((display_int-last_display)>1000){                    // モニタイングの為 全てを表示 1秒毎 必要に応じて温度表示をパラメーターに変更
 lcd.clear();
 lcd.print(t);
 lcd.print("Hz/FR");
 lcd.setCursor(8,0);
 lcd.print(ft);
 lcd.print("c");
 lcd.setCursor(13,0);
 lcd.print(eva_temp);
 lcd.setCursor(0,1);
 lcd.print("low");
 lcd.setCursor(4,1);
 lcd.print(l);

 lcd.setCursor(9,1);
 lcd.print(leveltemp);
 lcd.print("c");
 lcd.setCursor(13,1);
 lcd.print(level);
 last_display=display_int;
  }
  }

 curr_time=millis();
 if ((curr_time - last_def)>54000000&&eva_temp<629){ //15hours=1000x60x60x15&& -1c)
 defrost:

  digitalWrite(ry_comp,LOW);  //fan motor off
  noTone(13); // compressor stop signal
   while (eva_temp<689){ // th4.844k + 10k = 689(1024-335) at 5c
    eva_temp=analogRead(1); // 6k thermister + 10k
    volume=analogRead(2);   // 10k
    fre_temp=analogRead(3); // 6k thermister + 10k
    ref_temp=analogRead(4); // 6k thermister + 10k
    ft=fre_temp/12-54; //-18c stanrad
    rt=ref_temp/9-71; // 3c standard
    level=volume/7+383; // -22c min max -10c
   show_all=digitalRead(disclose);
  if(show_all==LOW){ // 全てを表示
 lcd.clear();
 lcd.print("FREEZER");
 lcd.setCursor(8,0);
 lcd.print(ft);
 lcd.print("c");
 lcd.setCursor(13,0);
 lcd.print(eva_temp);
 lcd.setCursor(0,1);
 lcd.print("HEAT UP");
 lcd.setCursor(8,1);
 lcd.print("R");
 lcd.print(rt);
 lcd.print("c");
 lcd.setCursor(13,1);
 lcd.print(level);
 delay(1000);
  } else {
    lcd.clear();
  lcd.print(" - DEFROSTING -");
  lcd.setCursor(0,1);
  lcd.print("Do not open door");
  delay(1000);
  }
     digitalWrite(ry_heater,HIGH); //heater on till defrost temp 5c
   }
   digitalWrite(ry_heater,LOW);
     comp_interval=millis();
   while (millis()-comp_interval<=300000){ //5 min
     eva_temp=analogRead(1); // 6k thermister + 10k
     volume=analogRead(2);   // 10k
     fre_temp=analogRead(3); // 6k thermister + 10k
     ref_temp=analogRead(4); // 6k thermister + 10k
     ft=fre_temp/12-54; //-18c stanrad
     rt=ref_temp/9-71; // 3c standard
     level=volume/7+383; // -22c min max -10c
   show_all=digitalRead(disclose);
  if(show_all==LOW){ // 霜取り中の全てパラメーターを表示
 lcd.clear();
 lcd.print("FREEZER");
 lcd.setCursor(8,0);
 lcd.print(ft);
 lcd.print("c");
 lcd.setCursor(13,0);
 lcd.print(eva_temp);
 lcd.setCursor(0,1);
 lcd.print("INTERVL");
 lcd.setCursor(8,1);
 lcd.print("R");
 lcd.print(rt);
 lcd.print("c");
 lcd.setCursor(13,1);
 lcd.print(level);
 delay(1000);
  } else {
    lcd.clear();
  lcd.print(" - DEFROSTING -");
  lcd.setCursor(0,1);
  lcd.print("Do not open door");
  delay(1000);
  }
   digitalWrite(ry_comp,LOW); // fan motor off
   noTone(13);
   }


  last_def=curr_time;
   }
}

0 件のコメント:

コメントを投稿