使用EtherCard.h库将arduino数据发送到我的数据库

时间:2014-01-01 11:34:16

标签: arduino ethernet

我在将Arduino数据发送到我的数据库时遇到问题。我目前正在使用WAMPSERVER。我有一个arduino mini w/ ATMEGA 328,我正在使用ENC28J60。问题是我尝试了不同的库和示例将数据发送到服务器但我失败了。我只是注意到有些库与我的enc28J60不兼容。我尝试过UIPEthernet.h,Ethernet.h,etherShield.h和EtherCard.h。 etherShield.h和EtherCard.h似乎运行得很好。但我更喜欢使用EtherCard.h,因为我听说etherShield是较旧的lib。我知道一点php。

我认为可能指导我的是看到一个使用EtherCard.h库的工作示例,该库演示了将arduino中的传感器数据发送到我的数据库中。我目前正在处理的网络设置是,ENC28J60在我的家庭网络中连接,IP地址为192.168.10.10。我放置数据库的服务器是我的笔记本电脑,IP地址为192.168.10.2。我将php文件放在这个目录C:\wamp\www中。我希望我已经解释得很好。对不起我的英语。

1 个答案:

答案 0 :(得分:2)

我目前正在使用我的homewatch server端口从Arduino Uno w Ethernet lib到AVR-NETIO with Ethercard lib(或UIPEthernet)。

在服务器端有一个Apache / PHP / MySQL服务器。

要更新Web服务器连接数据库上的数据,您可以对php网页使用POST或GET请求。然后可以将这些数据轻松添加到数据库中,同一个或另一个网页也可以显示数据库的数据。

<?php
require 'dbhelp.php';

//header('Content-type: text/plain');
echo "<html>";
echo "<head>";
echo "<meta name='viewport' content='width=device-width, user-scalable=false, initial-scale=1;'>";
echo "</head>";
echo "<body>" .        "<h2>Temperatur und Luftfeuchte</h2>";


// GET requests are sent as a query string on the URL:
// GET index.html?name1=value&name2=value HTTP/1.1
// Host: about.com
// http://192.168.0.40/homewatch/index.php?channel=1&temp=165&humidity=80&datetime=010120131234
if($DEBUG){
       print("<pre>");
print_r($_GET);
print("</pre>");
}

openDB();

if( isset($_GET['channel']) && isset($_GET['temp']) && isset($_GET['humidity']) )
{
  if($DEBUG)
    echo "<p>addData()";
  $c=$_GET['channel'];
  $t=$_GET['temp'];
  $h=$_GET['humidity'];
  addData($c, $t, $h);
  if($DEBUG)
     echo "<p>all done";
  //listData();
  echo "<p>OK updated data for channel:" . $c . "</p>";
}
else
{
  if($DEBUG)
    echo "listData()";
  //listData();
  //echo "<p>missing arg";
}
echo "<p><a href='linechart_hour.php'>Stunden-&Uuml;bersicht</a></p>";
echo "<p><a href='barchart_days.php'>Tages-&Uuml;bersicht</a></p>";
echo "<p><a href='http://www.unwetterzentrale.de/uwz/getwarning_de.php?plz=41363&uwz=UWZ-DE&lang=de'>Unwetterwarnungen J&uuml;chen</a></p>";

echo showAllCharts();
//#################################################################################
// see http://code.google.com/p/googlechartphplib/wiki/GettingStarted
//#################################################################################
// don't forget to update the path here
require './lib/GoogleChart.php';

$chart = new GoogleChart('lc', 500, 200);

// manually forcing the scale to [0,100]
$chart->setScale(0,100);

// add one line
$data = new GoogleChartData(array(49,74,78,71,40,39,35,20,50,61,45));
$chart->addData($data);

// customize y axis
$y_axis = new GoogleChartAxis('y');
$y_axis->setDrawTickMarks(false)->setLabels(array(0,50,100));
$chart->addAxis($y_axis);

// customize x axis
$x_axis = new GoogleChartAxis('x');
$x_axis->setTickMarks(5);
$chart->addAxis($x_axis);

echo $chart->toHtml();
//#################################################################################
// END
//#################################################################################

echo "<p>v0.9" . "</body>" . "</html>";
?>

dbhelp.php文件会自动创建数据库(如果尚不存在):

<?php
//global dbhelp.php file

$server="localhost";
$user="root";
$passwd="password";
$names=array(
1 => "Aussen",
2 => "Schlaf",
3 => "Andreas");
$DEBUG=false;

