/*testing one sensor, freezer*/


int backLight = 13;



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

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



          #include <LiquidCrystal.h>

          LiquidCrystal lcd(12, 11, 10, 9, 8, 7);



OneWire oneWire3(22);

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)

{

  pinMode(backLight, HIGH);

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

//lcd.backlight();

lcd.begin(16, 2);

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

pinMode( compressorRelay, OUTPUT);    

  //sensors1.begin();

  //sensors2.begin();

  sensors3.begin();

}

void loop(void)



{
//digitalWrite(13,High);

digitalWrite(13, HIGH);
  digitalWrite( compressorRelay
, LOW);

  digitalWrite (defrostRelay, LOW);

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

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<-26 && freezer<0) && digitalRead(defrostRelay) == LOW )

    {digitalWrite( compressorRelay
  , HIGH);}

    if((freezer<-26 ))

    {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();


        





 lcd.setCursor(0, 0);
  
  scrollMessage(1, scrollingMessage, 250, totalColumns);
 //delay(3000);




lcd.setCursor(0,0); //column,raw
   lcd.print("Time=    minutes");
   
   
   lcd.setCursor(14,1);
   lcd.print((char)223);
   lcd.setCursor(0,1);
lcd.print("Temperature=   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 led once every 24 hours each for ??? minutes
without affecting lcd display scrolling text or
 compressorRelay
 led 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 >= 26000){
    counter = 2;
    previousMilliscounter= currentMillis;}

 // defrostRelay led ON period

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

   {

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

    Startdefrosting = !Startdefrosting;      

   }

   if( !Startdefrosting)

    {

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

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

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

    {digitalWrite( compressorRelay
  , HIGH);}

    if((freezer<-26 ))

    {digitalWrite( compressorRelay
  , LOW);}

    

    if( Startdefrosting)                    

  {
   digitalWrite( compressorRelay
  ,LOW);
    digitalWrite( defrostRelay,HIGH);  
 
  }
goto label;

}
NOCOMNCVCCGNDINLED1PWRRelay Module
freezer
fridge
room
cooling
defrosting
NOCOMNCVCCGNDINLED1PWRRelay Module