Zapis hodnoty do DB

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.
pavel1tu
Příspěvky: 1772
Registrován: 26 říj 2017, 08:28
Reputation: 1
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Zapis hodnoty do DB

Příspěvek od pavel1tu » 24 zář 2020, 12:37

Když už ti to zapisuje jak má - vytvoř z toho "funkci" třeba void odesli();

Pak jen čekej na změnu toho PINu co hlídáš, klidně pomocí přerušení pokud chceš hrát o ms, ale přerušení umí jen některé piny.
Když v programu vyhodnotíš změnu PINu, zavoláš jen odesli(); a ono se to odesle.
Můžeš si to vytvořit i jako funkci, do které pošleš co se má odeslat:

Kód: Vybrat vše

void odesli(byte StavPinu, byte CislPinu, string TextUdalosti);
- toto je jen nástřel, udělat lze cokoliv

pak zavoláš

Kód: Vybrat vše

odesli(1,7,"Aktivace_pinu_7_do_HIGH");
tady si nejsem jistý uvozovkama

Pokud jsi zvládk odesílání, to ostatní už je banalita.
UNO, NANO, Mikro, PRO mini, DUE
Pavel1TU

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

Re: Zapis hodnoty do DB

Příspěvek od Kony » 24 zář 2020, 13:23

zkouším to .. ale pořád tápu jak t odát dokupy a do funkce, aby mi to odesílalo jen při změně

KamilV
Příspěvky: 314
Registrován: 03 dub 2018, 15:27
Reputation: 1
Bydliště: Olomouc

Re: Zapis hodnoty do DB

Příspěvek od KamilV » 24 zář 2020, 13:40

V posledním kódu od Tebe nevidím ani náznak, že bys to chtěl posílat jen při změně.
Nasměrování jsi už dostal.
Pošli kód, kde máš proměnnou, ve které si uchováváš poslední stav hlídaného pinu, kde testuješ, zda se ta hodnota změnila, kde si značíš do prom. nový stav pinu a odesíláš GET na server.

Napiš, co Ti na tom konkrétně nejde a rádi Tě popostrčíme dál.

Nebo si počkej na jiné členy fóra, kteří ti to napíšou :mrgreen: Já tento postup neuznávám, protože člověk se víc učí tím, že to sám objevuje.

pavel1tu
Příspěvky: 1772
Registrován: 26 říj 2017, 08:28
Reputation: 1
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Zapis hodnoty do DB

Příspěvek od pavel1tu » 24 zář 2020, 20:36

Nevím jestli to bude odesílat
zkombinoval jsem tvuj kod a nejaky kod od nekoho - to si opravis
zkompilovat to jde
nevim kde mas tlacitko a na co tam mas ten VYSTUP 4 - to tam nemam
nevim k cemu tam je reset1.php reset2.php - to tam nemam

Kód: Vybrat vše

// toto je nefunkcni KOSTRA programu jak by to mozna mohlo fungovat
// musis doplnit definice knihoven deklarace tvych promenych atd.

// nejake definice knihoven a promennych pokud mas
#include <SPI.h>
#include <UIPEthernet.h> // Used for Ethernet
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x78, 0xEE  };
unsigned long cas = 0;
// ********************************************
// ***************EDITACE *********************
// ********NUTNO DODRŽET ADRESU SOUBORU *******
// ********/reset1.php reset2.php *******
// ********************************************
// **** NASTAVENI SITE****
IPAddress ip(192, 168, 1, 82);      //IP ADRESA
IPAddress gateway(192, 168, 1, 1);  // VYCHOZI BRANA
IPAddress subnet(255, 255, 255, 0); // MASKA
IPAddress dnServer(8, 8, 4, 4);     // DNS
//int ID_MODULU = 2;
char serverName[] = "xxx.eu"; // webserver
// ********************************************
// ********************************************
// ********************************************
EthernetClient client;


#define BTN1 2           // tlacitko na vstupu 2 
#define ID_MODULU 2
byte PostedniStav = 0;   // posledni stav tlacitka

// seznam podprogramu - funkci
void OdesliZapnuto();                        // odeslat sepnuto
void OdesliVypnuto();                      // odeslat rozepnuto

