Ovládání arduina přes web
Napsal: 06 srp 2019, 23:59
Ahoj, celkem neúspěšně se snažím rozchodit ovládání arduina přes internet. Mám napsanou PHP aplikaci, která mi loguje data do MySQL databáze. Pak mám napsanou stránku, která tyto data sosá a jen je vypíše. Tato stránka by měla sloužit pro arduino,aby se na ní arduino připojilo a vzalo si údaje. Tyto údaje dále přiřadit správným proměnným. Případně je možné se připojit do MySQL přímo z arduina? Vybírám všechna políčka, protože se všemi pracuji, před každým zápisem do tabulek se mi předchozí zápis smaže, takže mám v tabulce vždy jeden řádek.
PHP pro ovládání arduina:
Arduino se připojí na server, dostane se pomocí GET na správnou stránku, ale String, který by si mělo vzít je nějaký "pošmodrchaný". Arduino se mi po cca 4 minutách běhu zasekne. Kód Arduina:
Výstup na Serial monitor:
Taky jsem zkoušel knihovnu MySQL connector https://github.com/ChuckBell/MySQL_Connector_Arduino ale v tomto případě se mi nepodařilo ani připojit do databáze. Chybí mi tam někde zadávání do jaké databáze by se mělo arduino připojit.
Pak mě ještě napadlo další řešení a to,že by PHP vytvořilo soubor s proměnými a ten by si arduino potom stáhlo a zněj vytáhlo informace. Ale to není tak elegantní.
Nejdivnější je, že mi to dneska v jednu chvíli vypisovalo správně. Pak jsem se tam ale pokusil použít funkci strtok() a arduino mi přestalo kompilovat, musel sem aktualizovat balíček AVR desek. Ani po vrácení se na předchozí verzi to nefunguje.
Poradíte mi někdo prosím jak správně ovládat arduino přes webovou stránku? Jak ho ovládáte vy?
PHP pro ovládání arduina:
Kód: Vybrat vše
<?php
header('Content-Type: text/plain');
// 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("$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")*/
?>
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,139); // webserver
IPAddress ip(10, 0, 0, 150);
EthernetClient client;
void setup(){
if (Ethernet.begin(mac) == 0) {
Serial.println("DHCP nepridelilo adresu, skusam so statickou...");
Ethernet.begin(mac, ip);
}
Serial.begin(115200);
Serial.println("setup");
}
void loop(){
Serial.println("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.139");
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 [50];
premenna.toCharArray(ovladani ,50);
Serial.println(ovladani);
*/
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
client.stop(); //ukonc spojenie
delay(5000); //pockaj 5s a vykonaj novu slucku loop
}
Přičemž vypsaný String by měl vypadat takto:23:31:55.889 -> setup
23:31:55.889 -> loop
23:31:55.889 -> Pripojene
23:31:55.889 -> Premenna je:
23:31:55.921 -> 2 ,!,!,!,!, , 5 4 , 0 , 7 4 , 0 ,1,1,50,1,1,1,0
Zkoušel jsem i kód s funkcí client.find ale to mělo prachbídnou úspěšnost. Za 30 min běhu kódu to našlo hledaný výraz jen 2x20,1,3,1,1,0,25,40,400,27,40,400,1,1,50,1,1,1,0
Taky jsem zkoušel knihovnu MySQL connector https://github.com/ChuckBell/MySQL_Connector_Arduino ale v tomto případě se mi nepodařilo ani připojit do databáze. Chybí mi tam někde zadávání do jaké databáze by se mělo arduino připojit.
Pak mě ještě napadlo další řešení a to,že by PHP vytvořilo soubor s proměnými a ten by si arduino potom stáhlo a zněj vytáhlo informace. Ale to není tak elegantní.
Nejdivnější je, že mi to dneska v jednu chvíli vypisovalo správně. Pak jsem se tam ale pokusil použít funkci strtok() a arduino mi přestalo kompilovat, musel sem aktualizovat balíček AVR desek. Ani po vrácení se na předchozí verzi to nefunguje.
Poradíte mi někdo prosím jak správně ovládat arduino přes webovou stránku? Jak ho ovládáte vy?