亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

构建基于 PHP 的 Web 界面控制 Arduino Uno

组件与物料

组件数量
Arduino UNO1
Arduino Ethernet Shield 21
DHT11 温湿度传感器 (4引脚)1
双路继电器模块4
迷你面包板1
火焰传感器1
MQ4 甲烷气体传感器1
LDR 光敏电阻1
土壤湿度传感器3
ADSL 路由器网线1
单孔插头7
单孔插座7
9V 电池1
9V 电池扣带 DC 插头1

必要工具与设备

应用与在线服务

项目详解

更新

如何利用 TheAmplituhedron.com 改进物联网项目?是我的新项目,帮你处理服务端编程。用它做主机,可轻松通过互联网收发数据包。支持我的项目请访问我的网站。

项目描述

创建专业网站控制家里的水族箱和灌溉系统,外出时也能获取家庭信息,是本项目核心。为此我创建了 Arduinautomotion 项目,在 Apache 本地服务器包含 4 个 PHP 页面:Arduinautomotion.php、Arduinautomotioncontrol.php、Arduinautomotionformvalue.php、Arduinautomotioncommunication.php。Arduino Ethernet Shield 另托管一个 HTML 页面 ArduinoSide.php,通过指定 IP 与网站通信。

两周度假时无法调整水族箱(如关闭内部过滤器防溢氧、远程投喂),萌生此念。网站提供 6 个水族箱控制选项 + 1 个灌溉启动选项。还能通过以太网盾获取家庭数据:DHT11 温湿度、MQ4 甲烷浓度等。Arduinautomotion 网站提供直观界面收发 Arduino 数据。

需掌握 HTML、CSS、JavaScript、PHP、jQuery 才能完全理解,本文仅作展示。懂这些语言可在下方代码区查看完整 PHP 文件。注:我用 Notepad++ 编写网页。

构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno

两个 PHP 页面间如何收发数据

使用 HTML 表单、PHP 方法和 $_SESSION[]。GET 方法通信更易但 POST 更安全,除 ArduinoSide 页面外均用 POST。Arduino 端用 GET 更容易实现 HTTP GET 请求。$_SESSION[] 可在多页面间持久保存数据。

在 Apache HTTP Server (Localhost) 上搭建网站

Apache 高效适配,也可用 XAMPP 等。我的路径:AppServ >> www >> Arduinautomotion.php。用自己的 IP 访问 (如 https://192.168.1.20/Arduinautomotion.php)。

Windows 下 PHP+Apache 配置指南

构建基于 PHP 的 Web 界面控制 Arduino Uno

所有 Arduinautomotion.php 内容见下方代码区。

从 Android 设备访问 Localhost

Windows 与 Mac 不同,参考:StackOverflow 问答。同一 Wi-Fi 下即可用自己的 IP 访问。

通过 Wi-Fi 访问 Localhost (外网)

需用外网 IP,确保只有你知道(否则危险)。参考:跨局域网访问。还需端口转发访问 ArduinoSide.php,IP 为 Arduino 代码中设定的地址。端口转发百科

Arduinautomotion.php - 主控页面

与 Arduino 以太网盾通信的主页,可下发指令、获取家庭数据。Change Menu 通过颜色区分传感器/执行器。变化的圆圈显示传感器数值和执行器状态。

构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno

1) 房间区域 - 显示来自 Arduinautomotioncommunication.php 的所有房间数据。

2) 水族箱区域 - 通过 HTML 表单选择水族箱部件组合,提交到 Arduinautomotionformvalue.php,经 Arduinautomotioncontrol.php 返回显示。

3) 植物区域 - 观察土壤湿度传感器数值,决定是否启动灌溉。数据流向同水族箱区域。

4) 指南区域 - 内嵌 Arduinautomotionformvalue.php 复查表单选择,含项目说明和通信流程图。

5) 警报框 - 任意传感器数值进入危险范围,页面重载时弹出蜘蛛侠视频+音频(“蜘蛛感应在刺痛”)。

6) 界面构成 - 响应式布局指南、所有变化圆圈、页脚等截图展示。

Arduinautomotioncontrol.php - 数据聚合页

内嵌在主页,从 Arduinautomotionformvalue.php 和 Arduinautomotioncommunication.php 获取所有 $_SESSION[] 数据,实现跨页面持久保存。

Arduinautomotionformvalue.php - 表单处理页

接收主页表单选择,转发给 ArduinoSide 和 Arduinautomotioncontrol.php。内嵌在指南区,也可新标签页直接访问。

