spotřeba energie

Každého občas napadne jak ušetřit nějakou tu korunu za topení a celkově snížit spotřebu elektrické energie domu. Níže si ukážeme jak si sestavit měřící přístroj, který nám pomůže sbírat data o spotřebě a následně je zobrazíme na webových stránkách. zobrazit naměřená data

Co budeme měřit?
– hodnoty budeme odečítat přímo z hlavního elektroměru
– dům je dřevostavba o užitné ploše 96m2 (bungalov).
– vodní podlahové topení (elektrokotel) / přitápění krbem
– boiler nahřívaný převážně pomocí FVE – pohybuje se cca 4-5kwh denně

Co k tomu budeme potřebovat:
(1x) ESP 8266 e07

(1x) vypínač

(1x) 6V solární panel

(1x) LI-PO baterii 3,7V 10000mAh

(1x) solární nabíječku pro jeden článek CN3791 1S,6V

(1x) usb nabíječku TP4056

(1x) Microchip Technology MCP1700-3302E/TO PMIC

(1x) světelný snímač LM393

(1x) teplotní snímač DS18B20

(1x) anténa

(1x) kondenzátor 1000uF/35V

(1x) kondenzátor 100nF/50V

(1x) vytištěnou desku

webový prostor, doménu, a pár dalších drobností

Hlavní elektroměr instalovaný dodavatelem elektřiny je zaplombovaný a proto použijeme způsob kterým do elektroměru nijak nezasáhneme. K měření využijeme pouze jeho blikající LED diodu která blikne 500krát na 1 spotřebovanou kWh.

Sestava se tedy bude skládat ze snímače pulzů a krabice s elektronikou.

Hotová sestava s konektorem pro připojení panelu.

No a nyní se můžeme pustit do práce 🙂

Vytvořil jsem si desku a tu si nechal vytisknout a poslat abych nemusel pájet jednotlivé dráhy z drátků. Jeto elegantnější řešení a při práci je velmi snadné měřič sestrojit. Tady je vidět schéma zapojení.

podklady pro tvorbu desky
Desku je možné si nechat vyrobit za cca 10$/5ks včetně dopravy.
Tato varianta mi přišla jednoduší než bastlit kupu drátků.
Níže odkaz kde je možné objednat desku.
https://jlcpcb.com/

Použitý čip ESP8266 e07 musí být zapojen tak aby bylo možné přepínat mezi dvěma režimy – download/run mode. Pomocí tlačítka vytvoříme nulové napětí na pinu GPIO0 a to nám umožní nahrát program do paměti čipu. Více je vidět v tabulce níže.

Po osazení a zapájení desky se dostaneme asi k takovému výsledku.

základová deska

Obvod se skládá z lineárního regulátoru MCP1700-3302E/TO který nám vytvoří napětí 3,3V. Kondenzátory v obvodu plní funkci stabilizace napětí při změnách odběru. Tlačítko slouží pro přepínání režimu ESP – pro nahrátí programu do čipu a následné spuštění. Zbylé odpory slouží pro omezení proudu v obvodu.

Celý měřič spotřeby udržuje v chodu 6V solární panel, který připojíme do solární nabíječky CN3791 1S,6V. Pro možnost dobít baterii i mimo slunce jsem do obvodu přidal USB nabíječku TP4056 kterou zapojíme do zdířek solární nabíječky v místě označené battery. Do druhé zdířky přijde konektor baterie. Tím je USB nabíječka připojena paralelně se solární nabíječkou. Do konektoru sensor připojíme světelný snímač LM393. Tento snímač má 4 nožičky, ale my využijeme pouze 3. a to VCC, GND, D0 -> digitální výstup.

Snímač vložíme do plastového držáku a musíme zajistit aby byl umístěn co nejblíže blikající led diodě na elektroměru. Pomocí potenciometru seřídíme snímač tak aby při každém bliknutí diody elektroměru problikla i dioda na snímači. Snímač funguje tak, že v době kdy nesvítí dioda dává na výstupu D0 napětí 3,3V. Tím v době bliknutí diody padne toto napětí na nulu. To je pro nás důležitá informace pro následné naprogramování ESP.

Po připojení snímače a panelu máme tedy celý obvod hotový a můžeme se pustit do programové části měřiče.

Postup měření spočívá v tom, že ESP8266e07 uvedeme do lehkého spánku. Lehkým spánkem se rozumí stav, kdy čip odpojí veškeré obvody a ukončí běh některých funkcionalit čipu. Přesně je to vidět v tabulce níže.

V lehkém spánku má čip mnohem menší spotřebu než při klasickém provozu.

běžný provoz cca 80mA
V režimu lehkého spánku se spotřeba pohybuje od 3 do 5mA

