使用php更改传感器的读取间隔

时间:2015-10-03 03:43:17

标签: php mysql arduino

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

char

和这样的PHP代码:

'\0'

它每分钟读取数据并且罚款。但是当我将$ menit%1更改为%5时,它无法正常工作。我如何更改间隔以便每5分钟读取一次数据?感谢

1 个答案:

答案 0 :(得分:0)

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

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

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(日期,时间) *将不允许第二条记录具有相同的日期+时间,因此一旦一个“时间段”的记录在表格中对同一“时隙”的任何后续INSERT都将失败(或被忽略) 在这种情况下您将获得的错误代码是1022 ER_DUP_KEY,如果您愿意,可以测试该特定错误代码。如果不这样做,您只需发送INSERT IGNORE INTO ...查询即可。如果存在唯一的索引冲突,则会默默忽略该INSERT。

mysql_ *扩展名is deprecated将在即将发布的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),所以我希望没关系......