构建基于 PHP 的 Web 界面控制 Arduino Uno

Arduinautomotioncommunication.php - 通信页

接收 ArduinoSide 数据保存到 Session,自动转发给 Arduinautomotioncontrol.php。

构建基于 PHP 的 Web 界面控制 Arduino Uno

ArduinoSide - 设备端网页

由 Arduino Ethernet Shield 通过 DNS 托管,通过代码中设定的 IP 访问 (如 https://yourChosenIPAddress)。

构建基于 PHP 的 Web 界面控制 Arduino Uno

接线连接

按 ArduinoSide 代码注释和下方 Fritzing 图接线。将单孔插头/插座接到双路继电器,所有元件固定在软木板等平面上。

Arduino 引脚分配:
DHT11 模块         → Pin 2
双路继电器 (1)     → Pin 3, 4
双路继电器 (2)     → Pin 5, 6
双路继电器 (3)     → Pin 7, 8
双路继电器 (4)     → Pin 9
Arduino Ethernet Shield → Pin 10, 11, 12, 13 (占用)
LDR                → A0
火焰传感器         → A1
MQ4 传感器         → A2
土壤湿度模块 (1)   → A3
土壤湿度模块 (2)   → A4
土壤湿度模块 (3)   → A5
构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno

Arduino 代码基于 Ethernet 库的 WebServer 示例,仅添加传感器读取和执行网站指令的逻辑。连接 ADSL 网线从以太网盾到路由器。代码运行后,网站通过 LAN/Wi-Fi 与 Arduino 收发数据。

构建基于 PHP 的 Web 界面控制 Arduino Uno

测试视频

接入水族箱和灌溉系统(水泵)测试,运行良好 :) 视频用 Filmora 试用版剪辑,保留水印尊重版权。电脑端/安卓端测试视频见原项目链接。

代码

Arduinautomotion.php PHP
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<?php include 'Arduinautomotioncontrol.php'; ?>
<head>
<link rel="shortcut icon" href="Arduinautomotion.ico" type="image/x-icon">
<style>
  /* 大量 CSS 样式,含动画、布局、颜色变换等,此处省略以节省篇幅 */
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
  // jQuery 交互逻辑:菜单切换、iframe 自适应等
  // JavaScript 函数:getDataFromArduino() 从 PHP Session 读取传感器/执行器状态,
  // 更新 SVG 圆圈颜色、仪表盘数值,触发危险值警报框(openAlert)
</script>
</head>
<body onpageshow="getDataFromArduino()">
  /* 主体 HTML 结构:背景图、指南 iframe、信息面板、SVG 可视化图形、
     四大区域选择器、表单提交区、页脚动画等 */
</body>
</html>
Arduinautomotioncontrol.php PHP
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
<title>Arduinautomotion</title>
<link rel="shortcut icon" href="Arduinautomotion.ico" type="image/x-icon">
<?php
  $temperatureCelsiusValue = $_SESSION['TemperatureCelsius'];
  $temperatureFahrenheitValue = $_SESSION['TemperatureFahrenheit'];
  $humidityValue = $_SESSION['Humidity'];
  $flamesensorValue = $_SESSION['Flame'];
  $MQ4sensorValue = $_SESSION['MQ4Sensor'];
  $LdrValue = $_SESSION['LDRSensor'];
  $pumpValue = $_SESSION['Airpump'];
  $lampValue = $_SESSION['Lamp'];
  $feedingValue = $_SESSION['Feeding'];
  $heaterValue = $_SESSION['Heater'];
  $filterexValue = $_SESSION['Filterex'];
  $filterinValue = $_SESSION['Filterin'];
  $plant1Value = $_SESSION['Plant1H'];
  $plant2Value = $_SESSION['Plant2H'];
  $plant3Value = $_SESSION['Plant3H'];
  $irrigationValue = $_SESSION['Irrigation'];
?>
</head>
</html>
Arduinautomotionformvalue.php PHP
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
<title>FormValue</title>
<link rel="shortcut icon" href="Arduinautomotion.ico" type="image/x-icon">
<?php
  $_SESSION['Airpump'] = $_POST["pump"];
  $_SESSION['Lamp'] = $_POST["lamp"];
  $_SESSION['Feeding'] = $_POST["feed"];
  $_SESSION['Heater'] = $_POST["heater"];
  $_SESSION['Filterex'] = $_POST["filterexternal"];
  $_SESSION['Filterin'] = $_POST["filterinternal"];
  $_SESSION['Irrigation'] = $_POST["irrigationsystem"];
