Stránka 1 z 1

Sledování zatížení elektromotorů a vizualizace dat

Napsal: 23 bře 2020, 11:56
od vertol
Přátelé,
jsem začátečník a potřeboval bych pomoci se svým projektem na sledování zatížení elektromotorů a vizualizaci měřených dat.

Deska: Robotdyn Uno + Wifi R3 https://robotdyn.com/uno-wifi-r3-atmega ... o-usb.html
Měření: nepřímé měření pomocí měřicích transformátorů (CT), s využitím projektu https://learn.openenergymonitor.org/ele ... gy-monitor
Vizualizace: "semafor" na zařízení u stroje + vizualizace výkonu v Home assistant

Měřicí část + semaforová vizualizace je hotová a funkční, později sem přidám kód na ukázku a pokud bude zájem, tak i skutečné foto realizace.
Měří se zatížení 4 motorů, které je reprezentováno hodnotami proudu, který je cca sekundových intervalech ukládán do proměnných proud1, proud2,proud3, proud4.

Nyní bych potřeboval pomoci s přenosem dat do Home assistanta přes MQTT, toto je již přesahuje moje bastlířské schopnosti.
Oba kontrolery na desce mají propojeny RX/TX, takže není nutno žádných propojení (jen se tato funkce naswitchuje na přepínači na desce).

Dál mám jen teorii a hromadu neúspěšných pokusů podle návodů z netu. Mám několik úvah, jak přenos dat řešit:

1. Data z Atmegy se po seriové lince přenesou do ESP, kde bude běžet MQTT klient, který pošle data na Mosquitto broker v Home assistantovi.
2. Celý sketch vč. MQTT bude v ATMega, která bude ovládat ESP pomocí AT příkazů
3. Do ESP flashnu Tasmotu a ta si vytáhne data ze seriové linky a pošle je přes vestavěného MQTT klienta do HA.

Co jsem zkoušel:
ad 1: splácal jsem nějaké sketche i internetu, ale nerozchodil jsem seriovou komunikaci, jen jsem adaptoval jiné kódy, protože nerozumím syntaxi kódu pro přenos po seriové lince. Podařilo se mi nastavit MQTT klienta a poslat testovací zprávu do HA.
ad 2: nezkoušel jsem, nerozumím tomu, ale na fórech jsem našel, že je to patrně nejjednodušší řešení. Vyžaduje nahrát AT firmware do ESP.
ad 3: můj nápad, nikde jsme nenašel, že by to takto někdo řešil, samotný přenos dat mezi ATMega a Tasmotou funguje, jen se přenáší jako text a je potřeba v Tasmotě nakonfigurovat formát MQTT zprávy. Tasmota je fajn, protože vše lze nastavit přes webové rozhraní a s Home assistantem funguje perfektně.

Pomůže někdo? Moc děkuji.

Re: Sledování zatížení elektromotorů a vizualizace dat

Napsal: 23 bře 2020, 16:49
od vertol
Tady je měřicí sketch pro ATMegu:

Kód: Vybrat vše


#include "EmonLib.h"
#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>

// display 

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0); 

// variables setup

float proud1;
float proud2;
float proud3;
float proud4;

// LED warning light parameters setting

float nocurrent = 0.1;    
float lowcurrent = 0.15;  
float highcurrent = 0.25;


// Include Emon Library
EnergyMonitor emon1;
EnergyMonitor emon2;
EnergyMonitor emon3;
EnergyMonitor emon4;

// Create an instance
#define RELE1_PIN 8
#define RELE2_PIN 9
#define RELE3_PIN 10
#define RELE4_PIN 11

void setup()
{
  Serial.begin(115200);     
    while (!Serial)   { ; }  
  
  u8g2.begin();
  
  pinMode(RELE1_PIN, OUTPUT);           // red
  pinMode(RELE2_PIN, OUTPUT);           //orange
  pinMode(RELE3_PIN, OUTPUT);           //green
  pinMode(RELE4_PIN, OUTPUT);           //buzzer
  emon1.current(A0,30);             // Current: input pin, calibration.
  emon2.current(A1,30);             // Current: input pin, calibration.
  emon3.current(A2,30);             // Current: input pin, calibration.
  emon4.current(A3,30);             // Current: input pin, calibration.
}

