Stránka 2 z 2

Re: Ovládání arduina přes web

Napsal: 10 srp 2019, 14:26
od Bart_
Ted mi to četlo cca půl hodiny ze stránky správně a pak toto:
13:36:22.118 -> Pripojene
13:36:27.126 -> Premenna je:
13:36:27.126 -> 20;5;30;5;1;1;0;25;75;1250;23;40;400;1;1;50;18;0;16;20
.
.
.
14:12:26.130 -> Pripojene
14:12:31.166 -> Premenna je:
14:12:31.166 -> 20;5;30;5;1;1;0;25;75;1250;23;40;400;1;1;50;18;0;16;20
14:12:36.172 -> Pripojene
14:12:42.178 -> Premenna je:
14:12:42.178 -> 20;5;30;5;1; ; ; 5!7!;!2!0!2!; 0!4 0!1!1!5 ;!8!0!1 ; 0
.
.
.
14:14:21.336 -> Pripojene
14:14:26.364 -> Premenna je:
14:14:26.364 -> 20;5;30;5;1;1 0!2!;!5!1 5 ; 3!4 ; 0 ;!;!;!0!1 ; ;!6!2
14:14:31.384 -> Pripojene
Cca po dvou minutách vypisování blábolů se arduino zaseklo a nevypisuje nic. Vůbec z toho nejsem moudrej, tohle přestává bejt věda..

Re: Ovládání arduina přes web

Napsal: 11 srp 2019, 22:01
od KamilV
Nevím pomocí čeho se připojuješ k serveru, máš nějaký ten Eth shield s SD kartou? Pokud tu kartu nevyužíváš, je (prý) lépe ji zakázat. Nevím z čeho ten poznatek pramení, někde jsem na to kdysi narazil a tak to tak používám. V setup() stačí mít:

Kód: Vybrat vše

pinMode(4,OUTPUT);
digitalWrite(4,HIGH);
Dále pak samotné čtení dat bych trochu upravil. Jednak by se serveru mohla hodit specifikace protokolu, dále pak bych četl z Eth bufferu až když bude uvolněný.

Kód: Vybrat vše

if (client.connect(serverName, 80)) {  
    Serial.println("connected");
    client.println("GET /ovladani.php HTTP/1.1");
    client.println("Host: 10.0.0.140");
    client.println("Connection: close");
    client.println();
  }
  else {
    Serial.println("connection failed"); 
    Serial.println();
  }

  while(client.connected() && !client.available()) delay(1);
  while (client.connected() || client.available()) { 
    char c = client.read(); 
    Serial.print(c); 
  }

  Serial.println();
  Serial.println("disconnecting.");
  Serial.println("==================");
  Serial.println();
  client.stop();
Pokud to ani tak nepůjde, tak bych se podíval na obsazení zbytku pinů, zda nemáš připojeno něco na pin, který je jinak využíván shieldem.
Nebo vyměnit board, nebo vyměnit shield.

Re: Ovládání arduina přes web

Napsal: 12 srp 2019, 15:04
od pavel1tu
KamilV píše:
11 srp 2019, 22:01
Nevím pomocí čeho se připojuješ k serveru, máš nějaký ten Eth shield s SD kartou? Pokud tu kartu nevyužíváš, je (prý) lépe ji zakázat. Nevím z čeho ten poznatek pramení, někde jsem na to kdysi narazil a tak to tak používám. V setup() stačí mít:

Kód: Vybrat vše

pinMode(4,OUTPUT);
digitalWrite(4,HIGH);
Ano, blbne to - ne když kartu nevyužíváš, ale když tam není zastrčená - bývají problémy.

Další problém tohoto shieldu a UNO je, že se dotýká plech od konektoru na LAN něčeho na UNO, já tam dal plastovou folii mazi to.

Re: Ovládání arduina přes web

Napsal: 12 srp 2019, 21:47
od Bart_
Ahoj, díky za tipy, zatím se zdá, že po přidání do PHP "charset=utf-8' " a nastavení digitálního pinu 4 na Ethernet shieldu na HIGH to jede :D zatím 40 min bez jediného záseku..
Kód arduino, kdyby se někomu hodil:

Kód: Vybrat vše

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xAA, 0xBB, 0xCC, 0x81, 0x7B, 0x4A }; //fyzicka adresa MAC
IPAddress serverName (10, 0, 0, 140); // webserver
IPAddress ip(10, 0, 0, 150);
EthernetClient client;
void setup() {
  Serial.begin(115200);
  if (Ethernet.begin(mac) == 0) {
    Serial.println("DHCP nepridelilo adresu, skusam so statickou...");
    Ethernet.begin(mac, ip);
  }
  else {
    Serial.println("pripojeni pres DHCP");
  }
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
}

