Smart-UPS-Konstruktion mit ESP8266 und PCF8591

Ich habe eine gut funktionierende USV mit einer fehlerhaften Netzwerkschnittstelle, die ich für den iobroker-Server verwende. Das Problem war, dass der PC bei einem längeren Stromausfall nicht heruntergefahren wurde.

werbung – amazon.de

Für die USV schlauer machen habe ich die folgende Schaltung mit ESP8266 und PCF8591 erstellt und in die USV eingebaut.

USV schlauer machen mit ESP8266 und PCF8591
USV schlauer machen mit ESP8266 und PCF8591

Beachtung!

NETZSPANNUNG IST KEIN SPIELZEUG, SIE KANN EINEN TÖDLICHEN STROMSCHLAG ODER EINEN BRAND VERURSACHEN! NUR AUF EIGENES RISIKO UND NUR WENN SIE WISSEN, WAS SIE TUN !

Schalten Sie die USV vor dem Zerlegen aus und ziehen Sie den Netzstecker . Nach dem Entfernen der Abdeckung sofort die Batterie abklemmen


Diese erforderlich sein:

ESP8266 ESP-01S WLAN Modul(amazon.de)

ESP-01 Breadboard Adapter für ESP8266 (amazon.de)

USB Programmieradapter für ESP8266-01(amazon.de)

PCF8591P DIP-16(amazon.de)

FT232RL USB zu TTL Serial Adapter für 3,3V und 5V(amazon.de)

Widerstände Resistor Kit 525 Stück, 0 Ohm -1M Ohm(amazon.de)

LM2596S DC-DC Netzteil Adapter Step down Modul(amazon.de)

AC DC 220V bis 5V Stromversorgungsmodul(amazon.de)


Die Stromversorgung erfolgt über die interne Batterie, sodass diese auch bei einem Stromausfall funktionsfähig bleibt.

Mit Hilfe des A / D-Wandlers PCF8591 können wir die Batteriespannung über einen Spannungsteiler aus 2 Widerständen messen. PCF8591 ist wie oben gezeigt mit ESP8266-01 am I2C-Bus verbunden (grünes Kabel SDA ist auf GPIO0 und gelbes Kabel SCL ist auf GPIO2). Vergessen Sie nicht die 4,7K-Pullup-Widerstände. Erste Teil der Schaltung ist erledigt

Im nächsten Schritt wird das Vorhandensein einer Netzspannung untersucht. Schließen Sie ein 230V-5V StepDown-Netzteilmodul (z. B. HI-Link HLK-PM01) an das USV-Eingangskabel an. Der Ausgang ist über einen Optokoppler mit dem ESP8266 verbunden, sodass dieser Teil galvanisch getrennt ist. Der Optokoppler kann beispielsweise PC817, TPL621 usw. sein. Mit 470 Ohm Vorwiderstand am Eingang. Verbinden Sie den Ausgang mit dem RX-Pin ESP8266-01. Dieser wird nun als Eingang verwendet. Dieser Eingang ist mit einem 1K-Widerstand an die 3,3V-Versorgungsspannung angeschlossen.

Legen Sie es nach dem Programmieren des ESP8266 in die USV ein. Die schaltung ist nicht zu groß, wir können einen Platz für ihn finden..

Geben Sie die für die Verbindung erforderlichen Informationen ein: SSID, Kennwort und ioBroker-IP-Adresse, und laden Sie dann den Code hoch.

/****************************************************************
  *   https://myhomethings.eu

  *   Generic ESP8266 module
  *   Flash size: 1M (no SPIFFS)

/****************************************************************/

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

const char* ssid = "SSID";
const char* password = "Password";
const char* mqtt_server = "192.168.x.xxx";

int PCF8591 = 0x48;
float ain0;
String battery_voltage;
char battery_msg[25];
unsigned long last_msg = 0;
unsigned long msg_freq = 5000;
int mqtt_flag = 0;
int network_voltage_pin = 3;

WiFiClient espClient;
PubSubClient client(espClient);

void setup_wifi() 
{
  delay(100);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while(WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
  }
  randomSeed(micros());
}

void reconnect() 
{
  while(!client.connected()) 
  {
    String clientId = "ESP8266_UPS";
    if (client.connect(clientId.c_str()))
    {
      // pass
    } 
    else 
    {
      delay(6000);
    }
  }
}

void setup() 
{
  Wire.pins(0, 2);
  Wire.begin(0, 2);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  pinMode(network_voltage_pin, INPUT);
}