Z lehkého spánku nám čip probudí každý signál ze světelného senzoru. Po určitém čase počet pulzů odešleme do databáze běžící na webových stránkách kde je následně zpracujeme a zobrazíme v grafech.

Programování:

Programová část se skládá ze tří částí.
– ESP8266e07 – programování čipu v arduino IDE
– nastavení MYSQL databáze běžící na webu
– zobrazení výsledků

  1. Programování v arduino IDE
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h> 
#include "gpio.h"
#include "user_interface.h"
#include <Ticker.h>
#include <OneWire.h>
#include <DallasTemperature.h>


// GPIO where the DS18B20 is connected to
const int oneWireBus = 5;     


#ifndef STASSID
#define STASSID "*****"  //název wifi
#define STAPSK "******"         //heslo
#endif

const uint32_t ledSensor = 4;

int value =0; //počet naměřených pulzů
int value_send =0;
const char* ssid = STASSID;
const char* password = STAPSK;
uint32_t sleep_time_in_tic = 75*10000000; //1min =10 000 000
uint32_t sleep_time =0;
uint32_t wake_up_time =0;
uint32_t interupt_time_before =0;
uint32_t interupt_delay = 30000; //cca 1/3s
bool first_start = true;

const char* host = "www.youda.cz";
const int httpPort = 80;
String status;  //získaná odpověď statusu ze serveru 200=OK
int i =0;
unsigned long button_time = 0;  
unsigned long last_button_time = 0;

void ICACHE_RAM_ATTR handleInterrupt(); //tímto se funkce spustí pouze v RAM!! nutno pro efektivní přístup kdykoli

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);



void setup() {
  Serial.begin(115200);
  gpio_init();
    // Start the DS18B20 sensor
  sensors.begin();
  pinMode(ledSensor, INPUT_PULLUP); 
  attachInterrupt(digitalPinToInterrupt(ledSensor),handleInterrupt, FALLING); //umožní zapisovat do hodnoty value kdykoliv při pullup na pinu 4 
  posli_data();  
    
}


void handleInterrupt(){
    
    uint32_t system_time_now = system_get_rtc_time(); 
    if(system_time_now<interupt_time_before)
    {    
    interupt_time_before=(0xFFFFFFFF-interupt_time_before)+system_time_now;
    }
    
    if(system_time_now-interupt_time_before>=interupt_delay)
    {   
    value++;
    interupt_time_before=system_get_rtc_time();
    Serial.println(value);
    }
    
}


void loop() {
Serial.println("Wake up");
if(wake_up_time<sleep_time)
{
   Serial.println("mensi");
wake_up_time=wake_up_time+(0xFFFFFFFF-sleep_time-1);   
}

if ((wake_up_time-sleep_time)>=sleep_time_in_tic)
{
posli_data();  
sleep_time = system_get_rtc_time();

}


light_sleep();

}
 

void light_sleep(){
  Serial.println();
  Serial.print("sleep");
  Serial.println();
  Serial.flush();
   
   wifi_station_disconnect();   
   wifi_set_opmode_current(NULL_MODE);
   wifi_fpm_set_sleep_type(LIGHT_SLEEP_T); // nastavení typu spánku
   wifi_fpm_open(); // povolí vynucený spánek
   gpio_pin_wakeup_enable(GPIO_ID_PIN(ledSensor), GPIO_PIN_INTR_LOLEVEL);   //wake-up from pin 4 probudí se když je na pinu nulové napětí
   wifi_fpm_set_wakeup_cb(fpm_wakup_cb_func);      
   wifi_fpm_do_sleep(0xFFFFFFFF); // spánek na nejdelší možnou dobu
   delay(10); // delay musí být min 10 jinak se nestihne uspat a začne vykonávat další operace
 }
 



void fpm_wakup_cb_func()
{
wake_up_time= system_get_rtc_time();


}





void posli_data()
{
// měření teploty
  sensors.requestTemperatures(); 
  float temperatureC = sensors.getTempCByIndex(0);
  



  // We start by connecting to a WiFi network
  value_send=value;
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  /* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
     would try to act as both a client and an access-point and could cause
     network-issues with your other WiFi-devices on your WiFi-network. */
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
      
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    delay(5000);
    return;
  }

  // This will send a string to the server
  Serial.println("sending data to server");
  if (client.connected()) {
    if (first_start == true)
    {
    client.print(String("GET /energie.php?") +
                        ("hodnota=") +(value_send) +
                        ("&zarizeni=START") + ("&teplota=") +(temperatureC)+
                        " HTTP/1.1\r\n" +
                        "Host: " + host + "\r\n" + 
                        "Connection: close\r\n\r\n");
                          
    }
    else   
    {
    client.print(String("GET /energie.php?") +
                        ("hodnota=") +(value_send) +
                        ("&zarizeni=ESP") + ("&teplota=") +(temperatureC)+
                        " HTTP/1.1\r\n" +
                        "Host: " + host + "\r\n" + 
                        "Connection: close\r\n\r\n");
    }

  
                      
                        
  }
