Měření spotřeby energie s ESP8266 a PZEM-004T

ESPPZEMTitleWebJeden ze čtenářů těchto stránek mi věnoval měřič spotřeby PZEM-004T, koupený někde z Číny s tím, že by chtěl, abych ho připojil k ESP8266 a tím umožnil na tomto základě stavět další konstrukce. Po poměrně zákeřných peripetiích s nespolehlivostí komunikace se mi podařilo vytvořit funkční knihovnu a základ měření, takže přišel čas na nový článek…

Měřič přišel poštou s Čínským a Anglicky psaným manuálem, bohužel k verzím PZEM-021 a PZEM-061, zatímco na plošném spoji je označení PZEM-004T.

PZEM004_web

Naštěstí se na internetu dala najít správná dokumentace, takže tento nedostatek šel napravit snadno.

Protože zde jde o práci se síťovým napětím, tak jsem se rozhodl, že vyrobím testovací desku, kde se budu snažit o co největší (moji) bezpečnost.

Dily_web Sestava_Web

Pro jistotu jsem si řádně označil, jak zapojit jednotlivé vodiče na měřiči.

Vyvody_Web

Jako VDD jsem uvažoval použít 3.3V přímo, které jsou společné pro napájení modulu ESP8266, ale osciloskop mě vyvedl z omylu – použité optrony vyžadují skutečně napájení 5V. Znamenalo to tedy, že vývody TX a RX nemůžu připojit přímo, ale minimálně přes odporový dělič. No a tady vlastně začaly ty pravé problémy – komunikace sice probíhala, ale byla velmi nespolehlivá – prakticky neustále docházelo k bitovým chybám v protokolu a drtivá většina vyčtených hodnot nedávala žádný smysl.

ESPPZEMVars_web

Měl jsem podezření na moje odporové přizpůsobení, tak jsem postupně vyzkoušel zapojení s převodníkem úrovní 3V3<->5V a i s obvodem 74HC14 se Schmittovými klopnými obvody, ale výsledky byly stále stejně mizerné. Až jsem – po aktualizaci Arduina na poslední stabilní verzi (2.1.0 v době psaní článku) narazil na jednu zajímavost. Zmizela totiž komponenta SoftwareSerial, kterou jsem používal pro sériový přenos. Protože jsem měl v projektu aktivní OTA (kvůli obavám z propojení USB PC portu s PZEM modulem), tak jsem zkusil pro přenos použít hardwareový sériový port. Všechny problémy zmizely jako mávnutím kouzelného proutku a poskytované hodnoty jsou stabilní. Zde bych chtěl udělat jednu odbočku – Arduino pro ESP8266 prodělává skutečně velmi rychlý vývoj – co před měsícem přeložit šlo, nyní již jít nemusí, co před měsícem nefungovalo, nyní již funguje. Abych předešel problémům a nedorozuměním, budu se vždy u projektů snažit uvést použitou verzi IDE a jádra pro ESP, rovněž jsem se rozhodl změnit strukturu projektů. V jednom ZIP souboru bude uloženo vše, co je nutné pro překlad mimo knihoven, které nejsou přímo závislé na použité platformě. Zkomplikuji si tím sice například to, že u každého projektu budu muset mít uvedenou knihovnu WiFiConfig, kterou používám, ale na druhou stranu by projekt měl jít přeložit a běžet správně – jak to přesně myslím pochopíte, až si rozbalíte na konci článku uložený archív s projektem.

Pro vizualizaci jsem našel krásné javascriptové počítadlo od Marka Crossleyho, kterému tímto děkuji za jeho zveřejnění. Vizualizace pracuje tak, že využívá principu, který jsem navrhl pro projekt KWS – existuje webový server, který dokáže generovat dynamický obsah ze sady proměnných, které jsou plněny daty, vyčtenými z měřiče spotřeby. Webová stránka s měřidlem vypadá takto:

ESPPZEMMeter

je aktualizovaná každé dvě sekundy pomocí Ajax dotazu na aktuální hodnotu spotřeby energie. Pokusně je v projektu rovněž aktivován jednoduchý FTP server, který jsem chtěl použít pro aktualizaci souborů webového rozhraní, ale protože OTA aktualizace už podporují i nahrávání souborového systému, tak jsem ho nakonec nikdy nevyužil.

A na závěr ještě uvedu fotografii propojení elektroniky těsně předtím, než jsem přesunul TXD a RXD na HW sériový port (to pro případ toho, že by někdo chtěl přijít na to, proč nefunguje SoftwareSerial).