?>
<style> /* 绿色主题样式 */ </style>
</head>
<body>
<div class="serverpage">
  <h1>Server has received the data from Arduinautomotion.</h1>
</div>
<p>Airpump= <?php echo $_SESSION['Airpump'];?></p><br>
<p>Lamp=<?php echo $_SESSION['Lamp'];?></p><br>
<p>Feeding=<?php echo $_SESSION['Feeding'];?></p><br>
<p>Heater=<?php echo $_SESSION['Heater'];?></p><br>
<p>Filterex=<?php echo $_SESSION['Filterex'];?></p><br>
<p>Filterin=<?php echo $_SESSION['Filterin'];?></p><br>
<p>Irrigation=<?php echo $_SESSION['Irrigation'];?></p><br>
<form action="https://192.168.1.21/" method="get" target="_blank">
  <input type="hidden" value="<?php echo $_SESSION['Airpump'];?>" name="airpump">
  <input type="hidden" value="<?php echo $_SESSION['Lamp'];?>" name="lamp">
  <input type="hidden" value="<?php echo $_SESSION['Feeding'];?>" name="feed">
  <input type="hidden" value="<?php echo $_SESSION['Heater'];?>" name="heater">
  <input type="hidden" value="<?php echo $_SESSION['Filterex'];?>" name="filterex">
  <input type="hidden" value="<?php echo $_SESSION['Filterin'];?>" name="filterin">
  <input type="hidden" value="<?php echo $_SESSION['Irrigation'];?>" name="irrigation">
  <input type="submit" value="Send and Get Data" class="subMit">
</form>
</body>
</html>
Arduinautomotioncommunication.php PHP
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
<title>Communication</title>
<link rel="shortcut icon" href="Arduinautomotion.ico" type="image/x-icon">
<style> body{ background-image: url("https://i.ytimg.com/vi/kkVGBn-haDo/maxresdefault.jpg"); } </style>
<?php
  $_SESSION['TemperatureCelsius'] = $_GET["temperatureCelsius"];
  $_SESSION['TemperatureFahrenheit'] = $_GET["temperatureFahrenheit"];
  $_SESSION['Humidity'] = $_GET["humidity"];
  $_SESSION['Flame'] = $_GET["flame"];
  $_SESSION['MQ4Sensor'] = $_GET["MQ4sensor"];
  $_SESSION['LDRSensor'] = $_GET["LDRsensor"];
  $_SESSION['Plant1H'] = $_GET["plant1H"];
  $_SESSION['Plant2H'] = $_GET["plant2H"];
  $_SESSION['Plant3H'] = $_GET["plant3H"];
?>
</head>
<body></body>
</html>
ArduinoSide_Code.ino Arduino
/////////////////////////////////////////////////////////////////
// -ARDUINAUTOMOTON-
// 创建专业网站与 Arduino 通信 (兼容 Android)
// by Kutluhan Aktar
/////////////////////////////////////////////////////////////////
#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"

DHT dht;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 21);
EthernetServer server(80);

int pump = 3, lamp = 4, feed = 5, heater = 6, filterex = 7, filterin = 8, irrigation = 9;
String readString;

