【问题标题】:Change reading interval of sensor using php使用php更改传感器的读取间隔
【发布时间】:2015-10-03 03:43:16
【问题描述】:

所以,我有这样的 arduino 代码:

#include <Ethernet.h>
#include <SPI.h> m 
#include "kSeries.h"

kSeries K_30(8,9);


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 229 };
byte gateway[] = { 192, 168, 1, 1 };
byte server[] = { 192, 168, 1, 138 }; // alamat host Server
String location = "GET http://192.168.1.138/SIMON/datasetiapdetik.php?";
//String location = "POST /alvin/datasetiapdetik.php?";
String host = "Host:  192.168.1.138";

EthernetClient client;

void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  Serial.println("connecting...");
}

void loop()
{
   double co2 = K_30.getCO2('p');
  // Print the value on Serial
  Serial.print(co2);
  Serial.println("ppm \t");



String data;
  data+="";
  data+="device=arduino";
  data+="&A0=";data+=co2;
  data+="&submit=Submit";
  Serial.print(data);
while (client.connect(server, 80)) {
    Serial.println("Sending data..");


    //lokasi halaman atau form 
    client.print(location);
    client.print(data);
    client.println("HTTP/1.1");
    client.println(host);
    //client.println("Connection: close");
    //char web=client.read();
    Serial.print(location);
    Serial.print(data);

    client.stop();  
  }
  /*
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  delay(50);
  }*/
  delay(2000);
}

和这样的 php 代码:

<?php
include "config/koneksi.php";
error_reporting(0); 
date_default_timezone_set('Asia/Jakarta');
// EDIT: Your mysql database account information
$tablename = "input";
$localhost = "localhost";
$date = date('y-m-d');
$waktu = date('H:i');
$tanggal = date('y-m-d');
$menit = date('i');


    //Create tabel everyday
    $sql = "\n"
    . " CREATE TABLE IF NOT EXISTS `input` ( `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT ,\n"
    . " `date` date NOT NULL ,\n"
    . " `time` time NOT NULL,\n"
    . " `device` text NOT NULL ,\n"
    . " `A0` int( 11 ) NOT NULL ,\n"
    . " PRIMARY KEY ( `ID` ) ) ENGINE = InnoDB DEFAULT CHARSET = latin1;";
    $create = mysql_query($sql);    


$sql = "SELECT * 
    FROM `$tablename` 
    WHERE `date`='$date' and `time`='$waktu'
    ";

    $uji = mysql_num_rows(mysql_query($sql));

if ($menit % 1 == 0 and $uji < 1)   {   
$query1 = "INSERT INTO `input` (date,time,device,A0 VALUES ('$date','$waktu','$_GET[device]','$_GET[A0]')";
    $result = mysql_query($query1);
    }
else {  

}


    echo 'GET  = ' . htmlspecialchars($_GET["device"]) . '!<br>';
    echo 'GET  = ' . htmlspecialchars($_GET["A0"]) . '!<br>';



echo "<h1>Sistem Monitoring Siap!!</h1>";
echo `\n`;

?>

它每分钟读取一次数据,而且很好。但是当我将 $menit % 1 更改为 % 5 时,它不起作用。如何更改间隔以便每 5 分钟读取一次数据?谢谢

【问题讨论】:

  • 这个运行是怎么回事,也许它超时了 - 你考虑过 cronjob 吗?
  • 我是新手。我如何从上面更改代码?或者你可以给我一个新的?

标签: php mysql arduino


【解决方案1】:

也许可行:
您希望每个时间间隔只存储一个值。假设间隔为 5 分钟。所以例如在 6:40:00 和 6:44:59 之间出现的每个请求都将在“时间段”6:40 中。以及 6:45:00 到 6:49:59 之间的每个请求都在 6:45“槽”中。
这很容易实现。您将秒数设置为零并从分钟数中减去(分钟模间隔),例如请求在 6:43 -> 分钟 = 43 - (43%5) = 43-3 = 40.
请求在 6:44 -> 分钟 = 44 - (44%5) = 44-4 = 40.
请求在 6:45 -> 分钟 = 45 - (45%5) = 45-0 = 45。
依此类推。

现在你添加一个unique index到你的mysql表中,像这样

CREATE TABLE IF NOT EXISTS `input` (
    `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `date` date NOT NULL,
    `time` time NOT NULL,
    `device` VARCHAR(128) NOT NULL,
    `A0` int( 11 ) NOT NULL,
    PRIMARY KEY ( `ID` ),
    UNIQUE KEY(`date`,`time`)
) ENGINE = InnoDB DEFAULT CHARSET = latin1

UNIQUE KEY(date,time)* 不允许第二条记录具有相同的日期+时间,因此一旦一个“时隙”的记录出现在表中,任何后续的 INSERT “时隙”将失败(或被忽略)。
在这种情况下你会得到的错误代码是1022 ER_DUP_KEY,如果你愿意,你可以测试那个特定的错误代码。如果您不这样做,您可以发送INSERT IGNORE INTO ... 查询。如果存在唯一索引冲突,则 INSERT 将被忽略。

mysql_* 扩展is deprecated 将在即将发布的 php 7 中删除。所以我不会给你一个 mysql_* 的例子,而是一个使用PDOprepared statements 的例子(虽然未经测试)。

<?php
define('INTERVAL_MINUTES', 5);

include "config/koneksi.php";
date_default_timezone_set('Asia/Jakarta');

$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
    PDO::ATTR_EMULATE_PREPARES=>false,
    PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));

$pdo->exec('
    CREATE TABLE IF NOT EXISTS `input` (
        `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
        `date` date NOT NULL,
        `time` time NOT NULL,
        `device` VARCHAR(128) NOT NULL,
        `A0` int( 11 ) NOT NULL,
        PRIMARY KEY ( `ID` ),
        UNIQUE KEY(`date`,`time`,`device`)
    ) ENGINE = InnoDB DEFAULT CHARSET = latin1
');


$ts = getdate();
// "adjusting" to the time slot
$ts['minutes'] = $ts['minutes'] - ($ts['minutes']%INTERVAL_MINUTES);

$stmt = $pdo->prepare('
    INSERT IGNORE INTO
        `input`
        (`date`,`time`,`device`,`A0`)
    VALUES
        (:date,:time,:device,:A0)
');

$params = array(
    'date'=>sprintf('%04d-%02d-%02d', $ts['year'], $ts['month'], $ts['mday']),
    'time'=>$time = sprintf('%02d:%02d:00', $ts['hours'], $ts['minutes']),
    'device'=>$_GET['device'],
    'A0'=>$_GET['A0']
);

$stmt->execute($params);

编辑:* 再次考虑您可能想要UNIQUE KEY(date,time,device) - 这样多个设备可以每个在每个时隙插入一条记录....
另一个编辑:要按预期工作,INTERVAL_MINUTES 必须是 60 的除数。我们可能有 60 分钟到一个小时,因为 60 有很多除数(1、2、3、4、5、6、10、12、 15,20,30,60),所以我希望没关系....

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    相关资源
    最近更新 更多