Stromausfall Detektor Arduino ESP8266

Der Jockel

Ensign
Registriert
Nov. 2016
Beiträge
150
Ich Bastel gerade an einem ESP8266 Board mit der Arduino IDE herum und habe auch schon einiges zum laufen gebracht doch an meinem jetzigen Projekt scheitere ich und finde den Fehler im Code einfach nicht. Am Board sind ein 47uF Kondensator über einen 1kOhm Widerstand mit dem Analogpin A0 verbunden (und Ground). Die interne Led D0 ist normal an (also bei HIGH aus). Hier ist mein Code beim ausführen ist die LED immer an anstatt langsam zu blinken :confused_alt:. wenn die Spannung sinkt sollte sie dann schnell Blinken:
C++:
int ledPin = D0;
boolean ledState = 1;
unsigned long currentMillis = 0;
unsigned long last_PLD = 0;
unsigned long lastBlink = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);
    
}

void loop() {
  currentMillis = millis();
  if (currentMillis >= lastBlink+100) {
    ledState = !ledState;
    digitalWrite(ledPin, ledState);
    
  }

  if (currentMillis >= last_PLD+10) {
    powerLoss_detector();
  }

}

void powerLoss_detector() {
  //float charge up to 90% .9*1023=920 in 10ms steps
  if (analogRead(A0) < 920) {
    pinMode(A0, OUTPUT);
    digitalWrite(A0, HIGH);
    return;
  }
  //read cap
  pinMode(A0, INPUT);

  if (analogRead(A0) > 1000) {
    for (int i=0; 20; i++) {
      fastBlink();
    }
  }
}

void fastBlink() {
  digitalWrite(ledPin, LOW);
  delay(2);
  digitalWrite(ledPin, HIGH);
  delay(2);
}
Ergänzung ()

Sorry wegen dem vorschnellen Post habe meinen Fehler selbst entdeckt
Ergänzung ()

es fehlte noch das der letzte wert durch den aktuellen "geupdated" wird hier mein finaler code
C++:
int ledPin = D0;
boolean ledState = 1;
unsigned long currentMillis = 0;
unsigned long last_PLD = 0;
unsigned long lastBlink = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);
    
}

void loop() {
  currentMillis = millis();
  if (currentMillis >= lastBlink+1000) {
    ledState = !ledState;
    digitalWrite(ledPin, ledState);
    lastBlink = currentMillis;
  }

  if (currentMillis >= last_PLD+10) {
    powerLoss_detector();
    last_PLD = currentMillis;
  }

}

void powerLoss_detector() {
  //float charge up to 90% .9*1023=920 in 10ms steps
  if (analogRead(A0) < 920) {
    pinMode(A0, OUTPUT);
    digitalWrite(A0, HIGH);
    return;
  }
  //read cap
  pinMode(A0, INPUT);

  if (analogRead(A0) > 1000) {
    for (int i=0; 20; i++) {
      fastBlink();
    }
  }
}

void fastBlink() {
  digitalWrite(ledPin, LOW);
  delay(20);
  digitalWrite(ledPin, HIGH);
  delay(20);
}
Ergänzung ()

das Blinken geht nun jedoch scheint sich der Kondensator nicht aufzuladen :(
 
Zuletzt bearbeitet:
Danke für den Tip war auch eher eine machbarkeitsstudie :D hatte es kurz am laufen hab nun aber was am Code geändert und es geht nun nichtmehr
Für alle interessierten. Es empfiehlt sich auch ein Kondensator über die Versorgungsspannung zu legen um noch genügend Strom für die letzte Aktion zu haben.
C++:
int chargePin = D1;
int ledPin = D0;
unsigned long currentMillis = 0;
unsigned long last_PLD = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(A0, INPUT);
  digitalWrite(ledPin, HIGH);
   
}

void loop() {
  currentMillis = millis();
  if (currentMillis >= last_PLD+10) {
    powerLoss_detector();
    last_PLD = currentMillis;
  }

}

void powerLoss_detector() {

  //float charge up to 90% .9*1023=920 in 10ms steps
  pinMode(chargePin, INPUT);
  int voltage = analogRead(A0);

  if (voltage < 920) {
    pinMode(chargePin, OUTPUT);
    digitalWrite(chargePin, HIGH);
    return;
  }

if (voltage > 1000) {
  digitalWrite(ledPin, LOW);
    }
}
 
Zurück
Oben