Stránka 1 z 1

Ethernet a posielanie dat

Napsal: 02 srp 2019, 22:22
od dzooky
Ahojte

Mam jedno arduino ktore meria napatia zdroja a zalozneho zdroja, a posiela to do DB
Inspiroval som sa https://www.tweaking4all.com/hardware/a ... data-push/

Stacilo by mi ak data posle raz za minutu ale nefunguje to
Ked skratim interval napr na 10s na posielanie funguje to
Akosi nejde mi to dohlavy preco.

Kód: Vybrat vše

#include <UIPEthernet.h>                                        //ENC28J60

#define Z12             A0
#define B12             A1
#define Z5              A2
#define B5              A3

//hodnoty napati
float b12;
float z12;
float b5;
float z5;
float analog_value;

//hodnoty pouzitych rezistorov
float R1 = 20000.0;
float R2 = 10000.0;
float R3 = 1000.0;
float R4 = 4700.0;

unsigned long last_record;
boolean napajanie;

 
//ENC28j60
byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0x01 };
EthernetClient client;
char server[] = "192.168.0.10";

void setup()
  {
    Serial.begin(9600);
    msgs(1,"**********************************");
    msgs(1,"Akcia: Nastavujem vstupne porty");
    pinMode(B12, INPUT);
    pinMode(B5, INPUT);
    pinMode(Z12, INPUT);
    pinMode(Z5, INPUT);

    msgs(1,"Akcia: Inicializujem ethernetovy modul");
    // start Ethernet and UDP
      Ethernet.begin(mac);
      if (Ethernet.begin(mac) == 0)
        {
          msgs(1,"Modul sa nepodarilo nakonfigurovat, nedostal IP");
          for(;;);
        }
    
    msgs(0,"Pridelena IP Addresa: ");
    Serial.println(Ethernet.localIP());
    msgs(1,"**********************************");
    last_record = millis();
  }

void loop()
  {
    nacitanie_napati();
   
    if (millis()-last_record > 10000)
      {
        posli_data();
        last_record = millis();
      }
    
  }
  
void nacitanie_napati()
  {
    //zistenie napatia zdroja
    analog_value = analogRead(Z12);
    z12 = (analog_value*5.0/1024.0)/(R2/(R1+R2));
  
    analog_value = analogRead(Z5);
    z5 = (analog_value*5.0/1024.0)/(R4/(R3+R4));  
    
    //zistenie napatia baterie
    analog_value = analogRead(B12);
    b12 = (analog_value*5.0/1024.0)/(R2/(R1+R2));
  
    analog_value = analogRead(B5);
    b5 = (analog_value*5.0/1024.0)/(R4/(R3+R4));    
  }

void vypis()
  {
    msgs(0,"Napatie zdroja: ");
    msgs(0,String(z12));
    msgs(0,"V/");
    msgs(0,String(z5));
    msgs(1,"V");
    
    msgs(0,"Napatie baterie: ");
    msgs(0,String(b12));
    msgs(0,"V/");
    msgs(0,String(b5));
    msgs(1,"V");
  }

void posli_data()
  {
    if (client.connect(server, 80))
      {
        // Make a HTTP request:
        client.print( "GET /monitoring/monitoring_power.php?");
        client.print("z12=");
        client.print(z12);
        client.print("&&");
        client.print("z5=");
        client.print(z5);
        client.print("&&");
        client.print("b12=");
        client.print(b12);
        client.print("&&");
        client.print("b5=");
        client.print(b5);
        client.println( " HTTP/1.1");
        client.print( "Host: " );
        client.println(server);
        client.println( "Connection: close" );
        client.println();
        client.println();
        client.stop();
      }
    else msgs(1,"SPOJENIE NEUSPESNE");
    
    last_record = millis();
    vypis();
  }

void msgs(boolean type, String msg)
  {
    if(type == 0) Serial.print(msg);
    if(type == 1) Serial.println(msg);
  }

Re: Ethernet a posielanie dat

Napsal: 03 srp 2019, 08:49
od pavel1tu
Docela se vyžíváš v podprogramech - pěkné ...

Nepíšeš co to vypíše když to nefunguje - asi nic ?
Pokud to nepíše "SPOJENIE NEUSPESNE", v první řadě bych dal před client.stop(); nějaký delay - začni na 1s a snižuj - to mi blbne nejčastěji, mívám tam od 100 do 250 ms (záleží na kvalitě spojení a rychlosti ukládání do databáze)

Jinak nevidím důvod proč by to nechodilo s delším časem - pokud jsi se nespletl o nulu a je to 10min.

