我正在研究基于Arduino的RFID用户访问记录器,但在阅读服务器响应时我遇到了一些问题。
我的设置如下:
- Arduino Mega连接到MFRC522读卡器和ENC28J60以太网模块(MFRC522的SS和RST引脚被更改以避免SPI总线内的冲突)。
- 包含MySQL数据库和必要的php文件的本地主机服务器(在端口100上)。
目前正确读取卡片,Arduino成功更新数据库中的变量,但是我无法通过串口监视器显示php文件中的回声。为了测试服务器端是否一切正常,我创建了一个小的html表单,如果我发送它,我会在浏览器中显示必要的回声。
我正在打印client.available()返回的值,并且我总是得到一个false,尽管client.connected()返回true。将我的代码与在线发现的其他代码进行比较,没有太大区别。在这一点上,我不知道该尝试什么,我正在跳跃,你可以帮我这个!
我附上以下代码:
Arduino的:
М4х20
Uploader.php
#include <SPI.h>
#include <MFRC522.h>
#include <UIPEthernet.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//----RFID----/
MFRC522 rfid(8, 9); //(SS pin, RST pin)
byte nuidPICC[4];
//----ETHERNET----/
#define DEBUG
EthernetClient client;
char server[] = "192.168.xxx.xxx"; //<-Localhost
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x40 };
//----LCD----/
LiquidCrystal_I2C lcd(0x3F, 16, 2);
//----VARIABLES----/
int userid=0;
void setup() {
Serial.begin(9600);
SPI.begin(); // Init SPI bus
lcd.begin();
pinMode(2,OUTPUT);
//----RFID----/
rfid.PCD_Init(); // Init MFRC522
//----ETHERNET----/
Ethernet.begin(mac);
#ifdef DEBUG
Serial.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
Serial.print("IP Address : ");
Serial.println(Ethernet.localIP());
Serial.print("Subnet Mask : ");
Serial.println(Ethernet.subnetMask());
Serial.print("Default Gateway IP: ");
Serial.println(Ethernet.gatewayIP());
Serial.print("DNS Server IP : ");
Serial.println(Ethernet.dnsServerIP());
lcd.print("IP Address");
lcd.setCursor(0,1);
lcd.print(Ethernet.localIP());
delay(2000);
lcd.clear();
lcd.noBacklight();
#endif
}
void sender(){
/*lcd.clear();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("identifying");
tone(2,900,400);*/
if(client.connect(server, 100)){
Serial.println("Conected");
}
//String query = "GET /uploader.php?userid=";
//query=query+String(userid);
//Serial.println(query);
//client.print(query);
client.print( "GET /uploader.php?userid=");
client.print(12345);
client.println(" HTTP/1.1");
client.print("HOST: ");
client.println(server);
client.println();
client.println();
Serial.println("Data sent");
delay(1000);
Serial.println(client.connected());
Serial.println(client.available());
if(client.available())
{
Serial.println("ARDUINO: HTTP message received");
Serial.println("ARDUINO: printing received headers and script response...\n");
while(client.available())
{
char c = client.read();
Serial.print(c);
}
//Code to display info through the serial monitor and the LCD
}
else
{
Serial.println("ARDUINO: no response received / no response received in time");
}
client.stop();
}
void reader(){
userid=0;
// Look for new cards
if ( ! rfid.PICC_IsNewCardPresent())
return;
// Verify if the NUID has been readed
if ( ! rfid.PICC_ReadCardSerial())
return;
// Store NUID into nuidPICC array
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
userid=userid+nuidPICC[i];
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
sender();
}
void loop(){
reader();
}
SQL表格
<?php
$conexion = mysql_connect("localhost", "user", "pass");
mysql_select_db("db_name", $conexion);
mysql_query("SET NAMES 'utf8'");
$userid = $_GET ['userid'];
$sql1 = "SELECT nombre, ultima_entrada, ultimo_pago, dentro FROM usuarios WHERE id = '$userid'";
$retval = mysql_query( $sql1, $conexion );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
echo "return error";
}
$row = mysql_fetch_array($retval, MYSQL_ASSOC);
$month = date('n',strtotime($row['ultimo_pago']));
$date = date('n');
if($month < $date){
echo "El usuario:{$row['nombre']} es moroso <br> ";
}else{
if($row['dentro']==0){
echo "Usuario:{$row['nombre']} accediendo al lab <br>";
$sql2 = "UPDATE usuarios SET dentro='1', ultima_entrada = CURRENT_TIMESTAMP WHERE id = '$userid'";
mysql_query($sql2);
}elseif($row['dentro']==1){
echo "Usuario:{$row['nombre']} saliendo del lab <br>";
$sql3 = "UPDATE usuarios SET dentro='0', ultima_salida = CURRENT_TIMESTAMP WHERE id = '$userid'";
mysql_query($sql3);
}
}
mysql_close();
?>
注意:我正在使用虚拟用户ID,将来会更改,现在我只想从服务器获得响应。
提前谢谢!
答案 0 :(得分:1)
https://www.tweaking4all.com/hardware/arduino/arduino-ethernet-data-push/#comment-21572
如果您阅读评论,诺伯特说应该避免延误,这就是我错了。在我的代码中,我在GET请求后有1秒的漂亮延迟。删除它解决了这个问题。我的代码基于http://www.smartsustainability.org/CIS508/?page_id=2203,但它是针对不同的WIFI /以太网屏蔽而制作的,而不是针对ENC28J60,这就是问题所在。 (虽然不是说这是一个糟糕的代码。)
总之,解决方案是替换这一行:
delay(1000);
使用此循环,等待客户端可用:
while(!client.available()){}
希望这可以避免将来的头痛!