PZEM_el_Web PZEM_el2_Web

No a na úplný závěr již zbývá jen přiložit slíbený archív s projektem… (no a taky ty verze)

Arduino IDE 1.6.7, Core 2.1.0 Stable

 

Pzemmeter
Pzemmeter
pzemmeter.zip
18.3 KiB
2353 Downloads
Detaily

65 komentářů u „Měření spotřeby energie s ESP8266 a PZEM-004T“

  1. To vypadá zajímavě. Jak by šlo udělat takové měření pro zjišťování spotřeby nizkoodběrových zařízení třeba arduina?
    Aby to měřilo třeba 24 hodin a pak ukázalo odběr?
    Je tam problém se nárazovým odběrem a vzorkováním, abych vůbes odběr zachytil a samozřejmě i přesností.
    Děkuji

    1. Udělat se to dá buď jednoduše, nebo složitě (ale přesně). Jednoduchá varianta je použít třeba ACS712-05, ale při tak malých odběrech ta přesnost půjde do háje. Složitější varianta je pak třeba 0.1 ohmů rezistor na low side a k tomu odpovídající OZ (inspirace třeba zde http://www.planetanalog.com/document.asp?doc_id=527795). Ta samplovací rychlost určitě vliv mít bude, ale zase se dá doplnit nějaký integrační kondenzátor… Nebo třeba zkusit tohle http://www.panucatt.com/Current_Sensor_for_Arduino_p/cs-100a.htm – je to v podstatě ACS712 do 100mA (ale ta cena…).

      1. Mám s Hall senzory ACS712 a podobnými dost natrápeno, tudíž budu varovat před jejich použití. Pominu mechanickou nestabilitu.
        Elektrická nestabilita je závažnější. Stačí i jen otočení v prostoru a výsledky jsou rozdílné. Existence či neexistence okolního kovového prostředí, přiblížení kovu, nebo projít okolo s magnetem je přímo rozdíl několika řádů. Podmíněně použitelné jsou tyto obvody jen při dobrém magnetickém odstínění.

        Pro hodně orientační měření na kterém téměř nezáleží použitelné, jinak spíš se tomuto produktu vyhnout.

        1. No já mám ACS712-05 použitý v jednom projektu už asi 3 nebo 4 roky. Měří proud LED diodami, umístěný je v plastové krabičce z ABS a běží cca 12 hodin denně. Nezaznamenal jsem problém, ale pravdou je, že mi jde o přesnost na jedno desetinné místo (v Ampérech) a desítky a jednotky miliampér neřeším…

  2. Zkusím to prostudovat. Já jsem používal INA219 na měření kapacity baterie. Tam ale teče proud pořád. U toho impulsního odběru by to nebylo asi vhodné.

    1. Ale to by mohlo jít použít také. Interní A/D převodník je také dost rychlý a spousta věcí se dá narovnat matematikou, napojenou za samplování. Jestli proud teče pořád, nebo impulzně je asi celkem jedno pokud se vybere správně rychlost vzorkování vzhledem k šířce proudových impulzů. Taky může hrát roli rozsah měření, ale ono je vždycky nejlepší vědět co vlastně měřím a pak se tomu přizpůsobit principem měření.

  3. Jejda promiň. Nejde mi stáhnout archiv k tomuto článku. Sleduji nejvíce tvoje stránky a stránky Petra Stehlíka a nějak se ni ta jména přehodila. Omlouvám se.

    Zdenda

      1. Mám nový notebook s win 8.1. a po poklepání na odkaz na stažení prostě nic nedělá a nic nehlásí. Ve stažených souborech nic nepřibude,
        Děkuji

        1. Má to celkem 17 stažení, takže problém asi nebude na stránce. Typ prohlížeče jsi neuvedl, takže můžu jen spekulovat – změní se vzhled kurzoru při najetí na zelenou šipku? To stejné se musí stát při najetí na ikonu balíčku, navíc by se někde mohla objevit URL odkazu (v tomto případě konkrétně na https://www.xpablo.cz/?wpfb_dl=21)…

    1. Ono tam je mnohem víc zajímavých přednášek (Lets Encrypt, SDR, útok na A5/1, …) které by mě zajímaly, akorát že to je v Praze 🙁 … No nevadí – počkám na podcasty a workshopy holt nebudou.

  4. Jenom otázečka: jak WifiConfig a verze s možností nastavení pevné IP?

    1. Tahle verze ještě není – zasekal jsem se na Captive portalu, kde jsem zjistil, že Android zařízení, pokud má aktivní síťové aplikace jako třeba Viber, dokáže běžný portál udusit. Snad se mi to podařilo vyřešit (tahle verze by mohla být součástí dnešního článku, pokud ho stihnu dopsat), ale tím pádem nabralo zpoždění dopsání dalších vlastností…

    1. S impulzním výstupem z elektroměru jsem už kdysi pracoval – napsal jsem měření dle výstupního impulzu pro zaměstnavatele, což bylo součástí regulátoru čtvrthodinového maxima (projekt bohužel šel do útlumu). Akorát mi nepřijde, že to bude levnější – cena elektroměru s impulzním výstupem co si tak pamatuju je kolem 250,-Kč (ani na Aliexpresu jsem nenašel levnější), takže to vyjde prakticky na stejno…

  5. Teď jsem ten modulek našel za 9 USD, tak to je jiná – spíš to beru tak, že odečtovej elektroměr se montuje většinou jako samozřejmost, je v krabičce a nikdo se nemusí bát ho dát do rozvaděče, a nějaký sledování okamžité spotřeby je bonus.
    Já tady mám open energy monitor shield (nechtělo se mi to bastlit), ale nemám čas to finalizovat a nasadit do provozu, NTS je odložen snad na 2019, tak do té doby by to mohlo klapnout….

  6. Mám chroma. Už jsem na to přišel, Dělalo to blokování vyskakovacích oken,
    Děkuji za pomoc

  7. Zdravím,
    zkouším ADC převodník u arduina. Dočetl jsem se, že přesnost je +-2LSB. Takže :
    2.5 10
    502 1.225585938 12.25585938
    500 1.220703125 12.20703125
    498 1.215820313 12.15820313
    Když je správná hodnota 500 dílků (první sloupec), tak můžu naměřit 502,500 i 498 “dílků”. Referenční hodnota je 2.5V (napěťová reference) a dělič má poměr 10. Na displeji by se pak při čtení třeba co 1s měly zobrazovat ty údaje ze třetího sloupce, že? U mě je ta přesnost ještě horší (2%). Je to normální anebo je něco špatně.
    Děkuji za případnou radu.

    1. Dobrý den,
      ne tak úplně přesně – pokud se bavíme o Atmega328, který je v běžném Arduinu, tak ten má 10-ti bitový převodník, maximální hodnota tedy činí 1023 (0x3FF) na plný rozkmit reference, která může být 1.22V, nebo 2.56V. Pokud tedy převodník vrací 500, tak to znamená, že skutečná hodnota napětí na měřené vstupu je 1.25V (což +/- odpovídá tomu, co uvádíte) absolutní rozdíl měřený převodníkem by měl být do 0.0050V na obě strany. Potíž může být v kvalitě filtrování napájení analogové části procesoru a vlastním šumu připojeného signálu (máte filtrovací kapacitu?) a přesnosti děliče. Dále přesnost může ovlivnit také rychlost převodu, teplotní závislosti použitých komponent, …

  8. Díky. Reference ale můžou být různé – já teď používám TL431 (pozn. má ale vysoký odběr, proto chci přejít na LT1004) a ta má hodnotu typ. 2.495. Mě nejvíc překvapuje, že snad ani dvě po sobě jdoucí čtení nejsou stejná. Je to měřič kapacity autobaterie a je z ní i napájen, a tak snad filtrace by neměla být problém? Dělič je z obyč odporů. Myslel jsem, že když to ocejchuji podle multimetru, tak odstraním nepřesnost děliče. Dokonce jsem použil http://www.gammon.com.au/adc tu metodu Sleep during reading. Ono když je reference na 3 desetinné místa, tak výsledek měření by měl být asi taky na max. tři místa? Ještě nevím, jestli na Vref má být nějaká kapacita. Např. ve schématu Arduino Pro mini je, jinde ne.
    Tu externí referenci jsem použip proto, že když byla nastaveno interní, tak se napětí na Vref pinu hýbalo. To ale bylo napájené ze spínaného zdroje.

    1. No je to už dlouhá doba, kdy jsem dělal naposledy protokol z měření do školy a znalosti se trošku vykouřily, ale pokud máte přesnost reference nějakou a přesnost převodníku také nějakou, tak celková přesnost měření bude daná součtem přesností jednotlivých měřidel (přesně to už fakt nevím – zkuste najít na internetu, jak se počítá přesnost měření….). V každém případě Vám ale doporučuji osciloskop a měřit, co vlastně kde běhá za napětí a průběh. Na Vref bych kondík určitě dal. Pokud vnitřní reference nebyla stabilní, tak hledejte skutečně chybu ve filtrování napájecího napětí a zkontrolujte správné zapojení analogových rozvodů.

  9. Zdravím,
    zkoušel jsem použít vaši funkci na čas:
    char tempStrBuff[256];
    void setup() {
    Serial.begin(9600);
    }
    static char *upTimeStr(void)
    {
    int uptimesec = millis() / 1000;
    int uptimemin = uptimesec / 60;
    int uptimehr = uptimemin / 60;
    int uptimeday = uptimehr / 24;

    uptimesec %= 60;
    uptimemin %= 60;
    uptimehr %= 24;

    snprintf(tempStrBuff, sizeof(tempStrBuff), “%d Days, %02d:%02d:%02d”, uptimeday, uptimehr, uptimemin, uptimesec );
    return tempStrBuff;
    }
    void loop() {
    if (blink.expired())
    {
    Serial.println((const char *)upTimeStr);
    blink.set(1000);
    }
    }

    Ale bez výsledku. Co zase dělám špatně? A nedává snprintf nul znak až na pozici danou délkou řetězce?
    Děkuji

    1. Dobrý den,
      snprintf na rozdíl od sprintf jen hlídá, aby výsledný řetězec nepřekročil zadanou velikost. Ukončovací 0 se ukládá normálně za konec řetězce. V kódu je jeden potenciální zádrhel – zatímco u ESP8266, kde jsem funkci použil má proměnná typu int 32 bitů, tak v běžném Arduinu UNO/Nano (AVR platforma) má jen 16 bitů – bohužel nevím, na jaké platformě to používáte. Aby celá metoda byla obecně správně je třeba namísto int použít datový typ int32_t a s tím související změna formátovacího řetězce. Co Vám to vlastně vrátí za řetězec?

  10. Chtěl jsem to použít na arduinu. Ono to můžu předělat, ale zajímá mě, proč to nejede. Vrací nějaké jedno písmeno, něco jako mikro.

  11. Dear Sir,

    I am implementing the same code on the esp 8266 and I am using also the pubsubclient library. I have added the include stream into the pzem.h library because it showed a bug, and I updated to the 2.1.0 stable esp8266 Arduino but so far I have no luck connecting to it… I run this code on my esp8266, it connects to the mqtt broker and sends the values for the voltage, current etc. but they are the initial values set in the library and my esp cant connect and send and receive data through the RX, TX for some unknown reason. I spy on 9600 boud rate and I see that the esp transmits the setIP value to the pzem-004t but it does not get anything in response. I used the same circuit as described above, also my code is this

    #include “pzem.h”
    #include
    #include
    #include

    Pzem meter(Serial);
    Interval measure;
    // Update these with values suitable for your network.

    const char* ssid = “AUBGSetUpPPC”;
    const char* password = “0987654321”;
    const char* mqtt_server = “10.250.91.3”;

    WiFiClient espClient;
    PubSubClient client(espClient);
    long lastMsg = 0;
    char msg[50];
    int value = 0;

    void setup() {
    pinMode(3, INPUT_PULLUP); // RXD slouzi jako vstup tlacitka
    delay(10);
    int force = digitalRead(3);
    Serial.begin(9600);
    setup_wifi();
    client.setServer(mqtt_server, 1883);
    measure.set(3000);
    }

    void setup_wifi() {

    delay(10);
    // We start by connecting to a WiFi network
    WiFi.begin(ssid, password);

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

    void reconnect() {
    // Loop until we’re reconnected
    while (!client.connected()) {
    // Attempt to connect
    if (client.connect(“ESP8266Client”)) {
    // Once connected, publish an announcement…
    client.publish(“outTopic”, “hello world”);
    // … and resubscribe
    } else {
    // Wait 5 seconds before retrying
    delay(5000);
    }
    }
    }

    void readMeter(void)
    {
    float v = meter.getVoltage();
    client.publish(“voltage”, String(v).c_str());
    float c = meter.getCurrent();
    client.publish(“current”, String(c).c_str());
    float p = meter.getPower();
    client.publish(“power”, String(p).c_str());
    int32_t e = meter.getEnergy();
    client.publish(“energy”, String(e).c_str());
    }

    void loop() {
    if (!client.connected()) {
    reconnect();
    }
    client.loop();
    meter.poll();
    if (measure.expired()) {
    readMeter();
    measure.set(3000);
    }
    }

    Can you please try it in your configuration and tell me if there is a fault in the code or the pzem-004t is not working.
    Thank you in advance !

    1. Hi. I did some test on my PZEM. First of all You have to get to work setIP function. If there is no answer from PZEM then probably is damaged TXD from PZEM or CPU inside PZEM is dead.

  12. Zdravím,
    teď už ta SoftwareSerial ¨gam je, ale když zkouším jenom ten jejich příklad, akorát mám piny SoftwareSerial swSer(D1, D2, false, 128); a Serial.begin(9600); swSer.begin(9600)
    Tak to vypisuje :
    Soft WDT reset
    ctx: cont
    sp: 3ffefb60 end: 3ffefd80 offset: 01b0
    >>>stack>>>
    3ffefd10: 0000007b 00000000 3ffeed60 3ffeeca4
    3ffefd20: 00000001 3ffeeb84 40202a38 3ffeed60
    3ffefd30: 3ffe88bc feefeffe 3ffeeca4 3ffeeb84
    3ffefd40: 3ffeeca4 3ffeeca4 3ffeeb84 4020247f
    3ffefd50: 0000007b 3ffeeb84 0000007b 3ffeed58
    3ffefd60: 3fffdad0 00000000 3ffeed51 40202a84
    3ffefd70: feefeffe feefeffe 3ffeed60 40100958
    <<<stack<<<
    Ona asi ta knihovna nebude funkční?
    Chci to propojit s tím nr2483. Když bych použil hardware port, tak by se komunikace ovlivňovala?
    Děkuji

  13. Ahoj,
    super blog a kloubouk dolů před tím, co tu publikuješ.
    Potřeboval bych tvůj názor na realizaci tohoto projektu:

    cca 20 odběrních místa 230V je vybavena takto:
    – jedno odběrní místo může mít až 4 měřené zásuvky
    – každá zásuvka je osazena podružným měření el. energie s pulsním výstupem S0
    – každá zásuvka je zapojena přes stykač, který slouží k jejímu zapínání/vypínání

    Cíl:
    – načítat, uchovávat/kumulovat, odesílat pulsy S0 na vzdálený server
    – option: zobrazovat stav načtených pulsů (kumulativně, jako elektroměr) přes webový server
    – aktivní prvky (ESP8266) umístěné u jednotlivých odběrních míst jsou zároveň uzly sítě MESH – dovést internet ke vzdáleným odběrním místům by bylo problematické, ale jako MESH uzly jsou od sebe odběrní místa v rozumné vzdálenosti.
    – přes webové rozhraní nebo vzdáleným povelem je možno ovládat stykače jednotlivých zásuvek

    Co si o realizovatelnosti takovém projektu myslíš?
    Díky za odpověď a komentáře
    Petr

    1. Ahoj a díky. K tomu projektu:
      Jedno ESP a sledování 4 SO z elektroměrů je úplně v pohodě. Stykače bych ovládal přes HC595, protože ESP bude mít málo pinů. Trošku neznámá je ta MESH síť – já zatím neměl příležitost/důvod si s MESH pohrát a vím, že v implementaci v ESP jsou občas trošku potíže. Rozhodně to je zajímavý projekt. Prohledal jsem svůj Evernote na poznámky, který jsem si o ESP a MESH udělal a našel jsem tyto (třeba se budou hodit…):
      http://www.instructables.com/id/Simple-Arduino-Wireless-Mesh/
      https://github.com/jtfell/WiFiMesh-ESP8266 – tady mám poznámku “starší, možné problémy při překladu s novějším SDK”.
      http://www.esp8266.com/viewtopic.php?f=29&t=4718

      Pavel

  14. Díky za odpověď.
    Ty odkazy znám, ten první není s ESP8266 ale s APC220 + Arduino.

    Kolik GPIO pinů je tedy vlastně na ESP8266 k dispozici? Možná by mi stačilo načítat a ovládat jen 2 zásuvky (tedy 4 GPIO piny).

    Jakou verzi ESP8266 doporučuješ používat? Poslední, tj. ESP-12E?
    Petr

    1. Komerčně mám nasazené zařízení s ESP-07 a nyní s ESP-12 kvůli větší paměti flash a OTA. Možná by pro Tebe stálo za to se podívat po modulu ESP-14, který má v sobě “obyčejné” ESP a STM8 procesor – pokud vím, tak Cosmic C pro STM8 byl nedávno uvolněný v plné verzi (stahoval jsem si ho), ale nevím, jak je to s licencí pro komerční použití.
      S piny u ESP je to trošku složitější – v krátkosti:
      Volně použitelné jsou piny GPIO4, 5, 14, 12, 13. Můžeš použít i GPIO16, ale přijdeš o možnost probouzení z deepsleep. GPIO0, 2 a 15 se dají prakticky použít pouze pro výstupy s tím, že Ti nevadí, že při startu musí mít definované úrovně a GPIO0 navíc slouží pro vynucení flash režimu (pokud nepoužíváš OTA). RXD se dá částečně použít jako vstupní pin a TXD jako výstupní (snad) také, ale musíš vypnout servisní hlášení a nevím, jak se to zachová při pádu aplikace (dump registrů a zásobníku).

  15. Hi, Sorry for writing in English,

    I really liked your project! I am planning to use the PZEM-004T with a ESP8266 as well. But in my case, I want to install the sensor in my electrical cabinet, so I wanted to use a split core current transformer instead, Do you know if this is possible?

    1. Hi,
      IMHO it can work. Unfortunately there is no information about used transformer in documetation I’ve got so You have to do some measurement to be able to get right transformer type.

  16. I need the header files interval.h and espnbns.h the code is not compiling.

  17. Great stuff !

    I was able to get it to work through MQTT.

    a question, how did you power the ESP8266 ? i tried powering it from the PZEM004T +5v but voltage drops.

    i was wondering if you are using a battery or powering it through another power supply ?

    Cheers !

    ======

    Skvělé věci !

    Byl jsem schopen dostat se do práce přes MQTT.

      otázka, jak jste napájet ESP8266? Zkoušel jsem pohánět jej z PZEM004T + 5V, ale poklesy napětí.

    Napadlo mě, jestli používáte baterie nebo pohánět jej přes jiný zdroj napájení?

    Na zdraví!

    1. Thank You.
      +5V power from PZEM is rated @50mA so its definitely not enough for ESP8266. You have to use separate power supply for Wemos/Witty/NodeMCU/ESP…

  18. Hello,
    I have some questions but I can only read and write English.
    Would it be possible to monitoring the wattage and automatich switch on a relay when a certain threshold is above (for example) 1200 Watt ?
    Thanks

    1. Hi,
      to obtain this You have to periodically read Active power (B2/A2 request/response) and do some simple comparison with Your required value…

  19. hi, I have this module with usb to serial converter but I’m unable to communicate with it.
    Can you help me?
    If I try to execute command with Putty I’m unable to see anithing on terminal console.

    Thanks in advance

    1. The module uses binary protocol so putty is probably useless. If you have terminal software capable to send and read (visualize) binary data, then you can try this:
      1. send 0xB4, 0xC0, 0xA8, 0x01, 0x02, 0x00, 0x1F to the module (set address command)
      2. send 0xB0, 0xC0, 0xA8, 0x01, 0x02, 0x00, 0x1B to the module (get voltage command) – module should answer with binary packet, representing actual voltage

  20. Ahoj,
    hodne dobra desticka za 2USD na tyhle mereni je tohle: http://www.ebay.com/itm/ADS1015-12-Bit-Analog-to-Digital-Development-Board-ADC-Converter-for-Arduino-/172327613098

    12bit AD se ctyrmi samostatnymi vstupy, nebo dvema rozdilovymi. Bonus je az 16x programovatelny zesilovac – cili neni problem merit extremne male proudy na odporu treba 0.01R. Vyzkouseno a oproti hallum je to daleko presnejsi a bez ruseni.

    Na co si dat bacha (a zvlast u Hall senzoru) je napajeni – dobre filtrovat a stabilizovat.

    A pouzivam jeste softwarovej filtr ve smyslu ze nacitam deset hodnot do pole, z nich tri nejvyssi a tri nejnizsi ignoruju a ze zbytku pocitam prumer – ale to by nebylo moc pouzitelne na extremne kratke proudove pulzy – ja to mam na nabijecku Li-Ionek a tam to neva 🙂

  21. tak jsem kecal, pouzivam ADS1115ky coz je 16bit
    http://www.ebay.com/itm/16-Bit-I2C-ADS1115-Module-ADC-4-channel-with-Pro-Gain-Amplifier-for-Arduino-RPi-/400985244934

    ADC Bit rate: 16 Bit
    Interface Type: I2C
    Channels: 4 Channel AN0 AN1 AN2 AN3 or 2 differential inputs
    Input voltage: 2.0-5.5v
    Channel input voltage :0-VDD
    Continuous Mode: Only 150μA
    Single-Shot Mode: Auto Shut-Down
    PROGRAMMABLE DATA RATE:8sps-860sps
    Input range programmed control, 7 types input ranges:
    -0.256V ~ + 0.256V, -0.512V ~ + 0.512V, -1.024V ~ + 1.024V,
    -2.048V ~ + 2.048V, -4.096V ~ + 4.096 V, -6.144V ~ + 6.144V
    I2C 7-bit addresses between 0x48-0x4B
    Size:18mm*28mm

  22. Zdravím,
    mám tento modul, došel bez dokumentace = PZEM-004T v1.0.
    Předpokládal jsem, že to odesílá v intervalech hodnotu proudu, ale začínám tušit, že je potřeba i něco do něj poslat. Nikde jsem nenašel ani parametry sériové komunikace.
    Můžeš prosím objasnit alespoň ty základní věci ohledně vyčtení hodnoty proudu? Převodník mám osvědčený TTL na USB do W10 a vlastní terminál. Děkuji předem.
    Petr

  23. Zdravím,
    na tuto dokumentaci jsem již při hledání narazil, ale moc jsem z toho moudrý nebyl neboť stále řeším:
    1-vstup cívky nemá na PCB žádný zatěžovací odpor, což je dost neobvyklé, většinou odpor bývá tak 100 ohm. Nebo mám vadnou desku.
    2-ve všech příkladech vzorového SW se mi tam motá ta WIFI část SW, popř. se tam objevuje IP adresa, což mi u komunikace přes COM moc nepasuje. Existuje demo pro čistou TTL COM komunikaci?
    3-rychlost bude 9600, to je OK i když v nějakých verzích vzorových .ino se objevuje 115200. Ta rychlost je ale asi na pevno v CPU na PCB nebo ne? Takže měnit asi nepůjde, že?
    Dík za pomoc.
    Petr

    1. ad 1 – vzhledem k rozsahu měřeného proudu bych dost pochyboval, že odpor k měřícímu trafu bude tak malý. V poznámkách mám, že měřící IC je SD3004 a dle jeho datasheetu je proudové trafo vázáno přes 2x 1k odpor v sérii s kapacitním filtrem.
      ad 2 – WiFi část se do komunikace s PZEM neplete vůbec – vše je odděleno v knihovně pzem.cpp – v konstruktoru se napojí komunikace a nastaví počáteční parametry a pak se jen volá .poll(), která tiká stavovým automatem přesně dle dokumentace k protokolu. Ta IP adresa je ve skutečnosti jen pojem trošku zmateně zavedený výrobcem – ve skutečnosti jde o adresu modulu PZEM pro případ, kdy by byl připojený na sběrnici např. typu RS485 (víc PZEM na jednom drátu).
      ad 3 – ano, co jsem viděl, tak rychlost je napevno 9600
      Není zač 🙂
      Pavel

  24. OK,
    datasheet jsem našel, je to tak, jak říkáš. Na vstupu je odporová soustava s kondenzátory. To bylo alespoň pro mě dost neobvyklé (stará škola). Všechny trafa, co jsem doposud viděl, byly zatěžovány malým odporem a následoval operační zesilovač pro zesílení malého signálu. Zřejmě nastala jiná doba a jiné principy. Tak to je tedy vyřešené. Děkuji.
    Ten hlavní problém ovšem (pro mě) zůstává a to je komunikace po TTL. Oddělit wifi od rozhraní je maličkost pro znalého, ale pro někoho, kdo se tak nevyzná a navíc řeší úplně něco jiného (pomocí tohoto modulu) to už taková maličkost není.
    Byla by prosím nějaká možnost osekat ten SW do stavu, kdy komunikuje pouze PC přes převodník USB – TTL s modulem? Hodně by to pomohlo při oživování, popř. při otestování funkce modulu. Nebo alespoň popsat trochu komunikaci pomocí připojeného hyperterminálu ve Windows.
    Děkuji.
    Petr

    1. Ale vždyť ten protokol je zdokumentovaný celkem dobře a knihovnu jsem přiložil. Prostě komunikace začne tím, že se pošle SETADDRESS ({0xB4, 0xC0, 0xA8, 0x01, 0x02, 0x00, 0x1F}), pak se chvíli počká a čtou se jednotlivé hodnoty (GETVOLTAGE, GETCURRENT, GETPOWER, GETENERGY), mezi kterýma se zase chvíli čeká. Pokud modul neodpoví v časovém limitu, tak se zase pošle SETADDRESS a vše se opakuje. Pro oživení/testování komunikace v PC doporučuji skript v Pythonu (rychle a snadno se s tím dělá), např. odsud https://www.raspberrypi.org/forums/viewtopic.php?t=124958&p=923897 – akorát je třeba opravit číslo portu pro správný převodník…

  25. Kdyby to bylo tak jednoduché, neptám se.
    Je prosím možné poslat kousek xxx.ino pro Arduino UNO nebo mega se vzorkem dotaz, odpověď? A takové, které lze zkompilovat bez chyb? Pár jsem jich našel a zkusil a všechny se zastaví a na některém řádku mají problém, jehož detekce zabere spoustu času.
    Děkuji, Petr

    1. Kdyby to opravdu nebylo tak jednoduché, tak tak neodpovídám. Jen to chce věnovat čas studiu a aspoň to zkusit – v případě konkrétní chyby se pak dá diskutovat nad konkrétním problémem a jeho řešením. Také jsem zaneprázdněný člověk a, minimálně do poloviny ledna, nebudu mít prostor k tomu, abych vytahoval zabudovaný modul PZEM, připojoval ho k Arduinu a vyráběl extra příklad… Pokud to pak ještě bude aktuální, dej vědět.

  26. Dobrý deň.
    Nedarí sa mi rozbehať sériovú komunikáciu ESP 12 s arduino mega. Na ESP mám arduino core 2.3.0 a IDE 1.6.5. Používam obojsmerný prevodník 5V3.3V s obvodom TXS0108E.
    Ak pripojím ESP k pc tak prenos funguje skvele, ale po pripojení k arduino mega RX1, TX1 dĺžka znakov je v poriadku ale znaky sú úplné nezmysly napr. ˙Űß˙nnżűwß.
    Prijaté znaky potom zobrazujem na Serial monitore. Skúšal som zmeniť rýchlosť z 115200 na 9600 na obidvoch zariadeniach ale stále to iste. Na ESP som skúšal posielať dáta pomocou knižnice SoftwareSerial, ktoré tiež pekne posiela do pc ale arduino akoby ich nevedelo prečítať v správnom tvare. Už fakt neviem v čom môže byť problém.
    Vopred ďakujem za prípadnú radu.
    Jozef

      1. Nevedel som kde to môžem zaradiť a keďže v tomto článku tiež využívate sériovú komunikáciu, tak som to napísal sem.

        1. A proč jste nepoužil kontaktní mail? Ach jo 🙁 … no nic, takže k dotazu:
          1. bez měření není vědění – kontroloval jste signály osciloskopem?
          2. máte TXS správně zapojený? (5V na straně B, 3V3 na straně A)
          3. zkusil jste dočasně TXS vyřadit a do RXD a TXD vložit pouze ochranné odpory cca 200 ohmů? (pro ověření, že není chyba v TXS)
          4. máte na straně Megy vyprázdnění přijímače? (ESP po resetu vždy vychrlí nějaké výpisy rychlostí 78800Bd) – tohle platí pouze v případě, že využíváte HW sériový port

          1. Ďakujem za rady a ospravedlňujem sa…
            1. Bohuzial osciloskop nemam k dispozicii
            2. je to tak zapojene ako ste napisali
            3. to som ešte neskusal, kedze data z TXS do pc prichádzaju v poriadku, ale vyskusam aj toto
            4. momentalne nevyuzivam HW seriovy port ale port na vystupoch GPIO14 a 12

          2. Ok, takže:
            ad 1. Pokud máte další Arduino, tak se jednoduchý osciloskop, který by dokázal zobrazit 9600Bd dá napsat do něj – ale to až v případě krajní nouze
            Udělejte prosím následující:
            1. Výstup z ESP (jeho TXD) připojte přes ochranný odpor cca 200 ohmů do RXD Megy
            2. Upravte skript v ESP tak, aby periodicky vysílal písmeno U (0x55) – jde o střídající se jedničky a nuly
            3. Vyzkoušejte, co přijímá Mega

    1. Super. Akorát se v tom teď trošku ztrácím – pro správnou komunikaci by měly být signály překříženy TXD->RXD, RXD->TXD, ale možná jsem to jen špatně pochopil – hlavně, že to běží…

Komentáře nejsou povoleny.