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.
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:
ESP-01S Breadboard Adapter ESP8266-hoz
USB Programozóadapter ESP8266-01-modulhoz
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.
Kattintsunk a Skripte fülre és hozzunk létre egy új Javascriptet.
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:
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:
Í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.
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