function openDB(){
    global $DEBUG;
    global $user;
    global $passwd;
    $link = mysql_connect("localhost", $user, $passwd);
    if(!$link){
            echo "SqlConnect failed";
            echo mysql_error();
    }
    else
            if($DEBUG)
                    echo "SqlConnect OK";

    $query="CREATE database IF NOT EXISTS avrdb;";
            $result = mysql_query($query, $link);
    if(!$result){
            echo "CreateDB failed";
            echo mysql_error();
    }
    else
            if($DEBUG)
                    echo "CreateDB OK";

    $result = mysql_select_db("avrdb", $link);
    if(!$result){
            echo "SelectDB failed";
            echo mysql_error();
    }
    else
            if($DEBUG)
                    echo "SelectDB OK";

    $query="CREATE TABLE IF NOT EXISTS `avrtemp` (" .
    "`id` int(11) NOT NULL AUTO_INCREMENT, " .
    "`channel` int(11), " .
    "`temp` int(11), " .
    "`humidity` int(11), " .
    "`date_time` TIMESTAMP, " .
    "PRIMARY KEY (`id`) );";
    $result = mysql_query($query, $link);
    if(!$result){
            echo "CreateTable failed";
            echo mysql_error();
    }
    else
            if($DEBUG)
                    echo "CreateTable OK";

    return true;        
}
...
function addData($c,$t,$h){
        global $DEBUG;
        $lastStoredDateTime=getLastStoredDateTime();
        if($DEBUG){
                echo "<p>" . $c . "</p>\n";
                echo "<p>LastDateTime=".$lastStoredDateTime."</p>\n";
        }
        // add data but do not save seconds (use 00)
        $query="INSERT INTO avrtemp (`channel`,`temp`,`humidity`,`date_time`)".
              " VALUES ( $c,$t,$h,".
//                         " DATE_FORMAT(NOW()),".
                         " DATE_FORMAT('".$lastStoredDateTime."', ".
              " '%Y-%c-%d %H:%i') )";
        if($DEBUG)
                echo "<p>" . $query;
        $result = mysql_query($query);
        if(!$result){
                echo "addData failed";
                echo mysql_error();
        }
        else
                if($DEBUG)
                        echo "addData OK";
}

Arduino帖子(使用GET)每5分钟更新一次数据。每分钟左右,数据通过433MHz无线传感器到达Arduino。

使用以太网Lib,数据更新通过

完成
char cBuf[maxBuf+1];
const char getHttpString[] =
  "GET /homewatch/index.php?channel=%i&temp=%i&humidity=%i&time=%i\0";
...
  // and send data: /index.php?channel=1&temp=165&humidity=80&datetime=010120131234
  if (client.connect(server, 80)) {
    Serial.println("connected. Send GET...");
    snprintf(cBuf, maxBuf,
      getHttpString,
      sensorData[idxChannel].channel,
      sensorData[idxChannel].temp,
      sensorData[idxChannel].humidity,
      sensorData[idxChannel].time_long
      );

Serial.println(F("####"));
Serial.println(cBuf);
Serial.println(F("####"));

    client.println(cBuf);
...

https://github.com/hjgode/homewatch/blob/master/arduino/SketchBook/WebClientTemperature/WebClientTemperature.ino

字符串“GET /homewatch/index.php?channel=%i&temp=%i&humidity=%i&time=%i \ 0”只是填充了实际的传感器数据,服务器将其保存到其中数据库中。

Ethercard lib附带了类似的示例:请参阅示例noipClient,pachube和webclient。不幸的是,我还没有能够将这些用于我的AVR-NETIO。

将一些数据发布(GET)到我目前正在使用的服务器的代码是

void sendData(int idxChannel){
    Serial.print(F("in sendData for idx=")); Serial.println(idxChannel);
    byte sd;
    int channel=sensorData[idxChannel].channel;
    int temp=sensorData[idxChannel].temp;
    int humidity=sensorData[idxChannel].humidity;
    char* stime="201301011122";
    stime=printDateTime((char*)&stime, 13, sensorData[idxChannel].time_long);

    if(sensorData[idxChannel].bUpdated==0){
      //nothing new
      if (MYDEBUG==0){
        Serial.println(F("leaving for not updated channel data"));
        goto exit_sendData;
      }
      else
      {
        sensorData[idxChannel].channel=idxChannel;
        sensorData[idxChannel].temp=222;
        sensorData[idxChannel].humidity=55;
        sensorData[idxChannel].time_long=now();      
      }
    }

    // generate two fake values as payload - by using a separate stash,
    // we can determine the size of the generated message ahead of time
    sd = stash.create();
    stash.print("0,");
    stash.println((word) millis() / 123);
    stash.print("1,");
    stash.println((word) micros() / 456);
    stash.save();

    // generate the header with payload - note that the stash size is used,
    // and that a "stash descriptor" is passed in as argument using "$H"
    Stash::prepare(PSTR("GET http://$F/homewatch/index.php?channel=$D&temp=$D&humidity=$D&time=$S" "\r\n"
                        "Host: $F" "\r\n"
                        "Content-Length: $D" "\r\n"
                        "\r\n"
                        "$H"),
            website, 
            channel,
            temp,
            humidity,
            stime,
            website, stash.size(), sd);

    // send the packet - this also releases all stash buffers once done
    ether.tcpSend();
exit_sendData:
  lastConnectionTime = now();//millis();
  Serial.println(F("...end of sendData()"));
}

如您所见,有一个格式化的字符串

PSTR("GET http://$F/homewatch/index.php?channel=$D&temp=$D&humidity=$D&time=$S"

填充了变量。 $ F从闪存中填充,$ D填充数字var,$ S从RAM内存字符串填充。没有我的SensorCode(使用中断)就可以使用它。