void loop() {
  if (client.connect(serverName, 80)) {  //starts client connection, checks for connection
    Serial.println("Pripojene");
    client.println("GET /ovladani.php"); //download text
    client.println("Host: 10.0.0.140");
    client.println("Connection: close");
    client.println();
    /* while (client.connected()) {
       String hlavicka = client.readStringUntil('\n');
       Serial.println(hlavicka);
       if (hlavicka == "\r") {
         break;
       }
      }*/

    String premenna = client.readStringUntil('\n');
    delay(5000);
    Serial.println("Premenna je:");
    Serial.println(premenna);

    /* char ovladani [500];
      premenna.toCharArray(ovladani ,500);
      Serial.println(ovladani);*/
    
    String xDStr = getValue(premenna, ';', 0);
    int xD = xDStr.toInt();
    Serial.println(xD);
    String yDStr = getValue(premenna, ';', 1);
    int yD = yDStr.toInt();
    Serial.println(yD);
    String xNStr = getValue(premenna, ';', 2);
    int xN = xNStr.toInt();
    Serial.println(xN);
    String yNStr = getValue(premenna, ';', 3);
    int yN = yNStr.toInt();
    Serial.println(yN);
    String prodlevaDStr = getValue(premenna, ';', 4);
    int prodlevaD = prodlevaDStr.toInt();
    Serial.println(prodlevaD);
    String prodlevaNStr = getValue(premenna, ';', 5);
    int prodlevaN = prodlevaNStr.toInt();
    Serial.println(prodlevaN);
    String nepProvozStr = getValue(premenna, ';', 6);
    int nepProvoz = nepProvozStr.toInt();
    Serial.println(nepProvoz);
    String DTnasStr = getValue(premenna, ';', 7);
    int DTnas = DTnasStr.toInt();
    Serial.println(DTnas);
    String DHnasStr = getValue(premenna, ';', 8);
    int DHnas = DHnasStr.toInt();
    Serial.println(DHnas);
    String DCnasStr = getValue(premenna, ';', 9);
    int DCnas = DCnasStr.toInt();
    Serial.println(DCnas);
    String NTnasStr = getValue(premenna, ';', 10);
    int NTnas = NTnasStr.toInt();
    Serial.println(NTnas);
    String NHnasStr = getValue(premenna, ';', 11);
    int NHnas = NHnasStr.toInt();
    Serial.println(NHnas);
    String NCnasStr = getValue(premenna, ';', 12);
    int NCnas = NCnasStr.toInt();
    Serial.println(NCnas);
    String ThysterezeStr = getValue(premenna, ';', 13);
    int Thystereze = ThysterezeStr.toInt();
    Serial.println(Thystereze);
    String HhysterezeStr = getValue(premenna, ';', 14);
    int Hhystereze = HhysterezeStr.toInt();
    Serial.println(Hhystereze);
    String ChysterezeStr = getValue(premenna, ';', 15);
    int Chystereze = ChysterezeStr.toInt();
    Serial.println(Chystereze);
    String trvaniDneHodStr = getValue(premenna, ';', 16);
    int trvaniDneHod = trvaniDneHodStr.toInt();
    Serial.println(trvaniDneHod);
    String trvaniDneMinStr = getValue(premenna, ';', 17);
    int trvaniDneMin = trvaniDneMinStr.toInt();
    Serial.println(trvaniDneMin);
    String SzapHodStr = getValue(premenna, ';', 18);
    int SzapHod = SzapHodStr.toInt();
    Serial.println(SzapHod);
    String SzapMinStr = getValue(premenna, ';', 19);
    int SzapMin = SzapMinStr.toInt();
    Serial.println(SzapMin);
  }
  else {
    Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
    Serial.println();
  }
  //client.flush();
  client.stop(); //ukonc spojenie
  delay(5000); //pockaj 5s a vykonaj novu slucku loop
}

String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = { 0, -1 };
  int maxIndex = data.length() - 1;

  for (int i = 0; i <= maxIndex && found <= index; i++) {
    if (data.charAt(i) == separator || i == maxIndex) {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }
  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}
a kód PHP:

Kód: Vybrat vše