void setup() {
  Serial.begin(9600);
  pinMode(pump, OUTPUT); pinMode(lamp, OUTPUT); pinMode(feed, OUTPUT);
  pinMode(heater, OUTPUT); pinMode(filterex, OUTPUT); pinMode(filterin, OUTPUT);
  pinMode(irrigation, OUTPUT);
  digitalWrite(pump, HIGH); digitalWrite(lamp, HIGH); digitalWrite(feed, HIGH);
  digitalWrite(heater, HIGH); digitalWrite(filterex, HIGH); digitalWrite(filterin, HIGH);
  digitalWrite(irrigation, HIGH);
  dht.setup(2);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  delay(dht.getMinimumSamplingPeriod());
  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();
  float fahrenheit = dht.toFahrenheit(temperature);
  int ldrValue = analogRead(A0);
  int flameValue = analogRead(A1);
  int MQ4Value = analogRead(A2);
  int HygValueA = analogRead(A3);
  int HygValueB = analogRead(A4);
  int HygValueC = analogRead(A5);

  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (readString.length() < 135) readString += c;
        Serial.println(readString);
        if (c == '\n') {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type:text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html style=\"background-color:black;\">");
          client.println("<head><title>ArduinoSide</title>");
          client.println("<link rel=\"icon\" href=\"https://www.clker.com/cliparts/D/W/n/h/n/W/house-logo-hi.png\">");
          client.println("</head><body>");
          client.println("<form action=\"https://192.168.1.20/Arduinautomotioncommunication.php?\" method=\"get\" target=\"_blank\">");
          client.println("<input type=\"hidden\" name=\"temperatureCelsius\" >");
          client.println("value="); client.println(temperature); client.println(">");
          client.println("<input type=\"hidden\" name=\"temperatureFahrenheit\" >");
          client.println("value="); client.println(fahrenheit); client.println(">");
          client.println("<input type=\"hidden\" name=\"humidity\" >");
          client.println("value="); client.println(humidity); client.println(">");
          client.println("<input type=\"hidden\" name=\"flame\" >");
          client.println("value="); client.println(flameValue); client.println(">");
          client.println("<input type=\"hidden\" name=\"MQ4sensor\" >");
          client.println("value="); client.println(MQ4Value); client.println(">");
          client.println("<input type=\"hidden\" name=\"LDRsensor\" >");
          client.println("value="); client.println(ldrValue); client.println(">");
          client.println("<input type=\"hidden\" name=\"plant1H\" >");
          client.println("value="); client.println(HygValueA); client.println(">");
          client.println("<input type=\"hidden\" name=\"plant2H\" >");
          client.println("value="); client.println(HygValueB); client.println(">");
          client.println("<input type=\"hidden\" name=\"plant3H\" >");
          client.println("value="); client.println(HygValueC); client.println(">");
          client.println("<input type=\"submit\" value=\"Communication\" style=\"width:500px;height:200px;font-weight:bold;background-color:black;color:green;\">");
          client.println("</form></body></html>");
          break;
        }
      }
    }
    delay(1);
    client.stop();

    // 解析来自网站的指令控制继电器
    if (readString.indexOf("?airpump=pumpIsOn") > 0) digitalWrite(pump, LOW);
    else if (readString.indexOf("?airpump=pumpIsOff") > 0) digitalWrite(pump, HIGH);
    if (readString.indexOf("&lamp=lampIsOn") > 0) digitalWrite(lamp, LOW);
    else if (readString.indexOf("&lamp=lampIsOff") > 0) digitalWrite(lamp, HIGH);
    if (readString.indexOf("&feed=feedIsOn") > 0) digitalWrite(feed, LOW);
    else if (readString.indexOf("&feed=feedIsOff") > 0) digitalWrite(feed, HIGH);
    if (readString.indexOf("&heater=heaterIsOn") > 0) digitalWrite(heater, LOW);
    else if (readString.indexOf("&heater=heaterIsOff") > 0) digitalWrite(heater, HIGH);
    if (readString.indexOf("&filterex=exIsOn") > 0) digitalWrite(filterex, LOW);
    else if (readString.indexOf("&filterex=exIsOff") > 0) digitalWrite(filterex, HIGH);
    if (readString.indexOf("&filterin=inIsOn") > 0) digitalWrite(filterin, LOW);
    else if (readString.indexOf("&filterin=inIsOff") > 0) digitalWrite(filterin, HIGH);
    if (readString.indexOf("&irrigation=start") > 0) digitalWrite(irrigation, LOW);
    else if (readString.indexOf("&irrigation=stop") > 0) digitalWrite(irrigation, HIGH);

    readString = "";
    Serial.println("client disconnected");
  }
}

自定义部件与外壳

  • arduinautomotion_wNJ69zA666.ico
  • spidersense_Ge3umcKzBw.mp4
  • spidermanvoice_EqWLILohmW.mp3

原理图

构建基于 PHP 的 Web 界面控制 Arduino Uno
构建基于 PHP 的 Web 界面控制 Arduino Uno

制造工艺

  1. 树莓派 PIR 运动传感器控制 LED 实战指南
  2. 两块 Arduino 通过 Firebase 传递温湿度数据
  3. 用 Arduino 制作万能红外遥控器:分步指南
  4. 基于 Arduino Uno 的人体检测救援机器人:传感器集成分步指南
  5. Arduino 红外心率传感器 DIY:低成本高精度,串口绘图器实时波形
  6. DIY 数字身高仪:Arduino Nano + VL53L0X 激光测距 + OLED 显示
  7. 智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
  8. 用 Arduino 测量地球质量:DIY 分步指南
  9. Arduino Cloud 传感器塔:温度、动作与气体监测
  10. 智能停车计数系统:Arduino + Processing + PHP 实时车位追踪上云
  11. Arduino 实时数字罗盘:HMC5883L + Processing 可视化教程
  12. 构建您的第一个AWS CloudFormation模板——实操指南