PS: milis() je super, ale koukni na knihovnu <TaskScheduler.h> - pokud někde dělám něco za nějakou dobu (a nemusí se to spouštět od přerušení - to mu moc nechodilo, ale možná to opravil), je to super a má to mnohem více možností než popisuji :-)

PS2: ten last_record = millis(); tam máš 2x , ale asi to nevadí- vyzkoušej ho nechat jen tam, kde se opravdu odešlou data a ne že se jen pokusí je odeslat ....

Re: Ethernet a posielanie dat

Napsal: 03 srp 2019, 22:26
od dzooky
Ahoj

No skusal som casovu slucku 60000 zmenit na 6000.
Pri 6000 to bavi pri 60000 nie.

Pri 60000 nic nevypisuje, ako keby to ani nevolalo alebo tak nejako.
Povodny zdrojak ma po podmienke IF ked ide posielat vypise connected tak mi to aj vypise ale nic nezrobi..
Ked zmenim v zdrojaku php skript co ma volat cekujem log na serveri tam tiez nic nevypisuje.
Ako keby to ani nevolalo

Re: Ethernet a posielanie dat

Napsal: 03 srp 2019, 22:54
od martinius96
Síce som s tou knižnicou ani tými modulmi nerobil (Som Wiznetista :D W5100, W5500), ale myslím si, že ten softvérový stack ti "spadne". Ak je to dlhšie ako pár sekúnd v nečinnosti.
Tým, že máš tie slučky krátke, tak sa to drží akoby keep-alive. Ale problém nastane po čase nečinnosti. Schválne si skús pred tým pripojením vypísať IP adresu cez Ethernet.localIP(). Prípadne to použi s podmienkou if (Ethernet.begin(mac) == 0) a skús nastaviť vlastnú MAC + IP vždy, keď je táto podmienka splnená a verím, že ti to bude fachať. ;)

Re: Ethernet a posielanie dat

Napsal: 04 srp 2019, 10:02
od pavel1tu
Tu desku nemám,
ani nepíšeš jaké máš Arduino,

vyzkoušel jsi tam dát to DELAY jak jsem psal ?

Mne to funguje, ale musel jsem to upravit na jiný shield, knihovnu, atd. + mám těch delay(200) před odpojením komunikace

V pohodě odesílám Ubatt,Usolar,Presure,Humidity, Temperature na místní SQL běžící na BananaPi

Re: Ethernet a posielanie dat

Napsal: 04 srp 2019, 21:36
od dzooky
martinius96 v pohode vzdy to ma IP adresu
pavel1tu mam UNO, dal som tam ten delay, 250 bavi super dik

Re: Ethernet a posielanie dat

Napsal: 05 srp 2019, 15:12
od pavel1tu
Tvé kody jsou velmi "nestandartní", typu něco jsem někde zkopíroval a ejhle ono to chodí/nechodí....

Viz:

Kód: Vybrat vše

//ENC28j60
byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0x01 };
EthernetClient client;
char server[] = "192.168.0.10";  //nemá nic společného s nastavením síťové karty - je to adresa serveru kam asi ukládáš data
kartu nastavuješ jako klienta a definuješ nějakou IP adresu serveru ?

dále

Kód: Vybrat vše

    // start Ethernet and UDP
      Ethernet.begin(mac);
žádné UDP, jen žádáš DHCP server o IP

za mne slátanina a jednou až budeš něco hledat co která část dělá - se ti to vrátí

Re: Ethernet a posielanie dat

Napsal: 07 srp 2019, 19:34
od dzooky
No hlavne ze tomu rozumiem ja nie :D
pavel1tu píše:
05 srp 2019, 15:12
kartu nastavuješ jako klienta a definuješ nějakou IP adresu serveru ?
Co je na tom nezrozumitelne?
Pre mna jasne ako facka.
Arduino je klient a data kde sa data posielaju je server.
Teda adresara 192.168.0.10 je ip adresa mojho servera (raspberry) kam tlaci data.
A arduino/klient dostane IP od DHCP teda vsetci dostanu.

pavel1tu píše:
05 srp 2019, 15:12
dále

Kód: Vybrat vše

    // start Ethernet and UDP
      Ethernet.begin(mac);
žádné UDP, jen žádáš DHCP server o IP

za mne slátanina a jednou až budeš něco hledat co která část dělá - se ti to vrátí
Tak je to na tej stranke odkial som cerpal a ktoru si mi posunul mimichodom ty len ja to mam prerobene na DHCP nie staticky.