void setup() {
  // nastaveni snimanych tlacitek
  pinMode(BTN1, INPUT_PULLUP);

  // dopln asi nastavení komunikace s LAn atd co mas v SETUP
  Serial.begin(9600);
  Ethernet.begin(mac, ip, dnServer, gateway, subnet);
  Serial.print("ip-");
  Serial.println( Ethernet.localIP());
  Serial.print("Subnet mask-");
  Serial.println( Ethernet.subnetMask());
  Serial.print("Gateway-");
  Serial.println( Ethernet.gatewayIP());
  Serial.print("DNS-");
  Serial.println( Ethernet.dnsServerIP());

}

void loop() {
  // tady muzes dat klidne zpozdeni aby se to nasledujici provadelo jen jednou za nejaky cas 
  // ale pak musis drzet stisknute tlacitko po tu dobu nez to odesla


  // kdyz je BTN1 LOW a naposledy byl HIGH
 if (digitalRead(BTN1) == LOW && PostedniStav == 1) 
    {
      OdesliVypnuto();
      PostedniStav = 0;
    }
   
   
   // kdyz je BTN1 HIGH a naposledy byl LOW
 if (digitalRead(BTN1) == HIGH && PostedniStav == 0) 
    {
      OdesliZapnuto();
      PostedniStav = 1;
    } 

}

// PODPROGRAMY - dopln tak aby byly funkcni, vzal jsem nejakou cast

