Как снизить энергопотребление ARDUINO и RFID mfrc522 - PullRequest
2 голосов
/ 06 июля 2019

Я делаю проект, который я сканирую RFID-карты, чтобы получить доступ к двери.Я сделал код так, как я хочу, чтобы он функционировал, но в настоящее время он рисует 22 мА.Я хочу, чтобы этот проект питался от свинцово-кислотного аккумулятора 4 Ач.

Я убрал светодиоды из считывателя и из Arduino, чтобы снизить потребление энергии.Кроме того, я запускаю Arduino на 1 МГц, и это выглядит, что значительно снизило потребление.Также я отключил Аналоговый преобразователь arduino.

IM, используя arduino nano и считыватель RFID-RC522, на выходе 5-вольтовое реле.

Вот код:

#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h>

#define SS_PIN 10
#define RST_PIN 9

MFRC522 mfrc522(SS_PIN, RST_PIN);

#define relay 4
#define led 2
#define button 5


byte readCard[4];
byte storeCard[4];
byte lastCard[4] = {1,2,3,4};
uint8_t successread = 0;
int flag=0;

void setup() {

CLKPR = 0x80;
CLKPR = 0x04;
ADCSRA = 0;
pinMode(relay, OUTPUT);
pinMode(button, INPUT_PULLUP);
pinMode(led, OUTPUT);
digitalWrite(relay, LOW);
digitalWrite(led, LOW);
SPI.begin();
mfrc522.PCD_Init();
}

void loop() {
  do {
    successread = getID();
  }
  while(!successread);
  digitalWrite(led, HIGH);
  delayMicroseconds(100);
  digitalWrite(led, LOW);
  lastcard();
  if(digitalRead(button)==LOW){
     save_delCard();
  }

  if(checkID(readCard) && !(digitalRead(button)==LOW)){
    if(flag==0){
       digitalWrite(relay, HIGH);
       flag = !flag;
    }
  else{
    digitalWrite(relay, LOW);
    flag = !flag;
  }
 }
}
/////////READ CARD FROM READER/////////////////
uint8_t getID(){
 if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID 
    reader continue
    return 0;
 }
 if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get 
   Serial and continue
   return 0;
 }
  for (uint8_t i=0; i<4; i++){
    readCard[i] = mfrc522.uid.uidByte[i];
 }
 mfrc522.PICC_HaltA(); // stop reading
 return 1;
}
///////////////////SAVE OR DELETE CARD/////////////////////////
uint8_t save_delCard(){
  uint8_t count = EEPROM.read(0);
  int start = (count*4) + 1;
  int num = count*4 +1;
  if(checkID(readCard)){

     uint8_t slot = slotcheck(readCard);
     for(uint8_t m=0;m<4;m++){
         EEPROM.write((num-m-1),0); 
     }
     for(uint8_t k=0;k<4;k++){
         EEPROM.write((((slot-1)*4)+1+k),lastCard[k]);
     }

       count--;
     }
     else{
     count++;
   }


  for(uint8_t j=0; j<4;j++){
    EEPROM.write(j + start, readCard[j]);
  }

  EEPROM.write(0,count);
  return 0;
  }
////////////////////READ FROM MEMORY//////////////////////////////////
uint8_t readID(uint8_t number){
  uint8_t start = (number*4) + 1;
  for(uint8_t j=0;j<4;j++){
    storeCard[j] = EEPROM.read(start + j);
  }
}
///////////////////COMPARE IDS///////////////////////////////
bool compare(byte arraya[],byte arrayb[]){
  for(uint8_t i=0;i<4;i++){
    if(arraya[i]!=arrayb[i]){
      return false;
    }
    else{
      return true;
    }
  }
}
/////////CHECK IF CARD IS IN MEMORY/////////////////////////////////////
bool checkID(byte arraya[]){
  uint8_t count = EEPROM.read(0);
  for(int i=0;i<count;i++){
    readID(i);
    if(compare(arraya, storeCard)){
      return true;
    }
    else {

    }
  }
  return false;
}
////////////////FINDS WHERE CARD IS IN MEMORY//////////////////
uint8_t slotcheck(byte arraya[]){
  uint8_t count = EEPROM.read(0);
  uint8_t slot=0;
  for(int i=0;i<count;i++){
    readID(i);
    slot = i+1;
    if(compare(arraya, storeCard)){
      return slot;
    }
    else {

    }
  }
  return NULL;
}
///////////////SAVES LAST CARD/////////////////////

void lastcard(){
  uint8_t count = EEPROM.read(0);
  for(uint8_t p=0;p<4;p++){

    lastCard[p] = EEPROM.read((count*4)-3+p);
  }
}
//////////////////////////////////////////////////////////////////
...