Problem using sleep mode

Trying to use sleep mode for a simple led for night medical need. Push button, led lights bright for 30 seconds, then ramps down to zero over span of 5 seconds. Have read example on github - section of it in 2nd attachment.
My code is in first attachment. At this point I'm getting " 'enterSleep' was not declared in this scope". Can't get beyond this and am not sure I have the command sequence right.

#include "Timer.h" 
#include <avr/sleep.h>

Timer t1;

int sw=0,delta=255, stopid;

void setup(){	
	pinMode(8,OUTPUT);
	attachInterrupt(digitalPinToInterrupt(2), butint, RISING);
	set_sleep_mode(SLEEP_MODE_PWR_DOWN);
	sleep_enable();
	sleep_mode();
}

void loop(){
	t1.update();		
}

void butint(){
	sleep_disable();
	// Re-enable the peripherals.
	// power_all_enable();
	digitalWrite(8,HIGH);
	t1.after(30000, start);	
}

void start(){
	t1.every(200, slope);
}

void slope(){
	delta -= 10;
	analogWrite(8,delta);
	if(delta == 0){
		t1.stop(stopid);
		delta = 255;		
		// Re-enter sleep mode.
		enterSleep();
	}
}
// Enters the arduino into sleep mode.void enterSleep(void){	// There are five different sleep modes in order of power saving:	// SLEEP_MODE_IDLE - the lowest power saving mode	// SLEEP_MODE_ADC	// SLEEP_MODE_PWR_SAVE	// SLEEP_MODE_STANDBY	// SLEEP_MODE_PWR_DOWN - the highest power saving mode	set_sleep_mode(SLEEP_MODE_PWR_DOWN);	sleep_enable();
	// Now enter sleep mode.	sleep_mode();
	// The program will continue from here after the WDT timeout
	// First thing to do is disable sleep.	sleep_disable();
	// Re-enable the peripherals.	power_all_enable();}
1 Like

In the bottom code the code statements are buried in comments. The bottom code needs to be inserted into the top code.

Maybe it should be like this:

// Enters the arduino into sleep mode.
void enterSleep(void)
{	
   // There are five different sleep modes in order of power saving:
      // SLEEP_MODE_IDLE - the lowest power saving mode	
      // SLEEP_MODE_ADC	
      // SLEEP_MODE_PWR_SAVE	
      // SLEEP_MODE_STANDBY	
      // SLEEP_MODE_PWR_DOWN - the highest power saving mode	

set_sleep_mode(SLEEP_MODE_PWR_DOWN);	

sleep_enable();

sleep_mode();            // Now enter sleep mode.	
	
sleep_disable();          // The program will continue from here after the WDT timeout
	                         // First thing to do is disable sleep.	
	 	
power_all_enable();     // Re-enable the peripherals.
}

The power_all_enable() function is in the <avr/power.h>: Power Reduction Management library.

1 Like

Thanks for replying but I don't see how your response is supposed to help me.

Create void enterSleep() and add the sleep code from setup().

Danois90 - thanks, your help fixed the problem I had. Unfortunately another problem arose. After pushing the button and going through a light cycle and then to sleep, pushing the button again starts the light cycle for about 4 seconds and then does a reset, subsequent attempts give same 4 second result. I suspect I'm not resetting something when it comes out of sleep but I don't know what it is. I pushed the Arduino reset button and it then works just like it should, and then subsequent attempts give same 4 second result. Posting here a current copy of the code with your suggestion in it.

#include "Timer.h" 
#include <avr/sleep.h>

Timer t1;

int sw=0,delta=255, stopid;

void setup(){	
	pinMode(8,OUTPUT);
	attachInterrupt(digitalPinToInterrupt(2), butint, RISING);	
}

void loop(){
	t1.update();		
}

void butint(){
	sleep_disable();		
	digitalWrite(8,HIGH);
	t1.update();
	// t1.after(30000, start);
	t1.after(7000, start);	
}

void start(){
	t1.every(200, slope);
}
void enterSleep(){
	set_sleep_mode(SLEEP_MODE_PWR_DOWN);
	sleep_enable();
	interrupts();
	sleep_mode();
}
void slope(){
	delta -= 10;
	analogWrite(8,delta);
	if(delta <= 10){
		t1.stop(stopid);
		delta = 255;		
		//Re-enter sleep mode.
		enterSleep();
	}
}

