Ovládání arduina přes web

Bart_
Příspěvky: 18
Registrován: 06 srp 2019, 23:24
Reputation: 0

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

Příspěvek od Bart_ » 10 srp 2019, 14:26

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..

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

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

Příspěvek od KamilV » 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);
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.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

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

Příspěvek od pavel1tu » 12 srp 2019, 15:04

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.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Bart_
Příspěvky: 18
Registrován: 06 srp 2019, 23:24
Reputation: 0

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

Příspěvek od Bart_ » 12 srp 2019, 21:47

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?

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

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

Příspěvek od gilhad » 13 srp 2019, 00:03

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.

Odpovědět

Kdo je online

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