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