UPS felokosítása ESP8266 és PCF8591 felhasználásával

Van egy jól müködő UPS-em hibás hálózati interfésszel, az iobroker szerverhez használom. Az volt a probléma, hogy hosszabb áramkimaradás esetén nem állította le a PC-t.

Az UPS felokosításához alábbi áramkört készítettem el ESP8266 és PCF8591 felhasználásával, és építettem be az UPS-be.

UPS felokosítása ESP8266 és PCF8591 felhasználásával
UPS felokosítása ESP8266 és PCF8591 felhasználásával

Figyelem!

A hálózati feszültség nem játék, halálos áramütést, tüzet okozhat! Csak a saját felelőségedre és csak ha tudod, hogy mit csinálsz!

Az UPS szétszerelése elött kapcsold ki és húzd ki a konnektorból! A burkolat eltávolítása után azonnal válaszd le az akkumulátort!


Ezekre szükség lehet:

ESP8266 ESP-01S WiFi Modul

ESP-01S Breadboard Adapter ESP8266-hoz

USB Programozóadapter ESP8266-01-modulhoz

PCF8591P DIP-16

FT232RL USB – TTL Soros Adapter 3,3V és 5V

Ellenállás készlet 525 db , 0 Ohm -1M Ohm

LM2596S DC-DC Adapter Step down modul

AC DC 220V bis 5V Power Supply Modul


A belső akkumulátorról tápláljuk az áramört, így áramkimaradás esetén is működőképes marad.

A PCF8591 A/D konverter segítségével 2db ellenállásból készített feszültségosztón keresztül tudjuk mérni az akku feszültségét. A PCF8591 I2C buszon csatlakozik az ESP8266-01 hez a fenti ábra szerint (zöld vezeték SDA a GPIO0 és sárga vezeték SCL a GPIO2). A 4.7K felhúzóellenállásokat ne felejtsük el. Ezzel az áramkör egyik része kész is van.

A következő lépésben a hálózati feszültség meglétét vizsgáljuk meg. Az UPS bejövő kábeléhez csatlakoztassunk egy 230V-5V StepDown tápegység modult (pl.: HI-Link HLK-PM01). A kimenet egy optocsatolón keresztül csatlakozik az ESP8266-hoz, így ez a rész galvanikusan is le van választva. Az optocsatoló lehet például PC817, TPL621, stb. 470 Ohm előtétellenállással a bemenetén. A kimenetét kapcsoljuk az ESP8266-01 RX pinjére, ezt most bemenetként fogjuk használni. Ezt a bemenetet húzzuk fel egy 1K ellenállással a 3,3V tápfeszültségre.

Helyezzük el az UPS belsejében az ESP8266 felprogramozása után, nem nagy az áramkör biztos találunk neki helyet.

Írjuk be a csatlakozáshoz szükséges adatokat : SSID, Jelszó és az ioBroker IP címe, majd töltsük fel a kódot.

/****************************************************************
  *   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);
  }
}

Ha kész összeszerelés után helyezzük áram alá a készüléket és kapcsoljuk be. 30 másodperc után megjelennek az adatok az ioBrokerben.

Most már tudjuk, hogy van-e áram a gépnél és hogy mekkora az akku feszültsége, de ezzel még nem vagyunk kint a vízből;-)

Menjünk az ioBrokerhez, az Instanzen fülön válasszuk a javascript.0 lehetőséget az adapter konfigurációjához és engedélyezzük a ‘setObject’ és ‘exec’ parancsok futtatását.

ioBroker JS adapter konfiguráció
ioBroker JS adapter konfiguráció

Kattintsunk a Skripte fülre és hozzunk létre egy új Javascriptet.

Javascript létrehozása
Javascript létrehozása

Másoljuk be az alábbi kódot:


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);
    }
  }
});

Itt annyi történik, hogy figyeljük az akku feszültségét, ha változás van lefut a függvény. Két feltétel teljesülése esetén (Ha nincs áram és az akku feszültsége 11V alá csökken) leállítjuk a rendszert.

Ezzel az egyszerű áramkörrel és pár sor kóddal megelőzhetjük az operációs rendszer sérülését áramszünet esetén.

Mi a helyzet, ha újra lesz áram?

Ez a módszer akkor működik, ha a PC LAN kábellel csatlakozik a hálózathoz. Ellenőrizzük, hogy a gépünk alkalmas-e hálózaton keresztüli ébresztésre (WoL – Wake on Lan). Valószínüleg igen.

Ha minden OK készítsük el a hardvert:

ESP8266-Modul, és USB ESP-01-Adatper
reklám

Ezenkívűl szükségünk van egy régi mobiltöltőre, dugjuk össze és már kész is van.

Vagy illeszthetünk az ESP8266-01 hez közvetlenül 3,3V tápegységet.

Például ilyet:

220V / 3,3V Mini-tápegység
hirdetés

Írjuk be a csatlakozási adatoket, a szerver MAC cimét és töltsük fel az alábbi kódot az ESP8266-01 re az Arduino programunkkal.

/**************************************/
//                                    //
//  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);
}


Csatlakoztassuk ahhoz a konnektorhoz amelyikhez a szerverünk csatlakozik.


Remélem tetszett ez az írás.

MINISFORUM GK41 Mini-PC

MINISFORUM GK41 Mini-PC

Mini asztali számítógép Windows 11 Pro rendszerrel. 8 GB DDR4, 128 GB SSD négymagos Celeron J4125 processzorral (2,7 GHz-ig) 4xUSB 3.0 port 2xGigabit Ethernet 4K HDMI/DP WiFi Dual BT 4.2

Optimális Smarthome, Mosquitto, ioBroker vagy médiaszerver számára.

hirdetés