void loop() 
{
  if (!client.connected()) 
  {
    reconnect();
  }
  client.loop();

  if(digitalRead(network_voltage_pin) == HIGH && mqtt_flag == 0)
  {
    client.publish("UPS/Network_voltage", "false");
    msg_freq = 5000;
    mqtt_flag = 1;
  }
  if(digitalRead(network_voltage_pin) == LOW && mqtt_flag == 1)
  {
    client.publish("UPS/Network_voltage", "true");
    msg_freq = 30000;
    mqtt_flag = 0;
  }

  unsigned long Millis = millis();
  if (Millis - last_msg > msg_freq)
  {
    last_msg = Millis;
    Wire.beginTransmission(PCF8591);
    Wire.write(0x04);
    Wire.endTransmission();
    Wire.requestFrom(PCF8591, 2);
    ain0 = Wire.read(); 
    ain0 = Wire.read();
    ain0 = ain0 * (13.73 / 255);
    battery_voltage = String(ain0);
    battery_voltage.toCharArray(battery_msg, 25);
    client.publish("UPS/battery_voltage", battery_msg);
  }
}

Wenn die Montage abgeschlossen ist, schalten Sie das Gerät ein. Nach 30 Sekunden werden die Daten in ioBroker angezeigt.

Jetzt wissen wir, ob Strom in der Maschine ist und wie hoch die Batteriespannung ist, aber wir sind noch nicht aus dem Wasser 

Gehen Sie zu ioBroker, wählen Sie auf der Registerkarte Instanzen Javascript.0 aus, um den Adapter zu konfigurieren und die Ausführung der Befehle ’setObject‘ und ‚exec‘ zuzulassen.

Konfiguration des ioBroker JS-Adapters
Konfiguration des ioBroker JS-Adapters

Klicken Sie auf die Registerkarte Skript und erstellen Sie ein neues Javascript.

Erstellen Sie Javascript
Erstellen Sie Javascript

Kopieren Sie den folgenden Code:


on({id: 'mqtt.0.UPS.battery_voltage'/*battery voltage*/}, function (obj) {
  if(getState('mqtt.0.UPS.Network_voltage'/*Network voltage*/).val == "false")
  {
    if(getState('mqtt.0.UPS.battery_voltage'/*battery voltage*/).val < 11.0)
    {
        exec('sudo shutdown -h now');
        setState('javascript.0.scriptEnabled.common.Server_Halt'/*scriptEnabled common Server Halt*/, false);
    }
  }
});

Hier wird lediglich die Batteriespannung überwacht, wenn sich die Funktion ändert. Wenn zwei Bedingungen erfüllt sind (wenn kein Strom vorhanden ist und die Batteriespannung unter 11 V fällt), wird das System heruntergefahren.

Mit dieser einfachen Schaltung und einigen Codezeilen können Sie Schäden am Betriebssystem bei einem Stromausfall verhindern.

Was ist, wenn es wieder Strom gibt?

Diese Methode funktioniert, wenn der PC mit einem LAN-Kabel mit dem Netzwerk verbunden ist. Überprüfen Sie, ob Ihr Gerät für Wake on Lan (WoL) geeignet ist. Wahrscheinlich ja.

Wenn alles in Ordnung ist, erstellen Sie die Hardware:

USB-zu-ESP8266-Modul, serielle WLAN-Schnittstelle, Entwicklungsplatine und ESP-01-Adatper
werbung

Wir brauchen auch ein altes mobiles Ladegerät, schließen Sie es an und Sie sind fertig.

Oder Sie können ein 3,3-V-Netzteil direkt an den ESP8266-01 anschließen.

Zum Beispiel:

220V zu 3,3V Mini-Netzteil
werbung

Geben Sie die Verbindungsdetails und die Server-MAC-Adresse ein und laden Sie den folgenden Code mit Ihrem Arduino-Programm auf ESP8266-01 hoch.

/**************************************/
//                                    //
//  https://myhomethings.eu           //
//                                    //
//  Generic ESP8266 module            //
//  Flash size: 1M (no SPIFFS)        //
//                                    //
/**************************************/

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <WiFiClient.h>
#include <WakeOnLan.h>

const char* ssid     = "SSID";
const char* password = "Password";
const char* MACAddress = "xx:xx:xx:xx:xx:xx";

WiFiUDP UDP;
WiFiClient client;
WakeOnLan WOL(UDP);

void setup_wifi() 
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
  }
  randomSeed(micros());
}

void setup()
{
  setup_wifi();
  delay(300000);
  
  WOL.setRepeat(3, 100);
  WOL.calculateBroadcastAddress(WiFi.localIP(), WiFi.subnetMask());
  WOL.sendMagicPacket(MACAddress);
}

void loop()
{
  delay(1000);
  ESP.deepSleep(0);
}


Stellen Sie eine Verbindung zu dem Steckdose her, mit dem Ihr Server verbunden ist.


Ich hoffe, Ihnen hat dieses Schreiben gefallen.