void loop()
{

// 
   
double Irms1 = emon1.calcIrms(1674);  // Calculate Irms only (1674... n/50*5580.. orig 1480)
double Irms2 = emon2.calcIrms(1674);  // Calculate Irms only (1674... n/50*5580.. orig 1480)
double Irms3 = emon3.calcIrms(1674);  // Calculate Irms only (1674... n/50*5580.. orig 1480)
double Irms4 = emon4.calcIrms(1674);  // Calculate Irms only (1674... n/50*5580.. orig 1480)

proud1 = Irms1;
proud2 = Irms2;
proud3 = Irms3;
proud4 = Irms4;

Serial.print("Motor 1:");
Serial.print(proud1);             // Irms1
Serial.println(" A"); 
Serial.print("Motor 2:");
Serial.print(proud2);             // Irms2
Serial.println(" A"); 
Serial.print("Motor 3:");
Serial.print(proud3);             // Irms3
Serial.println(" A"); 
Serial.print("Motor 4:");
Serial.print(proud4);           // Irms4
Serial.println(" A"); 
Serial.println("-----------------------------------"); 
  
// u8g2.clearBuffer();          // clear the internal memory
// u8g2.setFont(u8g2_font_logisoso28_tr);  // choose a suitable font at https://github.com/olikraus/u8g2/wiki/fntlistall
// u8g2.drawStr(8,29,"Irms=");  // write something to the internal memory
// u8g2.sendBuffer();         // transfer internal memory to the display
//delay(1000);

 u8g2.clearBuffer();          // clear the internal memory
 u8g2.setFont(u8g2_font_logisoso22_tr);  // choose a suitable font at https://github.com/olikraus/u8g2/wiki/fntlistall
 u8g2.setCursor(8, 29);
 u8g2.print("K1:");
 u8g2.print(proud1);
 u8g2.print(" A");
 u8g2.sendBuffer();
 delay (500);
 
 u8g2.clearBuffer();          // clear the internal memory
 u8g2.setFont(u8g2_font_logisoso22_tr);  // choose a suitable font at https://github.com/olikraus/u8g2/wiki/fntlistall
 u8g2.setCursor(8, 29);
 u8g2.print("K2:");
 u8g2.print(proud2);
 u8g2.print(" A");
 u8g2.sendBuffer();
 delay (500);

 u8g2.clearBuffer();          // clear the internal memory
 u8g2.setFont(u8g2_font_logisoso22_tr);  // choose a suitable font at https://github.com/olikraus/u8g2/wiki/fntlistall
 u8g2.setCursor(8, 29);
 u8g2.print("K3:");
 u8g2.print(proud3);
 u8g2.print(" A");
 u8g2.sendBuffer();
 delay (500);

 u8g2.clearBuffer();          // clear the internal memory
 u8g2.setFont(u8g2_font_logisoso22_tr);  // choose a suitable font at https://github.com/olikraus/u8g2/wiki/fntlistall
 u8g2.setCursor(8, 29);
 u8g2.print("K4:");
 u8g2.print(proud4);
 u8g2.print(" A");
 u8g2.sendBuffer();
 delay (500);

// LED warning light control 

 if ((proud1 < nocurrent) or (proud2 < nocurrent) or (proud3 < nocurrent) or (proud4 < nocurrent))
  {
    digitalWrite(RELE1_PIN, HIGH);
    digitalWrite(RELE2_PIN, LOW);
    digitalWrite(RELE3_PIN, LOW);
    digitalWrite(RELE4_PIN, LOW);
    Serial.println(" červená"); 
  } 
     if ((lowcurrent > proud1 < highcurrent) or (lowcurrent > proud2 < highcurrent) or (lowcurrent > proud3 < highcurrent) or (lowcurrent > proud4 < highcurrent))
  {
   digitalWrite(RELE1_PIN, LOW);
    digitalWrite(RELE2_PIN, HIGH);
    digitalWrite(RELE3_PIN, LOW);
    digitalWrite(RELE4_PIN, HIGH);
    Serial.println(" oranžová"); 
  }

 if ((proud1 > highcurrent) or (proud2 > highcurrent) or (proud3 > highcurrent) or (proud4 > highcurrent))
  {
   digitalWrite(RELE1_PIN, LOW);
    digitalWrite(RELE2_PIN, LOW);
    digitalWrite(RELE3_PIN, HIGH);
    digitalWrite(RELE4_PIN, LOW);
    Serial.println(" zelená"); 
  }
 
 
}
Asi by to šlo trošku zjednodušit, zatím je to psané jak mi to přišlo pod ruku :-)

Re: Sledování zatížení elektromotorů a vizualizace dat

Napsal: 23 bře 2020, 20:26
od jankop
1. Data z Atmegy se po seriové lince přenesou do ESP, kde bude běžet MQTT klient, který pošle data na Mosquitto broker v Home assistantovi.
2. Celý sketch vč. MQTT bude v ATMega, která bude ovládat ESP pomocí AT příkazů
3. Do ESP flashnu Tasmotu a ta si vytáhne data ze seriové linky a pošle je přes vestavěného MQTT klienta do HA.
1. Klient MQTT bude v ESP
2. Klient MQTT bude v ATMega
3. Klient MQTT bude v ESP
Nač se vlastně ptáš, když jsi tak jasně a precizně formuloval své potřeby?

Re: Sledování zatížení elektromotorů a vizualizace dat

Napsal: 23 bře 2020, 20:51
od vertol
potřeby, nebo spíše úvahy jsem formuloval, to ano. Ale nejsem ani pro jednu sám schopen napsat program, v případě Tasmoty nastavit rules. Proto jsem žádal o radu zkušenější.

V první řadě bych rád doporučení, kterou cestou z 1-3 se vydat, má-li někdo praktické zkušenosti.
Následně pomoci se syntaxí sketche

Omlouvám se, pokud to z mého příspěvku nebylo zřejmé.

Re: Sledování zatížení elektromotorů a vizualizace dat

Napsal: 24 bře 2020, 17:31
od vertol
Poradí někdo?