<?php
header('Content-Type: text/plain; charset=utf-8');
        // put your code here
        require_once('Db.php');
                Db::connect('127.0.0.1:3306', 'arduino', 'admin', 'Bartolomej');
                
                $water = Db::queryAll('
                                SELECT * FROM `water`;
                                ');
                foreach ($water as $u)
{
        $xD = ($u['xD']);
        $yD = ($u['yD']);            
        $xN = ($u['xN']);            
        $yN = ($u['yN']);     
        $prodlevaD= ($u['prodlevaD']);
        $prodlevaN = ($u['prodlevaN']);
        $nepProvoz = ($u['nepProvoz']);
                  
}

$profil = Db::queryAll('
                                SELECT * FROM `profil`;
                                ');
                foreach ($profil as $v)
{
        $DTnas = ($v['DTnas']);
        $DHnas = ($v['DHnas']);            
        $DCnas = ($v['DCnas']);            
        $NTnas = ($v['NTnas']);     
        $NHnas = ($v['NHnas']);
        $NCnas = ($v['NCnas']);
        $Thystereze = ($v['Thystereze']);
        $Hhystereze = ($v['Hhystereze']);
        $Chystereze = ($v['Chystereze']);
        $trvaniDneHod = ($v['trvaniDneHod']);
        $trvaniDneMin = ($v['trvaniDneMin']);
        $SzapHod = ($v['SzapHod']);
        $SzapMin = ($v['SzapMin']);
                    
}

$settings = Db::queryAll('
                                SELECT * FROM `settings`;
                                ');
                foreach ($settings as $w)
{
        $IP_arduino = ($w['IP_arduino']);
                 
}

/*$bool = Db::queryAll('
                                SELECT * FROM `bool`;
                                ');
                foreach ($bool as $x)
{
        $atmosOn = htmlspecialchars($x['atmosOn']);
        $vetrakOn = htmlspecialchars($x['vetrakOn']);            
        $vetrakSvetla = htmlspecialchars($x['vetrakSvetla']);            
}*/
echo("$xD;");
echo("$yD;");
echo("$xN;");
echo("$yN;");
echo("$prodlevaD;");
echo("$prodlevaN;");
echo("$nepProvoz;");
echo("$DTnas;");
echo("$DHnas;");
echo("$DCnas;");
echo("$NTnas;");
echo("$NHnas;");
echo("$NCnas;");

echo("$Thystereze;");
echo("$Hhystereze;");
echo("$Chystereze;");
echo("$trvaniDneHod;");
echo("$trvaniDneMin;");
echo("$SzapHod;");
echo("$SzapMin");


/*
echo("IP_arduino $IP_arduino ");

/*echo("atmosOn $atmosOn");
echo("vetrakOn $vetrakOn");
echo("vetrakSvetla $vetrakSvetla")*/

        ?>
výpis v Serial monitoru:
21:29:25.883 -> Pripojene
21:29:30.897 -> Premenna je:
21:29:30.897 -> 20;5;30;5;1;1;1;25;75;1250;23;40;400;1;1;50;18;0;16;20
21:29:30.897 -> 20
21:29:30.897 -> 5
21:29:30.897 -> 30
21:29:30.897 -> 5
21:29:30.897 -> 1
21:29:30.897 -> 1
21:29:30.897 -> 1
21:29:30.897 -> 25
21:29:30.897 -> 75
21:29:30.897 -> 1250
21:29:30.897 -> 23
21:29:30.897 -> 40
21:29:30.897 -> 400
21:29:30.897 -> 1
21:29:30.897 -> 1
21:29:30.897 -> 50
21:29:30.897 -> 18
21:29:30.897 -> 0
21:29:30.897 -> 16
21:29:30.897 -> 20
Díky všem.

Mám ještě jednu otázku, tyto hodnoty bych rád nějak porovnával s předchozíma hodnotama a pokud se některá z nich změnila, tak bych ji rád uložil do EEPROM. Nechci přepisovat všechny na jednou, chci přepsat jenom tu změněnou.
něco jako:

Kód: Vybrat vše

if (hodnota != hodnotaWeb){
  hodnota = hodnotaWeb;
  zapis hodnota do eeprom;
}
nebo existuje nějaká lepší cesta, při které nemusím vytvářet další proměnnou?

Re: Ovládání arduina přes web

Napsal: 13 srp 2019, 00:03
od gilhad
Tak pro vytazeni hodnoty z webu ti staci v podstate jedna univerzalni promenna, do ktere nactes zrovna vyparsovanou hodnotu.

Pokud to stejne ukladas do eeprom, tak to z eeprom muzes i normalne pouzivat pro vypocty a nemit to vubec v RAM.

a pak tu novou hodnotu z webu (v univerzalni promenne) proste priradis (nebo ne - podle porovnani se stavajici hodnotou v eeprom) do eeprom a dal pouzivas hodnotu z eeprom.