Aqlli uy: elektr tarmog’ini boshqarish.

Elektr tarmog’ining holatini to’g’ridan-to’g’ri brauzerda kuzatib boring.

Men kvartiramning elektr tizimini nazorat qilishni juda xohlardim. Bundan tashqari, har safar elektr paneliga yugurish administratorning yondashuvi emas. Administratorlar dangasa, shuning uchun barcha ma’lumotlarga to’g’ridan-to’g’ri stollaridan kirish mumkin bo’lishi kerak. Va keyin bu do’stlarimga maqtanish uchun sabab bo’ladi.

Shunday qilib, ishga kirishamiz… Men ushbu maqolada mosquitto va node red ni o’rnatish jarayonini tasvirlamaslikka qaror qildim, chunki mening maqolam asosan ushbu loyihaning apparat qismiga qaratilgan. Shuni ta’kidlashni istardimki, men qurilmani bir necha hafta sinov va nosozliklarni tuzatishdan keyin barqarorlashtira oldim, shuning uchun menimcha, bu qiyinchilik bilan qo’lga kiritilgan eskizni siz bilan baham ko’rish juda muhim. ;)

Monitoring uchun men quyidagi komponentlardan foydalanishga qaror qildim:

PZEM-004T raqamli multimetr/metr 220V tarmoqdan kuchlanish va quvvat sarfini o’qiy oladi. U nosozliklarning oldini olish uchun galvanik izolyatsiyaga ega. Shuningdek, u qurilmaning ko’rsatkichlaridan mustaqil ravishda ishlaydigan o’rnatilgan hisoblagichga ega.

ESP8266 ESP01s ESP8266 chipiga asoslangan eng oddiy va eng arzon platadir. Bu Wi-Fi ga ega mikrokontroller. Ushbu qurilma 3.3V mantiqiy darajada ishlaganligi sababli, u ko’prik konvertori bilan birga keladi. Ushbu ko’prik sizga qurilmani 5V manbadan quvvatlantirish va 5V UART ga ulanish imkonini beradi.

Shuningdek, sizga har qanday elektronika do’konida osongina mavjud bo’lgan 5V quvvat manbai kerak bo’ladi. Minimal chiqishi 0,5 amper bo’lgan qurilmadan foydalanish tavsiya etiladi.

Aytgancha, men hozirda aqlli uy serverim sifatida Orange Pi PC Plus dan foydalanmoqdaman. U buni yaxshi bajaradi, lekin men SSD qo’shmoqchiman, shuning uchun ishlab chiqaruvchining eng kuchli apparati — Orange Pi RK3399 ga pul sarflashga qaror qildim. Yozish paytida apparat hali ham yo’lda, shuning uchun men uni keyingi safar ko’rib chiqaman. Afsuski, hozirda internetda ushbu qurilma haqida deyarli hech qanday foydali ma’lumot yo’q.

Biz komponentlarni shu tarzda bog’laymiz.

Galvanik izolyatsiya bilan shug’ullanayotganimiz sababli, PZEM-004t ni 220V ga ulamasdan turib tekshirishning iloji yo’q, chunki u ikkala uchidan ham quvvatlanadi…

Va endi eng muhim qism. Esp01 uchun eskiz.

#include 
#include 
#include 
#include 
#include 
#include 
double sens[4];
int pred;

PZEM004T pzem(3,1);  // RX,TX пины
IPAddress ip(192,168,1,1);

const char* ssid = "WIFI-SSID";
const char* password = "password";

#define MQTT_SERVER "192.168.1.254"  // Адрес MQTT брокера
#define mqtt_port  1883 // Порт
const char* mqtt_user="smart"; // Логин для MQTT
const char* mqtt_pass="password"; // Пароль


void callback(char* topic, byte* payload, unsigned int length) {

}
WiFiClient wifiClient;
PubSubClient client(MQTT_SERVER, 1883, callback, wifiClient);


#define BUFFER_SIZE 100

String macToStr(const uint8_t* mac){
  String result;
  for (int i = 0; i < 6; ++i) {
    result += String(mac[i], 16);}
  return result;
}

void re_connect() {
  if(WiFi.status() != WL_CONNECTED){
    WiFi.begin(ssid, password);
  } else {
      delay(7000);
  }
}

void setup() {
  ESP.wdtDisable();
  pzem.setAddress(ip);
  
  pinMode(2, OUTPUT);    
  digitalWrite(2, LOW);    // выключаем светодиод
  re_connect();
  delay(100);
}

void loop(){
  if(WiFi.status() == WL_CONNECTED){
    client.connect("esp8266-AD14C5",mqtt_user,mqtt_pass);
    ESP.wdtFeed();
  } else {
    re_connect();
  }
  sens[0] = pzem.voltage(ip);
  if (sens[0] < 0.0) {
    sens[0] = 0.0; 
  }
  if (sens[0] > 0){
    client.publish("home/sensors/electro/v",String(sens[0]).c_str());
  }
  if (sens[0] == 0.0 && pred == 0) {
    client.publish("home/sensors/electro/v",String(sens[0]).c_str());
  }
  pred = sens[0];
  delay(1000);  
  sens[1] = pzem.current(ip);

  if(sens[1] >= 0.0){ 
     client.publish("home/sensors/electro/i",String(sens[1]).c_str());
   }
  delay(1000); 
  sens[2]= pzem.power(ip);

  if(sens[2] >= 0.0){ 
    client.publish("home/sensors/electro/w",String(sens[2]).c_str());
  }
  
  delay(1000); 
  sens[3] = pzem.energy(ip);

  if(sens[3] >= 0.0){ 
    client.publish("home/sensors/electro/wh",String(sens[3]).c_str());
  }
  delay(1000); 
  client.loop();
}

Hozirgi ma’lumotlar displeyim shunday ko’rinadi. Real vaqt rejimida displeydan tashqari, men uch kun ichida ko’rsatkichlardagi o’zgarishlarni ko’rsatadigan ikkita grafik ham yaratdim. Men har oy elektr energiyasi uchun to’lovlarni kuzatib borishni rejalashtirmoqdaman. :)