/*on 03/10/2023, this is a three (room, fridge, freezer) temperature sensor (DS18B20)
(-55 to 125)°C, code to monitor & control compressor & defrost operations for a fridge  
the three sensors can be connected to one bus input to arduino as each
should have its own IP address according to its datasheet, yet in wokwi
simulator it doesn't so, I connected three separate sensors.
Any -127°C reading means a faulty connection*/
/*unsigned long millis function is used to overcome delay() function which suspends the
code until time elapses*/
/*there are three main timers in this code for controlling the different functions
1-startup timer which delays the start of the compressor only once after every power failure
to enable the relase of the compressed freon within the cooling cycle & to avoid a heavy
start of a loaded compressor
2-millis reset timer < 49 days (anything less than 1176 hours)in order to prevent millis
overflow function, which is important to ensure code stability in spite of accumulated operating
hours
3-defrost timer once every 24 hours to melt the ice
4-period of defrost, an average of 20 minutes per defrost cycle*/
/*also, a reset (every < 1176 hours) of unsigned long is installed to avoid
overflow of this function, otherwise the code will not perform well after 49 days*/ 
/*the delay functions in this code are intended to easily read the LCD display*/
/*you can edit the wokwi right-hand diagram by inserting text in diagram.json
within any location using the below code while changing "text3,4,5 etc." & "top" & "left"
values & new text name
      "type": "wokwi-text",
      "id": "text2",
      "top": -369.45,
      "left": 857.75,
      "attrs": { "text": "fridge" } */
/*while in run mode, you can click on any sensor & change the temperature
to monitor the real effect within the code instructions*/
/*you can copy the code sketch.ino & diagram.json & paste both in a blank
new sheet to test other changes while the original is saved*/ 
/*click on any component & you can rotate it by ctrl & r*/




#include <DallasTemperature.h> //library for DS18B20 sensors & it includes LCD

#include <LiquidCrystal_I2C.h> //library for LCD

//LiquidCrystal_I2C lcd(0x27, 16, 2);

OneWire oneWire1(26); //room temperature sensor

DallasTemperature sensors1(&oneWire1);

OneWire oneWire2(24); //fridge temperature sensor

DallasTemperature sensors2(&oneWire2);

OneWire oneWire3(22); //freezer temperature sensor

DallasTemperature sensors3(&oneWire3);

const int   compressorRelay        = 23;

const int  defrostRelay      = 40;  

unsigned long previousMillisStartdefrosting;

unsigned long previousMillisDefrosting;

unsigned long previousMilliscounter;

bool Startdefrosting = false;

bool Defrosting = false;

bool enablereading = false;

int counter =0; //one counter with two actions
float countertime=0;
float totaltime;

          //float totalcounter;

extern volatile unsigned long timer0_millis;


int totalColumns = 16;
int totalRows = 2;

LiquidCrystal_I2C lcd(0x27, totalColumns, totalRows);  

String scrollingMessage = ".......Three temperature sensors 10/10/2023;room, fridge, freezer & total operating time controller......";

void scrollMessage(int row, String message, int delayTime, int totalColumns) {
  for (int i=0; i < totalColumns; i++) {
    message = " " + message;  
  } 
  message = message + " "; 
  for (int position = 0; position < message.length(); position++) {
    lcd.setCursor(0, row);
    lcd.print(message.substring(position, position + totalColumns));
    delay(delayTime);
  }
}

void setup(void)

{


  digitalWrite( compressorRelay
, LOW);

  digitalWrite (defrostRelay, LOW);

delay(5000); // a delay to absorb any power fluctuations on startup

  Serial.begin(9600);
 
 lcd.init();

lcd.backlight();

lcd.setCursor(0, 0);
  lcd.print("SETUP CONTROLLER");
delay(1500);


lcd.setCursor(0, 1);
 
  lcd.print("......WAIT......");
delay(1500);


 Serial.println("Measuring 3 sensors' temperatures");

pinMode( compressorRelay, OUTPUT);    


pinMode( defrostRelay, OUTPUT);    


  sensors1.begin();

  sensors2.begin();

  sensors3.begin();

}

void loop(void)