// wait for data to be available
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }

  // Read all the lines of the reply from server and print them to Serial
  Serial.println("receiving from remote server");
 
  i=0;
  while (client.available()) {
    char ch = static_cast<char>(client.read());
    Serial.print(ch);
    if(i>8 && i<12)
    {
    status=status+ch;
    } 
    if(i>40)
    {
    break;
    }  
    i++;       
  }

    Serial.println("odpoved ze serveru je:");
    Serial.println(status);
    Serial.print("value_send:");    
    Serial.println(value_send);
    Serial.println("temperature:");     
    Serial.print(temperatureC);
    Serial.println("ºC");

  if (status=="200")
  {
  value=(value-value_send);  
  }  
    status="";
  // Close the connection
  Serial.println();
  Serial.println("closing connection");
  client.stop();
  first_start = false; 
  Serial.flush();   
}

energy_Arduino_IDE

Něco z teorie:
Po úspěšném startu ESP, se přihlásíme do náší wifi sítě a odešleme do databáze informaci o běžícím zařízení -> název „START“. Následně zařízení uvedeme do lehkého spánku a čekáme na signál od blikající LED. Bliknutí LED nám odešle logickou nulu na pin 4 a tím probudíme ESP z lehkého spánku. Po probuzení si zařízení zapíše naměřenou hodnotu do RAM-paměti a opětovně se uspí. Pokud uplyne více času než cca 1 hodina, odešleme naměřené hodnoty do DB s názvem „ESP8266e7“

V případě tvrdého resetu ESP bude znovu odeslán stav „START“. To umožňuje zkontrolovat, zda nám nechybí nějaké hodnoty. To se může stát například při vybití baterie nebo nějaké neočekávané chybě.

pro správnou funkci musíme importovat pár knihoven.

nastavení MYSQL databáze běžící na webu.

Již dříve jsem se ze zvědavosti rozhodl založit tento web, který běží na serverech forpsi.com. Po zaplacení mi poskytovatel webhostingu zaslal všechny přihlašovací údaje jako:

  • přístup k ftp
  • přístup do MYSQL databáze
  • předinstalovaný WordPress
  • Následně bylo důležité zakoupit doménu www.youda.cz
  • Po spárování domény s webserverem se web konečně stal veřejně přístupným a bylo možné začít tvořit.

Bohužel poskytovatel forpsi.com neumožňuje přímý zápis ze zařízení do MYSQL, takže bylo nutné napsat phpscript pro zápis hodnot do databáze a následně další phpscript pro zobrazení výsledků.

Ve svém projektu jsem v databázi vytvořil tabulku „energie“, do které zapisuji naměřené hodnoty. Pomocí phpscriptu „energie.php“ proběhne samotný zápis do DB. Tento skript bere hodnoty odeslané z ESP a zapisuje je do tabulky.

Nesmíme zapomenout vytvořit trigger.
S každým novým záznamem v MYSQL zkontroluji, kolik času uplynulo od předchozího záznamu. Pokud je čas delší než nastavený rozsah, napíšu do pole „stav“ chybovou hlášku „ERROR“.
ESP má vlastní timer (časovač), který není příliš přesný a k tomu je lehce ovlivněn teplotou čipu. Z toho důvodu je dobré ponechat nějaký prostor pro drobnou ochilku. ESP tedy odesílá data cca každých 50minut. Při každém zápisu dojde ke kontrole kolik času uplynulo od posledního záznamu. Pokud je čas delší než jedna hodina, dojde k zapsání chybového statusu ERROR.

zobrazení výsledků

Výsledky zobrazuji pomocí php skriptu, který se skládá ze dvou částí

  • – connect.php (obsahuje přihlašovací údaje pro připojení k MYSQL)
  • – graf.php (vykreslí graf a zobrazí naměřené hodnoty)

Pár fotek hotového zařízení

instalace do rozvaděče
fotovoltaický panel

zapojení:

Downloads:

Pár poznatků:
Na základě provedeného měření jsem se rozhodl o montáž malé FVE o velikosti 2,5kwp. Elektrárna je bez baterie a pouze nahřívá boiler 120l. Ročně boiler spotřebuje přibližně 1,5MWh.

V případě dotazů zašlete email nebo přidejte komentář. V případě potřeby mohu cokoliv doplnit nebo vysvětlit. Budu rád za případnou zpětnou vazbu zda se někomu podařilo dle návodu sestavit.