using a photo cell

i’m usine a photo cell to turn a relay on for 1 second the value i’m using is 100 so when the value gets to 100 the relay turns on for a second. The problem is that it fluctuates around 100 for a couple minutes so that relay goes on and off how do i prevent that in that sketch

turn it on when it get to 100

turn it off when it drops to a number well below 100, like 90

creating a 'dead band'

The problem is that it fluctuates

It? What is it?

how do i prevent that in that sketch

Add a servo with a big hammer attached. Position the servo so that the hammer whacks the photo cell. Stop any nonsense it's putting out permanently.

Or post your code, damn it.

OK then I like the hammer idea
Im using the relay to control the dead bolt in my front door to lock it at dusk. Using serial monitor I chose the value of 100. When I ran my sketch I could hear my dead bolt trying to lock every few seconds for a few min. The photo cells value goes up and down for a few min like 100 then 99 then 101 then 100 then 98. So every time it gets to 100 the relay #2 operates
There are other things in my code but Im only having trouble with the photocell

//  Push Buttons for Relay Number 1 -----> Pin 10
//  Push Buttons for Relay Number 3 -----> Pin 11
//  Push Buttons for Relay Number 4 -----> Pin 12

//  Photo Cell ----> Pin A0

//Relay Number 1 -----> Pin 6
//Relay Number 2 -----> Pin 7
//Relay Number 3 -----> Pin 8
//Relay Number 4 -----> Pin 9

//RFID Connection:
//ENABLE -----> Pin 2
//RFID TX ---- Pin RX
//VCC ----> 5v
//GND -----> Arduino GND



//Constants
#define NumberOfIDs  20  //This defines the amount of IDs in the access list
#define ON_TIME 1000         //time in milliseconds the relay #1 stays energized
#define ON_TIME_2 1000         //time in milliseconds the relay #2 stays energized
#define ON_TIME_3 1000         //time in milliseconds the relay #3 stays energized
#define ON_TIME_4 1000         //time in milliseconds the relay #4 stays energized
#define Relay2_operateValue 100

//External Equipment
#define ENABLE 2               //Pin connected to the Enable pin of RFID
#define RELAY1 6                  //Pin that is connected to the relay #1
#define RELAY2 7                 //Pin that is connected to the relay #2
#define RELAY3 8                 //Pin that is connected to the relay #3
#define RELAY4 9                  //Pin that is connected to the relay #4
#define RELAY1_PUSH_BUTTON 10
#define RELAY3_PUSH_BUTTON 11
#define RELAY4_PUSH_BUTTON 12

//Analog Input
#define PHOTO_CELL A0


int     val = 0; 
int     bytesread = 0;
String  IDCode;
String  accessList[NumberOfIDs]={"120075A418","12007389DA","690008BB23","6900076031","11003163FE","430051E429","0F032BBBD8","0F032BBA53"};  // !!!!  HERE YOU WILL ADD THE IDs !!!!! 
char    code[10];
boolean IDFound,photoCellstate= false;
int button1State,button3State,button4State =0;         // variable for reading the pushbutton status
int photoCellValue=1023;