{

  

//label:

unsigned long currentMillis = millis();

totaltime = (countertime * 300000) +millis(); 

//millis reset to avoid overflow (to be 20 days in milliseconds)

if(millis() >= 300000)

 {noInterrupts ();
 countertime ++;
  timer0_millis=0;

 previousMilliscounter=0;

 previousMillisDefrosting=0;

 previousMillisStartdefrosting=0;

 currentMillis=0;

 previousMillisDefrosting=0;

 interrupts();}

sensors1.requestTemperatures();

sensors2.requestTemperatures();

sensors3.requestTemperatures();

  float room = sensors1.getTempCByIndex(0);

  float fridge = sensors2.getTempCByIndex(0);

  float freezer= sensors3.getTempCByIndex(0);

//sensor reading display delay

 /* if((freezer>=0) && digitalRead(defrostRelay) == LOW)

    {digitalWrite( compressorRelay
  , HIGH);}

    if((freezer<-10 && freezer<0) && digitalRead(defrostRelay) == LOW )

    {digitalWrite( compressorRelay
  , HIGH);}

    if((freezer<-10 ))

    {digitalWrite( compressorRelay
  , LOW);} */

 if( currentMillis - previousMillisDefrosting >= 2000){

  enablereading = !enablereading;

  previousMillisDefrosting = currentMillis;

  }

  if(enablereading){

   Serial.print("room=");

   Serial.print(room);

   Serial.print(", ");

   Serial.print("fridge=");

   Serial.print(fridge);

   Serial.print(", ");

   Serial.print("freezer=");

   Serial.print(freezer);

   Serial.print(", ");

   Serial.print("m=");

   Serial.print(millis());

   Serial.print(", ");

   Serial.print("cm=");

   Serial.print(currentMillis);

   Serial.print(", ");

   Serial.print("pmsd=");

   Serial.print(previousMillisStartdefrosting);

   Serial.print(", ");

   Serial.print("pmd=");

   Serial.print(previousMillisDefrosting);

   Serial.print(", ");

   Serial.print("sd=");

   Serial.print(Startdefrosting);
    Serial.print(", ");
   
   Serial.print("total time=");

   Serial.print(totaltime/60000);
   Serial.print("min");
 
 
   Serial.println();

//digitalWrite(13,LOW);
lcd.clear();
 lcd.setCursor(0, 0);
  lcd.print("....GOOD DAY....");
delay(500);
lcd.clear();
delay(500);
lcd.print("....GOOD DAY....");
delay(500);
lcd.clear();
delay(500);
lcd.print("....GOOD DAY....");

 
delay(500);
lcd.clear();
delay(500);
lcd.print("....GOOD DAY....");
delay(500);
lcd.clear();
delay(500);
lcd.print("....GOOD DAY....");

 
delay(500);


 lcd.setCursor(0, 0);
  
  scrollMessage(1, scrollingMessage, 300, totalColumns); //scroll contents & speed

lcd.setCursor(0,0);
   lcd.print("Time in  minutes");



   lcd.setCursor(14,1);

   lcd.print((char)223);
   lcd.setCursor(0,1);
lcd.print("Temperature in C");
lcd.setCursor(14,1); //column,row
   lcd.print((char)223);
   delay(3000);


   lcd.setCursor(0,0);
   lcd.print("Room   =       C");
   lcd.setCursor(14,0); //column,row
   lcd.print((char)223);
   lcd.setCursor(8,0);
   lcd.print(room);

   lcd.setCursor(0,1);
   lcd.print("Fridge =       C");
   lcd.setCursor(14,1);
   lcd.print((char)223);
   lcd.setCursor(8,1);
   lcd.print(fridge);

delay(5000);

   lcd.setCursor(0,0);
   lcd.print("Fridge =       C");
   lcd.setCursor(14,0);
   lcd.print((char)223);
   lcd.setCursor(8,0);
   lcd.print(fridge);

   lcd.setCursor(0,1);
   lcd.print("Freezer=       C");
   lcd.setCursor(14,1);
   lcd.print((char)223);
   lcd.setCursor(8,1);
   lcd.print(freezer);

delay(5000);

lcd.setCursor(0,0);
   lcd.print("Freezer=       C");
   lcd.setCursor(14,0);
   lcd.print((char)223);
   lcd.setCursor(8,0);
   lcd.print(freezer);

 lcd.setCursor(0,1); //column/row

                  lcd.print("Time   =     min");
                 
                  lcd.setCursor(8,1); //column/row
                  
                  lcd.print(totaltime/60000);
                  delay(5000);


lcd.setCursor(0,0); //column/row

                  lcd.print("Time   =     min");
                 
                  lcd.setCursor(8,0); //column/row
                  
                 lcd.print(totaltime/60000);
                 // delay(5000);

lcd.setCursor(0,1);
   lcd.print("Room   =       C");
   lcd.setCursor(14,1); //column,row
   lcd.print((char)223);
   lcd.setCursor(8,1);
   lcd.print(room);

  delay(2000);
   }

  if(!enablereading)  {

   lcd.setCursor(0,0);

   lcd.print("Room   =       C");

   lcd.setCursor(14,0);
   lcd.print((char)223);
   lcd.setCursor(8,0);
   lcd.print(room);
    //delay(2000);
   lcd.setCursor(0,1);
   lcd.print("Fridge =       C");
   lcd.setCursor(14,1);
   lcd.print((char)223);
   lcd.setCursor(8,1);
   lcd.print(fridge);
 delay(2000);

    lcd.setCursor(0,0);
   lcd.print("Fridge =       C");
   lcd.setCursor(14,0);
   lcd.print((char)223);
   lcd.setCursor(8,0);
   lcd.print(fridge);

lcd.setCursor(0,1); //column/row

                  lcd.setCursor(0,1);
    lcd.print("Freezer=       C");
   lcd.setCursor(14,1);
   lcd.print((char)223);
   lcd.setCursor(8,1);
   lcd.print(freezer);
 delay(2000);


lcd.setCursor(0,0); //column/row

                  lcd.setCursor(0,0);
    lcd.print("Freezer=       C");
   lcd.setCursor(14,0);
   lcd.print((char)223);
   lcd.setCursor(8,0);
   lcd.print(freezer);
 //delay(2000);

lcd.setCursor(0,1); //column/row

                  lcd.print("Time   =     min");
                 
                  lcd.setCursor(8,1); //column/row
                  
                 lcd.print(totaltime/60000);

                 delay(3000);

lcd.setCursor(0,0); //column/row

                  lcd.print("Time   =     min");
                 
                  lcd.setCursor(8,0); //column/row
                  
                 lcd.print(totaltime/60000);



                 lcd.setCursor(0,1);
   lcd.print("Room   =       C");
   lcd.setCursor(14,1); //column,row
   lcd.print((char)223);
   lcd.setCursor(8,1);
   lcd.print(room);

   delay(3000);

   }

/*energize defrostRelay once every 24 hours each for ??? minutes
without affecting lcd display scrolling text or
 compressorRelay functionality
below line represents the 24 hour timer during which an action will start & stop once
& one counter to count two actions on/off*/

 if(currentMillis - previousMilliscounter >= 240000){
    counter = 2;
    previousMilliscounter= currentMillis;}

 // defrostRelay ON period

if ( currentMillis - previousMillisStartdefrosting >= 100 && (counter == 2 || counter == 1) )

   {

    counter --;
    digitalWrite( compressorRelay
  , LOW);
    previousMillisStartdefrosting = currentMillis;

    Startdefrosting = !Startdefrosting;      

   }

   if( !Startdefrosting)

    {

      digitalWrite( defrostRelay, LOW);    }
      
      if((freezer>=0)) 

    {
      lcd.clear();
    lcd.setCursor(0,0); //column/row

                  


                  lcd.print("..COOLING DOWN..");
                  delay(300);
                  lcd.clear();
delay(300);
                  lcd.print("..COOLING DOWN..");
                  delay(300);
                  lcd.clear();
delay(300);
                  lcd.print("..COOLING DOWN..");
                  delay(300);
                  lcd.clear();
delay(300);
                  lcd.print("..COOLING DOWN..");
                  delay(300);
                  lcd.clear();
delay(300);
                  lcd.print("..COOLING DOWN..");
                  delay(300);
                  lcd.clear();
                  delay(300);

                   lcd.print("..COOLING DOWN..");
                  delay(300);
                  lcd.clear();
delay(300);

 lcd.print("..COOLING DOWN..");
                  delay(300);
                  lcd.clear();
delay(300);

 lcd.print("..COOLING DOWN..");
                  delay(300);
                  lcd.clear();
delay(300);

 lcd.print("..COOLING DOWN..");
                  delay(300);
                  lcd.clear();
delay(300);

 lcd.print("..COOLING DOWN..");
                  delay(300);
                  lcd.clear();
delay(300);
                  lcd.print("..COOLING DOWN..");

      digitalWrite(defrostRelay,LOW);
      digitalWrite( compressorRelay
    , HIGH);
      }

    if((freezer<-10 && freezer<0) && digitalRead(defrostRelay) == LOW )

    {digitalWrite( compressorRelay
  , HIGH);}

    if((freezer<-10 ))

    {digitalWrite( compressorRelay
  , LOW);}

    

    if( Startdefrosting)                    

  {
   digitalWrite( compressorRelay
  ,LOW);
    digitalWrite( defrostRelay,HIGH);  
   lcd.clear();
    lcd.setCursor(0,0); //column/row

                  lcd.print("...DEFROSTING...");
                  delay(300);
                  lcd.clear();
                  delay(300);
                  lcd.print("...DEFROSTING...");
                  delay(300);
                  lcd.clear();
                  delay(300);
                  lcd.print("...DEFROSTING...");
                  delay(300);
                  lcd.clear();
                  delay(300);
                  lcd.print("...DEFROSTING...");
                  delay(300);
                  lcd.clear();
                  delay(300);
                  lcd.print("...DEFROSTING...");
                  delay(300);
                  lcd.clear();
                  delay(300);
                  lcd.print("...DEFROSTING...");

 
  }
//goto label;

}
NOCOMNCVCCGNDINLED1PWRRelay Module
freezer
fridge
room
cooling
defrosting
pull-down
NOCOMNCVCCGNDINLED1PWRRelay Module