You must call enterSleep() as the last thing in setup() to restore the functionality you've moved.

1 Like

Working great. Thanks a lot for your help, much appreciated.

1 Like

Hey everyone I am very new to Arduino and programming all together. I've only been working at this for about 2 weeks and trying to use forums, YouTube, and google when possible, but this one I just can't figure out this part on my own.

I am trying to make a biometric fingerprint lock for an in wall safe. I have been able to get most of my code working, recognizing my print and activating the lock. Since I plan on running this project on batteries I would like to be able to put the Arduino to sleep until I place my finger on the fingerprint reader. Once the lock has been unlocked I would like it to go back into a sleep mode after like 30 secs. I have tried using some example codes that I have seen online, but I can't figure out how to get them to work with my Sketch.

I am using an Arduino Uno Rev3, a 4 relay shield, R503 fingerprint reader, and a 12v solenoid lock. I included 2 pictures of what my setup looks like, and I will include the code that I am currently working with. I was wondering if anyone would be able to help me. Any help with this would be appreciated. Thank you.

#include <Adafruit_Fingerprint.h>
#define relay1  4
#define relay2  7
#define relay3  8
#define relay4  12




#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
// Set up the serial port to use softwareserial..
SoftwareSerial mySerial(2, 3);


#else


#define mySerial Serial1


#endif


Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);




void setup()
{
  pinMode(relay1, OUTPUT);// connected to Relay 1
    digitalWrite(relay1, LOW);
  pinMode(relay2, OUTPUT);// connected to Relay 2
    digitalWrite(relay2, LOW);
  pinMode(relay3, OUTPUT);// connected to Relay 3
    digitalWrite(relay3, LOW);
  pinMode(relay4, OUTPUT);// connected to Relay 4
    digitalWrite(relay4, LOW);
  
   Serial.begin(9600);


// set the data rate for the sensor serial port
  finger.begin(57600);
 
 


  Serial.println("\n\nAdafruit finger detect test");
  
  delay(5);
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
  }


  Serial.println(F("Reading sensor parameters"));
  finger.getParameters();
  Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);
  Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);
  Serial.print(F("Capacity: ")); Serial.println(finger.capacity);
  Serial.print(F("Security level: ")); Serial.println(finger.security_level);
  Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);
  Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);
  Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);


  finger.getTemplateCount();


  if (finger.templateCount == 0) {
    Serial.print("Sensor doesn't contain any fingerprint data. Please run the 'enroll' example.");
  }
  else {
    Serial.println("Waiting for valid finger...");
      Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
  }
}


void loop()                     // run over and over again
{
  getFingerprintID();
  delay(50);            //don't ned to run this at full speed.
}


uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }


  // OK success!


  p = finger.image2Tz();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }


  // OK converted!
  p = finger.fingerSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Found a print match!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Did not find a match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }


  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  digitalWrite(relay1, HIGH);// "unlocks" relay 1
    Serial.println("relay 1 unlocked");
    delay(5000); //keeps relay "unlocked for 5 seconds"
  digitalWrite(relay1, LOW);// "locks relay 1
    Serial.println("relay1 locked");
   
  return finger.fingerID;
}


// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK)  return -1;


  p = finger.image2Tz();
  if (p != FINGERPRINT_OK)  return -1;


  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK)  return -1;


  // found a match!


  return finger.fingerID;


}

148404677_166065861764305_279437842180206746_n.jpg

148404677_166065861764305_279437842180206746_n.jpg

fingerprint_final_working.ino (5.29 KB)

1 Like

Hi everyone.

I have an fingerprint sensor FPC1020; I was testing it but it broke down it.

Now I can programming it with ESP32 but it doesnt work very well; I send data frame but I don´t know hat is wrong.

I watched the library of Arduino and I tested it with this, I was able to record fingerprints ans erase them but later it didn´twork anymore.

According to the Arduino library the frame is sent as follows:

according to the arduino library the frame is sent as follows:

start frame, command, data, data, data, data, checksum, end frame
I don´t know what is the data to complete because in the library of Arduino the ID for new usser is necesary but the ID it never is read; I sent some commands but the sensor is not working.

I show one of frame to add new user.

0XF5, 0X01, OXFF, 0X01, 0X00, 0X00, 0XDB, 0XF5

I sent some commnads to find fingerprint but it doesn´t respond to request.

Some one can I help me?

Thanks a lot

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.