void setup() {
  
pinMode(ENABLE,OUTPUT);
pinMode(RELAY1,OUTPUT);
pinMode(RELAY2,OUTPUT);
pinMode(RELAY3,OUTPUT);
pinMode(RELAY4,OUTPUT);
pinMode(RELAY1_PUSH_BUTTON, INPUT);
pinMode(RELAY3_PUSH_BUTTON, INPUT);
pinMode(RELAY4_PUSH_BUTTON, INPUT);

Serial.begin(2400); // RFID reader SOUT pin connected to Serial RX pin at 2400bps 

digitalWrite(ENABLE, LOW);                  // LOW Activates the RFID reader, HIGH deactivates it
digitalWrite(RELAY1,LOW);
digitalWrite(RELAY2,LOW);
digitalWrite(RELAY3,LOW);
digitalWrite(RELAY4,LOW);

}  


 void loop() { 
  digitalWrite(ENABLE, LOW);                  // LOW Activates the RFID reader, HIGH deactivates it

   // read the state of the pushbutton value:
  button1State = digitalRead(RELAY1_PUSH_BUTTON);
  button3State = digitalRead(RELAY3_PUSH_BUTTON);
  button4State = digitalRead(RELAY4_PUSH_BUTTON);
  photoCellValue = analogRead(PHOTO_CELL);
  
   /**** EXTRACTION OF DATA FROM CARD ****/
  if(Serial.available() > 0) {            // if data available from reader 
    if((val = Serial.read()) == 10) {   // check for header [Header of data = 10]
      bytesread = 0; 
      
      while(bytesread<10) {              // read 10 digit code 
        if( Serial.available() > 0) { 
          val = Serial.read(); 
          if((val == 10)||(val == 13)) { // if header or stop bytes before the 10 digit reading 
            break;                             // stop reading 
          } 
          code[bytesread] = val;      // add the digit
          bytesread++;                   // ready to read next digit
        } 
      } 
      if(bytesread == 10) {                  // if 10 digit read is complete
       IDCode = code;
       IDCode = IDCode.substring(0,10);
      }
      
      bytesread = 0; 
      digitalWrite(ENABLE, HIGH);                  // deactivate the RFID reader for a moment so it will not flood

             
       /*** INTERPRETATION OF DATA ***/
       //At this point, data was read, and there is a IDcode in the IDCode variable     
       
          for(int i = 0;i<NumberOfIDs;i++)  //check entered ID against saved IDs
          {
             if(IDCode.equals(accessList[i])){
                IDFound = true;}                  //if the ID is in the access list, IDFound = true;
          }
          if(IDFound)
          {
          // energize Relay 1:    
              digitalWrite(RELAY1,HIGH);    //energize the relay 1
              delay(ON_TIME);            //Relay stays energized for ON_TIME milliseconds
              digitalWrite(RELAY1,LOW); //Immediately after delay, de-energize relay.
              IDFound = false;
              
          }
          else{
            digitalWrite(RELAY1,LOW);
          }
 
    }    //end of data reading
    
      delay(4000);                                 // wait for a bit 

  }


 
   // check if the push buttons are pressed.
  // if it is, the button State is HIGH:
  
   /***Relay Number 1 control ***/
  if (button1State == HIGH) {     
    // energize Relay 1:    
      digitalWrite(RELAY1,HIGH);//energize the relay 1
  delay(ON_TIME);            //Relay stays energized for ON_TIME milliseconds
  digitalWrite(RELAY1,LOW); //Immediately after delay, de-energize relay.
  } 
  else {
    // de-energize Relay 1:
    digitalWrite(RELAY1, LOW); 
  }

   /***Relay Number 2 control ***/
  if ((photoCellValue < Relay2_operateValue) && (photoCellstate==false)) {     
    // energize Relay 2:    
  digitalWrite(RELAY2,HIGH);//energize the relay 2
  delay(ON_TIME_2);            //Relay 2 stays energized for ON_TIME_2 milliseconds
  digitalWrite(RELAY2,LOW); //Immediately after delay, de-energize relay. 
  photoCellstate=true; 
  } 
    if (photoCellValue > 400) {     
    // de-energize Relay 2:    
  digitalWrite(RELAY2,LOW); //Immediately after delay, de-energize relay. 
  photoCellstate=false; 
  } 

  
   /***Relay Number 3 control ***/
  if (button3State == HIGH) {     
    // energize Relay 3:    
  digitalWrite(RELAY3,HIGH);//energize the relay 3
  delay(ON_TIME_3);            //Relay 3 stays energized for ON_TIME_3 milliseconds
  digitalWrite(RELAY3,LOW); //Immediately after delay, de-energize relay.  
  } 
  else {
    // de-energize Relay 3:
    digitalWrite(RELAY3, LOW); 
  }
  
  /***Relay Number 4 control ***/
  if (button4State == HIGH) {     
    // energize Relay 4:    
  digitalWrite(RELAY4,HIGH);//energize the relay 4
  delay(ON_TIME_4);            //Relay 4 stays energized for ON_TIME_4 milliseconds
  digitalWrite(RELAY4,LOW); //Immediately after delay, de-energize relay. 
  } 
  else {
    // de-energize Relay 4:
    digitalWrite(RELAY4, LOW); 
  }
 
}

Google "hysteresis"

As well as code to turn the relay on for just 1 second you need code that doesn't read the photocell again for a suitable time - perhaps 30 minutes.

...R

I have a delay at the end of the read should I increase that for 30 min

Trickyrick:
I have a delay at the end of the read should I increase that for 30 min

It's hard to follow your code. I don't see where the photocell is read. (A function called readPhotocell() would be nice and obvious).

I just meant there is no point reading the photocell if the lock is shut and you don't want to open it again immediately. You will have to figure out a suitable time interval yourself.

...R