ESP8266 WeMos D1 с глубоким сном разряжает батарею - PullRequest
0 голосов
/ 20 марта 2020

Я разработал датчик отпечатков пальцев с использованием NodeMCU D1 mini, работающего от батареи емкостью 1000 мАч.

Кажется, все работает правильно, за исключением потребления энергии аккумулятора. Я прочитал несколько топи c, где пользователь говорит, что использование функции глубокого сна на батарее NodeMCU 1000 мАч должно длиться более 3 месяцев, но мой не достигает 2 дней.

Это моя схема c

Я также сообщаю, что мой фрагмент кода используется в настоящее время. При нажатии кнопки схема должна выйти из спящего режима и начать считывание датчика отпечатка пальца. Если он обнаруживает действительный отпечаток пальца, сообщение отправляется брокеру MQTT.

#include <Adafruit_Fingerprint.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>


const char* _ssid = "ZZZXXXYYY";
const char* _password = "pass";
const char* mqttServer = "IPADDRESS";
const int mqttPort = 1883;
const char* mqttUser = "USER";
const char* mqttPassword = "PASS";
long initialMillis = 0;
unsigned int raw=0;

// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
//#define mySerial Serial

// 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)
// comment these two lines if using hardware serial
SoftwareSerial mySerial(4, 5);

WiFiClient espClient;
PubSubClient client(espClient);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup()  
{
  Serial.begin(9600);
  pinMode(A0, INPUT);
  // Connect to Fingerprint. Set the data rate for the sensor serial port
  finger.begin(57600);
  delay(5);
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    ESP.deepSleep(10 * 1000000);
  }

  finger.getTemplateCount();

  // Connect to WIFI
  WiFi.mode(WIFI_STA);
  WiFi.begin(_ssid, _password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Connect to MQTT
  client.setServer(mqttServer, mqttPort); 
  while (!client.connected()) {
    Serial.println("Connecting to MQTT...");

    if (client.connect("ESPFingerprint", mqttUser, mqttPassword )) { 
      Serial.println("Connected to MQTT server");   
    } else { 
      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000); 
    }
  }

  // Calculate battery percentage
  raw = analogRead(A0);
  String bLevel = "{\"Battery\":" + String(raw) + "}";
  Serial.print("Battery: ");
  Serial.print(raw);
  Serial.print(" -> ");
  Serial.println(bLevel);

  initialMillis = millis();
  client.publish("tele/fingerprint/LWT", "Online");
  client.publish("tele/fingerprint/STATE", (char*)bLevel.c_str(), true);

  Serial.print("MQTT subscribed: ");
  Serial.println(WiFi.localIP());
}

void loop()
{
  unsigned long currentMillis = millis();
  int fid = getFingerprintIDez();
  if(fid != -1) {
    String fpIdstr = String(fid);
    client.publish("cmnd/fingerprint/RESULT", (char*)fpIdstr.c_str());
    Serial.println("Fingerprint correct. Going to sleep.");
    client.publish("tele/fingerprint/LWT", "Offline");
    // trigger disconnection from MQTT broker to correctly send the message before going to sleep
    client.disconnect(); 
    espClient.flush();
    // wait until connection is closed completely
    while(client.state() != -1){  
      delay(10);
    }
    ESP.deepSleep(0);
  }
  else if(currentMillis - initialMillis >= 15000){
    Serial.println("Timeout expired. Going to sleep.");
    client.publish("tele/fingerprint/LWT", "Offline");
    ESP.deepSleep(0);
  }
  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.fingerFastSearch();
  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); 

  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!
  Serial.print("Found ID #"); Serial.print(finger.fingerID); 
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  return finger.fingerID; 
}

Может кто-нибудь сообщить мне, если что-то не так в моем коде или схеме?

...