void OdesliZapnuto() {
   if (client.connect(serverName, 80)) {
      client.print("GET /logger.php?text=Čidlo%20číslo%20");
      client.print(ID_MODULU);
      client.println("%20zapnuto");
      client.println("Host: xxx.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 (500);
      client.stop();
      }
   }

void OdesliVypnuto() {
  if (client.connect(serverName, 80)) {
      client.print("GET /logger.php?text=Čidlo%20číslo%20");
      client.print(ID_MODULU);
      client.println("%20vypnuto");
      client.println("Host: xxx.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 (500);
      client.stop();
      }
   }
UNO, NANO, Mikro, PRO mini, DUE
Pavel1TU

pavel1tu
Příspěvky: 1772
Registrován: 26 říj 2017, 08:28
Reputation: 1
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Zapis hodnoty do DB

Příspěvek od pavel1tu » 24 zář 2020, 21:06

Měli tě ostatní nasměrovat aby jsi vytvořil kod na detekci tlacitka - odkaz na příklad tu nikdo nedal
a třeba od toho rozsvítit LED

Jen skládáním kodu bez poznamek co co dělá se nic nenaučíš
UNO, NANO, Mikro, PRO mini, DUE
Pavel1TU

KamilV
Příspěvky: 314
Registrován: 03 dub 2018, 15:27
Reputation: 1
Bydliště: Olomouc

Re: Zapis hodnoty do DB

Příspěvek od KamilV » 24 zář 2020, 21:43

No to, Pavle, promiň, ale proč bychom mu měli posílat příklad s detekcí tlačítka, když tam žádné nemá a ani se o něm nezmiňuje? Proč vůbec někomu posílat příklady, které jsou každému k dispozici? Já teda od protistrany očekávám elementární součinnost a naopak si myslím, že jen kopírováním toho, co udělali jiní, se člověk mnoho nenaučí. Pak nevznikají programátoři, ale slepovači, kteří jen vykopírovávají kusy, kterým ani zcela nerozumí a ono to pak někdy funguje, někdy ne, někdy jen za určitých okolností...

Já tazatele sleduju i v jiných vláknech a troufám si tvrdit, že by k tomu sám došel.

pavel1tu
Příspěvky: 1772
Registrován: 26 říj 2017, 08:28
Reputation: 1
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Zapis hodnoty do DB

Příspěvek od pavel1tu » 25 zář 2020, 16:56

Tak to se omlouvám, už se do toh nebudu plést, ale sám vím že při "záseku" někdy pomůže mírné postrčení,
no, a mluví tam "od změny PINu", což jsem pochopil jako změnu "vstupu" na Arduinu - pokud špatně, tak se nedá nic dělat.

Já nejsem žádný excelentní programátor, jsem samouk, 50+, tak to dle toho často vypadá,
dost často nepochopím dotaz nebo něco pokud se do toho míchají AN výrazy a chybí popisky v kodu.

Tohle mu asi také nebude fungovat, třeba ho to ale nakopne správným směrem,
jde to udělat mnohem elegantněji - funkci "Odesli" volat už s parametry - tak uvidíme kam dojde.
UNO, NANO, Mikro, PRO mini, DUE
Pavel1TU

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

Re: Zapis hodnoty do DB

Příspěvek od Kony » 01 říj 2020, 09:32

Tak po dlouhé odmlce jsem se k tomu musel vrátit a hlásím plně funkční.... DĚKUJI

Kód: Vybrat vše

void OdesliZapnuto() {
   if (client.connect(serverName, 80)) {
      client.print("GET http://xxx.eu/logger.php?text=Cidlo%20cislo%20");
      client.print(ID_MODULU);
      client.println("%20zapnuto");
      client.println("Host: xxx.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 (500);
      client.stop();
      }
   }

void OdesliVypnuto() {
  if (client.connect(serverName, 80)) {
      client.print("GET http://xxx.eu/logger.php?text=Cidlo%20cislo%20");
      client.print(ID_MODULU);
      client.println("%20vypnuto");
      client.println("Host: xxx.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 (500);
      client.stop();
      }
   }

// Smycka loop se opakuje stale dokola
void loop() {
if(client.connect(serverName, 80)){
        delay(1000);
        client.print("GET http://xxx.eu/reset");
        client.print(ID_MODULU);
        client.println(".php");
        client.println("Host: xxx.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(buffer[0] == '1' && PosledniStav == 0){
                    digitalWrite(D5, HIGH);
                    PosledniStav = 1;
                    OdesliZapnuto();
                    Serial.print("Posledni stav = ");
                    Serial.println(PosledniStav);
                }
                if(buffer[0] == '0' && PosledniStav == 1){
                    digitalWrite(D5, LOW);
                    PosledniStav = 0;
                    OdesliVypnuto();
                    Serial.print("Posledni stav = ");
                    Serial.println(PosledniStav);
                }
        client.stop();
    
    }
    Serial.println(buffer[0]);
    delay(1000);
}

KamilV
Příspěvky: 314
Registrován: 03 dub 2018, 15:27
Reputation: 1
Bydliště: Olomouc

Re: Zapis hodnoty do DB

Příspěvek od KamilV » 01 říj 2020, 10:41

Může být. Jen ještě tip k zamyšlení.
Funkce OdesliZapnuto() je velmi podobná s funkcí OdesliVypnuto(), resp. obsahuje hodně redundantního kódu, což nikdy není dobře. Představ si např., že se tě změní doména, nebo filename php skriptu, nebo GET parametry. Opravíš to ve funkci OdesliZapnuto(), ale na funkci OdesliVypnuto() zapomeneš, nebo ji přehlédneš.

Velmi snadno bys mohl mít jen funkci Odesli(bool Zapnuto):

Kód: Vybrat vše

void Odesli(bool Zapnuto) {
   if (client.connect(serverName, 80)) {
      client.print("GET http://xxx.eu/logger.php?text=Cidlo%20cislo%20");
      client.print(ID_MODULU);
      if (Zapnuto) {
          client.println("%20zapnuto");
      } else {
          client.println("%20vypnuto");
      }
      client.println("Host: xxx.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 (500);
      client.stop();
      }
   }
V loopu pak při detekci zapnutí budeš volat:

Kód: Vybrat vše

Odesli(true);
a při detekci vypnutí:

Kód: Vybrat vše

Odesli(false);
Dalším krokem by pak mohlo být, že funkce nebude znát jen tyto 2 fixní stavy, ale bude mít jako argument pointer na char a předáš jí vždy text, který chceš zalogovat...

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

Re: Zapis hodnoty do DB

Příspěvek od Kony » 01 říj 2020, 12:00

Ale i to moje řešení je plně dostačující

Odpovědět

Kdo je online

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