Elektromer z arduina

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Elektromer z arduina

Příspěvek od Kony » 03 zář 2020, 11:55

Kód: Vybrat vše

#include <ESP8266WiFi.h>
#include <SPI.h>
#define BUFF_DELKA 255

const char* ssid = "Kony";
const char* password = "heslo";
char server[] = "server.eu"; //URL adresa serveru
char buffer[BUFF_DELKA]; //zásobník na příchozí řetězec
const int analogIn = A0;
int konstanta = 50;

WiFiClient client;

// Promenna s HTTP pozadavkem z prohlizece
String request;

void setup() {
 // Nastartuj seriovou linku, do ktere budu vypisovat provozni informace
 Serial.begin(9600);
  pinMode(D1, OUTPUT);
  pinMode(analogIn, INPUT);

 // Pripojeni k Wi-Fi
 Serial.println();
 Serial.print("Pripojuji k ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);

 // Dokud nejsem pripojeny k Wi-Fi,zapisuj do seriove linky tecky progressbaru
 while (WiFi.status() != WL_CONNECTED) {
 delay(100);
 Serial.print(".");
 }

 // Jsem pripojeny k Wi-Fi a mohu pokracovat
 Serial.println();
 Serial.println("WiFi pripojena!");
}

// Smycka loop se opakuje stale dokola
void loop() {
    // proměnné pro výpočty proudu
     double napeti = 0;
     double napetiRMS = 0;
     double proudRMS = 0;
      napeti = zmerVpp();
      // přepočet napětí na proud
      napetiRMS = (napeti/2.0) *0.707; 
      proudRMS = (napetiRMS * 1000)/konstanta;
      // výpis výsledku na 3 desetinná místa
      Serial.print("Proud: ");
      Serial.print(proudRMS,3);
      Serial.println(" A");
      Serial.print("Odber: ");
      Serial.print((proudRMS*235)-7);
      Serial.println(" W");
     if(client.connect(server, 80)){
        delay(1000);
        client.print("GET http://server/logger_3D.php?spotreba=");
        client.println((proudRMS*235)-7);
        client.println("Host: server.eu");
        client.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        client.println("Connection: close");
        client.println();
        delay(1000);
     client.stop();
     }
    if(client.connect(server, 80)){
        delay(1000);
        client.println("GET http://server/3Dzasuvka.php");
        client.println("Host: server.eu");
        client.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        client.println("Connection: close");
        client.println();
        delay(1000);

        int inBuffer = 0;

        for(int i = 0; i < BUFF_DELKA; i++){ //vyprázdní buffer
            buffer[i] = '\\0'; //nastaví všechny prvky buffer na znak konce řetězce
        }
        
        while(client.available()){
            buffer[inBuffer] = client.read();    
            inBuffer++;
        }
        
        if(inBuffer == 12){
            if(buffer[0] == '3' && buffer[1] == 'D' && buffer[2] == 'z' && buffer[3] == 'a' && buffer[4] == 's' && buffer[5] == 'u' && buffer[6] == 'v' && buffer[7] == 'k' && buffer[8] == 'a'){
                if(buffer[10] == '1'){
                    digitalWrite(D1, HIGH);
                }
                else{
                    digitalWrite(D1, LOW);
                }
            }
        }
        client.stop();
    
    }
    Serial.println(buffer[10]);
    delay(120000);
}
float zmerVpp()
{
  // proměnné pro měření
  float vysl;
  int napAng;
  int maximum = 0;
  int minimum = 1023;

  unsigned long mezicas = millis();
  // opakování měření po dobu 1 vteřiny
  while((millis()-mezicas) < 1000)
  {
    // načtení hodnoty analogového vstupu
    napAng = analogRead(analogIn);
    // hledání maxima
    if (napAng > maximum) 
    {
      maximum = napAng;
    }
    // hledání minima
    if (napAng < minimum) 
    {
      minimum = napAng;
    }
  }
  // přepočet hodnoty analogového vstupu na napětí
  vysl = ((maximum - minimum) * 20.0)/1023.0;
  return vysl;
 }

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Elektromer z arduina

Příspěvek od ondraN » 03 zář 2020, 13:02

A máš ten výstup ze senzoru usměrněný? Měl by na něm být signál úměrný procházejícímu proudu, tj. střídavý cca 50Hz.

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Elektromer z arduina

Příspěvek od Kony » 03 zář 2020, 13:05

aha tak to nevím... :)))) to poznám jak ? nebo spíš jak to udělám ?

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Elektromer z arduina

Příspěvek od ondraN » 03 zář 2020, 13:11

Stana 12, obrázek Application 4.
A ještě při výpočtu nezapomeň, že pro proud 0A je výstupní napětí rovno polovině napájecího.
Přílohy
ACS712-Datasheet.pdf
(934.83 KiB) Staženo 131 x

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Elektromer z arduina

Příspěvek od Kony » 03 zář 2020, 13:28

aha, tak to vubec nechapu :))))
vubec nemam tuseni co mam udelat

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Elektromer z arduina

Příspěvek od ondraN » 03 zář 2020, 13:45

Výstup z toho snímače zapojíš přes diodu v propustném směru. Výstup z diody (katoda) jde na analog. vstup arduina. Mezi ten vstup a zem zapoj kondenzátor 1M (jeden mikrofarad), plus k diodě. Paralelně s kondenzátorem dej rezistor cca 100k.
Pro nastavení, nech si vypsat hodnotu z AD převodníku, když neprochází žádný proud, tu potom musíš od změřéné hodnoty (přímo z převodníku) odečíst. než s ní začneš pracovat.

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Elektromer z arduina

Příspěvek od Kony » 03 zář 2020, 13:51

hodiš mi to do nakresu zapojeni ? Tak jak to popisujes si to nedokazu predstavit

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Elektromer z arduina

Příspěvek od ondraN » 03 zář 2020, 13:55

Večer.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Elektromer z arduina

Příspěvek od ondraN » 03 zář 2020, 20:25

díval jsem se detailněji na ten kód, a tam je to řešeno vzorkovánim a odečtem maxima a minima, takže usměrnění není třeba. Ale dost se mi nepozdávají ty výpočty

Kód: Vybrat vše

vysl = ((maximum - minimum) * 20.0)/1023.0;
  return vysl;
tady by mělo být správně (pokud je jako reference použito 5V

Kód: Vybrat vše

vysl = ((maximum - minimum) * 5.0)/1023.0;
  return vysl;
tohle je OK

Kód: Vybrat vše

      napetiRMS = (napeti/2.0) *0.707; 
tohle je nějaká kravina

Kód: Vybrat vše

proudRMS = (napetiRMS * 1000)/konstanta;
protože koeficient snímače (20A) je 0,1V/A
mělo by být

Kód: Vybrat vše

proudRMS = napetiRMS * 10.0;
a tady předpokládám, že tu 7 odečítáš, aby ti to bez zátěže ukazovalo 0

Kód: Vybrat vše

Serial.print((proudRMS*235)-7);

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Elektromer z arduina

Příspěvek od Kony » 03 zář 2020, 20:45

vysl = ((maximum - minimum) * 20.0)/1023.0;
return vysl;

Tu hodnotu 20 jsem upravil ja, aby se to priblizilo k aktualni zatezi...

proudRMS = (napetiRMS * 1000)/konstanta;
Kdyz se podivas na zacatek tak konstanta je 100c takze je to samy jak pises

Tech 7 odecitam abych se prave dostal na 0W bez zateze

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 16 hostů