Arduino+ESP-01+YL-69

更新於 發佈於 閱讀時間約 29 分鐘
raw-image


本專題為兩塊ESP8266-ESP01 ,分別為 Arduino+ESP-01+YL-69 土壤濕度檢測器與LED燈 ,以及 ESP-01 + DHT11 + LED 傳輸給伺服器端,並於伺服器上 WebSite 透過ESP-01上傳儲 存於 MYSQL 資料呈現曲線圖給前端使用者。此外,前端使用者也可控制兩塊ESP01將LED 燈點亮與關閉。

raw-image
raw-image

Ardunio Uno + ESP8266 ESP-01連線測試

#include <SoftwareSerial.h>
#define RX 3 //ESP8266 的 TX接3
#define TX 2 //ESP8266 RX接2
String ssid="D-Link_DIR-612"; //無線基地台識別
String pwd="123456789"; //無線基地台密碼
String IP = "192.168.20.3";
String cmd;
SoftwareSerial ESP8266(RX,TX);
void setup()
{
Serial.begin(9600);
ESP8266.begin(9600);
cmd = "AT+RST";
sendToWifi(cmd);//使用AT+RST重新啟動ESP8266
delay(1000); //延遲1秒
//
cmd="AT+CWJAP=\"";
cmd+=ssid;
cmd+="\",\"";
cmd+=pwd;
cmd+="\"";
cmd+="\r\n";
Serial.println("*** SoftSerial connection to ESP8266 ***");
sendToWifi("AT+CWMODE=3\r\n"); // 設定為 STA 模式
sendToWifi(cmd); // 取得連線(視AP連線效能作調整,預設7000毫秒)
//AT+CWJAP="D-Link_DIR-612","123456789"
sendToWifi("AT+CIFSR"); // 獲得 IP
sendToWifi("AT+CIPMUX=1\r\n"); // 開啟多除連接模式
sendToWifi("AT+CIPSERVER=1,80\r\n"); // 設定連接埠為 8080
Serial.println("Ready");
//
}
void loop(){
//手打指令用 Start
if (ESP8266.available()){
Serial.write(ESP8266.read());
}
if (Serial.available()){
ESP8266.write(Serial.read());
}
//手打指令用 END
cmd="AT+CIPSTART=\"TCP\",\""+IP+"\",80";
sendToWifi(cmd);//連線192.168.43.129網頁伺服器
if (ESP8266.find("Error")) {
Serial.println("無法連線網頁伺服器");
return;//跳出,後面程式不再執行
}
String GET="GET /test.php?name=John&hour=13\r\n\r\n";
cmd="AT+CIPSEND=" + String(GET.length());//傳送的字串長度
sendToWifi(cmd);
if (ESP8266.find(">")) { //若ESP8266準備接收資料
sendToWifi(GET); //傳送GET指令、網址與資料
} else { //沒有收到ESP8266準備接收資料的回應
cmd = "AT+CIPCLOSE";//結束連線
sendToWifi(cmd);
}
delay(1000); //延遲1秒
//
}
void sendToWifi(String command){
ESP8266.println(command);
Serial.println(command);
}

Arduino YL69土壤濕度

int SoilPin = A0;
int Standard = 800;
void setup() {
Serial.begin(9600);
}
void loop() {
int result = analogRead(SoilPin);
Serial.print("Soil: ");
Serial.println(result);
if (result > Standard)
{
Serial.println("Alert");
}
delay(1000);
}

Ardunio Uno + ESP8266 ES-01 + YL69土壤濕度

#include <SoftwareSerial.h>

#define RX 3 //ESP8266 的 TX接3
#define TX 2 //ESP8266 RX接2

String ssid="D-Link_DIR-612"; //無線基地台識別
String pwd="123456789"; //無線基地台密碼
String IP = "192.168.20.3";
String cmd;

SoftwareSerial ESP8266(RX,TX);

//土壤濕度用變數
int SoilPin = A0;
int Standard = 800;

void setup()
{
pinMode(13,OUTPUT);
//digitalWrite(13,LOW);

Serial.begin(9600);
ESP8266.begin(9600);
cmd = "AT+RST";
sendToWifi(cmd);//使用AT+RST重新啟動ESP8266
delay(1000); //延遲1秒
//
cmd="AT+CWJAP=\"";
cmd+=ssid;
cmd+="\",\"";
cmd+=pwd;
cmd+="\"";
cmd+="\r\n";
Serial.println("*** SoftSerial connection to ESP8266 ***");
sendToWifi("AT+CWMODE=3\r\n"); // 設定為 STA 模式
sendToWifi(cmd); // 取得連線(視AP連線效能作調整,預設7000毫秒)//AT+CWJAP="D-Link_DIR-612","123456789"
sendToWifi("AT+CIFSR"); // 獲得 IP
sendToWifi("AT+CIPMUX=1\r\n"); // 開啟多除連接模式
sendToWifi("AT+CIPSERVER=1,80\r\n"); // 設定連接埠為 8080
Serial.println("Ready");
//
}

void loop(){
//手打指令用 Start
if (ESP8266.available()){
Serial.write(ESP8266.read());
}

if (Serial.available()){
ESP8266.write(Serial.read());
}
//手打指令用 END

//土壤濕度
int result = analogRead(SoilPin);
Serial.print("Soil: ");
Serial.println(result);
if (result > Standard)
{
Serial.println("Alert");
}
delay(1000);

//連線
cmd="AT+CIPSTART=\"TCP\",\""+IP+"\",80";
sendToWifi(cmd);//連線192.168.43.129網頁伺服器
if (ESP8266.find("Error")) {
Serial.println("無法連線網頁伺服器");
return;//跳出,後面程式不再執行
}
String GET="GET /test.php?soil=";
GET+=result;
GET+="\r\n\r\n";
cmd="AT+CIPSEND=" + String(GET.length());//傳送的字串長度
sendToWifi(cmd);
if (ESP8266.find(">")) { //若ESP8266準備接收資料
sendToWifi(GET); //傳送GET指令、網址與資料
} else { //沒有收到ESP8266準備接收資料的回應
cmd = "AT+CIPCLOSE";//結束連線
sendToWifi(cmd);
}
delay(1000); //延遲1秒

//---LED燈控制
cmd="AT+CIPSTART=\"TCP\",\""+IP+"\",80";
sendToWifi(cmd);//連線192.168.43.129網頁伺服器
if (ESP8266.find("Error")) {
Serial.println("無法連線網頁伺服器");
return;//跳出,後面程式不再執行
}

GET="GET /iot/turn.txt";
GET+="\r\n\r\n";
cmd="AT+CIPSEND=" + String(GET.length());//傳送的字串長度
sendToWifi(cmd);
if (ESP8266.find(">")) { //若ESP8266準備接收資料
ESP8266.print(GET);
delay(1000);
Serial.println("GData >"+GET);
if(ESP8266.find("On"))
{
digitalWrite(13,HIGH);
Serial.print("Turn On!!!");
}
else
{
digitalWrite(13,LOW);
Serial.print("Turn Off!!!");
}
} else { //沒有收到ESP8266準備接收資料的回應
cmd = "AT+CIPCLOSE";//結束連線
sendToWifi(cmd);
}
//
delay(1000);
}

void sendToWifi(String command){
ESP8266.println(command);
Serial.println(command);
}

伺服器接收端(test.php)

<?php
//資料庫 設定
$db_host = "localhost"; //路徑
$db_username = "root"; //帳號
$db_password = "1234"; //密碼
$db_name = "iot20211008";
//pdo -> mysql連線
try{
$db_link = new PDO("mysql:host={$db_host};dbname={$db_name};charset=utf8",$db_username,$db_password);
}catch(PDOException $e){
print "資料庫連結失敗...Msg:{$e->getMessage()}<br/>";
die();
}

echo $_GET["soil"];
$data = [$_GET["soil"]
];
$query_insert = "INSERT INTO sensor (soil, datex) VALUES (?, NOW())";
$stmt = $db_link->prepare($query_insert);
$stmt->execute($data);

//$date = date('Y-m-d H:i:s');

/*
foreach ($_REQUEST as $key => $value)
{
if ($key == "name") {
$name = $value;
}
if ($key == "hour") {
$hour = $value;
}
}
if ($hour < 5 || $hour > 19){
echo "$name,Good Night<br>";
}else if ( $hour < 12 ){
echo "$name,Good Morning<br>";
}else {
echo "$name,Good Afternoon<br>";
}
*/
?>

伺服器顯示頁 (index.php)

<!DOCTYPE html>
<?
include "head.php";
$file_path = "turn.txt";
if(file_exists($file_path)){
$fp = fopen($file_path,"r");
$str = fread($fp,filesize($file_path));//指定讀取大小,這裡把整個檔案內容讀取出來
}

$file_path2 = "turn2.txt";
if(file_exists($file_path2)){
$fp2 = fopen($file_path2,"r");
$str2 = fread($fp2,filesize($file_path2));//指定讀取大小,這裡把整個檔案內容讀取出來
}
?>
<html style="height: 100%">
<head>
<meta charset="utf-8">
<title>IoT專題</title>

<!--<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>-->
<!--<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.3/js/bootstrap.min.js"></script>-->
<!--<link rel="stylesheet" href="bootstrap.css">-->


</head>
<body style="height: 100%; margin: 0">
<center></br>
LED01:&nbsp <a class="btn btn-outline-secondary" href="turn.php?a=1on" role="button">On</a> &nbsp
<a class="btn btn-outline-secondary" href="turn.php?a=1off" role="button">Off</a>
State:<?echo $str = str_replace("\r\n","<br />",$str);?></br>
</br>
LED02:&nbsp <a class="btn btn-outline-secondary" href="turn.php?a=2on" role="button">On</a> &nbsp
<a class="btn btn-outline-secondary" href="turn.php?a=2off" role="button">Off</a>
State:<?echo $str2 = str_replace("\r\n","<br />",$str2);?>
</center></br>
<!--<header class="container">
<div class="footer col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
曲線圖練習
</div>
</header>-->


<div class="container">
<div class="row">
<div id="container" class="col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12" style="height: 500px"></div>
<script type="text/javascript" src="2echarts.min.js"></script>
<script type="text/javascript" src="echarts-gl.min.js"></script>
<!--<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@4/dist/echarts.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-gl@1/dist/echarts-gl.min.js"></script>-->
<!--<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-stat@1/dist/ecStat.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@4/dist/extension/dataTool.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@4/map/js/china.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@4/map/js/world.js"></script>
<script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=xfhhaTThl11qYVrqLZii6w8qE5ggnhrY&__ec_v__=20190126"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@4/dist/extension/bmap.min.js"></script>-->
<!--<script src="js.js"></script>-->
<?
include "js.php";
?>
</div></div>
<!--
<footer class="container">
<div class="footer col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
<p>曲線圖練習結束 </p>
</div>
</footer>
-->
<?
include "footer.php";
?>
</body>
</html>

伺服器顯示頁曲線圖 (js.php)

<?php
//資料庫 設定
$db_host = "localhost"; //路徑
$db_username = "root"; //帳號
$db_password = "1234"; //密碼
$db_name = "iot20211008";
//pdo -> mysql連線
try{
$db_link = new PDO("mysql:host={$db_host};dbname={$db_name};charset=utf8",$db_username,$db_password);
}catch(PDOException $e){
print "資料庫連結失敗...Msg:{$e->getMessage()}<br/>";
die();
}
$d="";
$da="";
$stmt = $db_link->prepare("SELECT * FROM sensor order by datex DESC ");
$stmt->execute();
$no=$stmt->rowCount();
while($row=$stmt->fetch()){
$d.="'".$row["datex"]."'".",";
$da.="'".$row["soil"]."'".",";
}
$h="";
$ha="";
$ta="";
$stmt = $db_link->prepare("SELECT * FROM sensor2 order by datex DESC");
$stmt->execute();
while($row=$stmt->fetch()){
$h.="'".$row["datex"]."'".",";
$ha.="'".$row["humidity"]."'".",";
$ta.="'".$row["temperature"]."'".",";
}
?>
<script>
var dom = document.getElementById("container");
var myChart = echarts.init(dom);
var app = {};
option = null;
option = {
title: {
text: ''
},
tooltip: {
trigger: 'axis'
},
legend: {
data: ['土壤', '溫度', '濕度']
},
/*grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},*/
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: {
type: 'category',
boundaryGap: false,
data: [<?=$d;?>]
},
yAxis: {
type: 'value'
},
series: [
{
name: '土壤',
type: 'line',
stack: '',
data: [<?=$da;?>]
},
{
name: '溫度',
type: 'line',
stack: '',
data: [<?=$ta;?>]
},
{
name: '濕度',
type: 'line',
stack: '',
data: [<?=$ha;?>]
}
]
};
;
if (option && typeof option === "object") {
myChart.setOption(option, true);

//根據視窗的大小變動圖表 --- 重點
window.onresize = function(){
myChart.resize();
}
}
</script>

L E D 控 制 ( t u r n . p h p )

<?
$a=$_GET["a"];
switch($a)
{
case "1on":
$str = "On";
$file = fopen("turn.txt","w+"); //開啟檔案
fwrite($file,$str);
fclose($file);
break;

case "1off":
$str = "Off";
$file = fopen("turn.txt","w+"); //開啟檔案
fwrite($file,$str);
fclose($file);
break;

case "2on":
$str = "On";
$file = fopen("turn2.txt","w+"); //開啟檔案
fwrite($file,$str);
fclose($file);
break;

case "2off":
$str = "Off";
$file = fopen("turn2.txt","w+"); //開啟檔案
fwrite($file,$str);
fclose($file);
break;
}
header( "location:index.php"); //回 index.php
?>


相關原碼: https://reurl.cc/OkME6g

Arduino 原碼 為 123.ino 壓縮檔內

WevSite 原碼 為 iot.rar

MySql 資料庫 為 iot20211008.sql

技術文件 : 專題.pdf

留言
avatar-img
留言分享你的想法!
avatar-img
吳佳鑫的沙龍
42會員
136內容數
獨立遊戲開發紀錄
吳佳鑫的沙龍的其他內容
2025/04/12
🗓 Steam 上市日期:2025/4/28 | 🖤 加入願望清單:https://store.steampowered.com/app/3634400/Elara/ 「他們說我太敏感,說我不合群。 但我只是——不想學會沉默。」 —Elara Quinn 你是否曾經在工作時,感
Thumbnail
2025/04/12
🗓 Steam 上市日期:2025/4/28 | 🖤 加入願望清單:https://store.steampowered.com/app/3634400/Elara/ 「他們說我太敏感,說我不合群。 但我只是——不想學會沉默。」 —Elara Quinn 你是否曾經在工作時,感
Thumbnail
2025/03/05
在靈異頻發的醫院夜班,小護士林筱筱意外發現她的冷酷上司——蘇醫生,竟然早已死亡五年,從此她與這位神秘的「鬼醫生」攜手處理靈異事件,並在驚魂不斷的夜班中逐漸建立起一段超越生死的羈絆。
Thumbnail
2025/03/05
在靈異頻發的醫院夜班,小護士林筱筱意外發現她的冷酷上司——蘇醫生,竟然早已死亡五年,從此她與這位神秘的「鬼醫生」攜手處理靈異事件,並在驚魂不斷的夜班中逐漸建立起一段超越生死的羈絆。
Thumbnail
2025/02/24
這是一篇懸疑驚悚小說,描述女主角江語珊調查一起離奇命案的故事。死者林曦是一位心理學教授,死於自家公寓,現場佈滿鏡子,死者嘴角帶著詭異的微笑。語珊在調查過程中發現,此案與一種名為「鏡像侵蝕」的心理現象有關,並逐漸被捲入其中。
Thumbnail
2025/02/24
這是一篇懸疑驚悚小說,描述女主角江語珊調查一起離奇命案的故事。死者林曦是一位心理學教授,死於自家公寓,現場佈滿鏡子,死者嘴角帶著詭異的微笑。語珊在調查過程中發現,此案與一種名為「鏡像侵蝕」的心理現象有關,並逐漸被捲入其中。
Thumbnail
看更多
你可能也想看
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
ESP32 連接 GPS模組 讀取gps 模組資料
Thumbnail
ESP32 連接 GPS模組 讀取gps 模組資料
Thumbnail
紅外線(IR)接收模組是一種常見的元件,可用於接收來自遙控器等設備的紅外線訊號。在本教學中,我們將使用Arduino來連接和讀取IR Receiver Module V2.0模組,以捕捉紅外線訊號的數值。讓我們開始吧!
Thumbnail
紅外線(IR)接收模組是一種常見的元件,可用於接收來自遙控器等設備的紅外線訊號。在本教學中,我們將使用Arduino來連接和讀取IR Receiver Module V2.0模組,以捕捉紅外線訊號的數值。讓我們開始吧!
Thumbnail
建立Modbus IO Server
Thumbnail
建立Modbus IO Server
Thumbnail
ESP8266 / ESP32單晶片的學習者或玩家常用板卡,依大小體積區分為 大型板卡: Arduino UNO/MEGA/M0 Pro , WEMOS D1 R2 ,WEMOS UNO 中型板卡: NodeMCU ESP8266-12E , ESP32/WROOM-32 , WEMOS D1
Thumbnail
ESP8266 / ESP32單晶片的學習者或玩家常用板卡,依大小體積區分為 大型板卡: Arduino UNO/MEGA/M0 Pro , WEMOS D1 R2 ,WEMOS UNO 中型板卡: NodeMCU ESP8266-12E , ESP32/WROOM-32 , WEMOS D1
Thumbnail
XAMPP 伺服器架設 S1. 下載與安裝 S2. 啟動XAMPP、Apache、Mysql S3. Mysql安全性設定 shell : --user=root password "1234" phpmyadmin(config.inc.php) S4. Apache設定
Thumbnail
XAMPP 伺服器架設 S1. 下載與安裝 S2. 啟動XAMPP、Apache、Mysql S3. Mysql安全性設定 shell : --user=root password "1234" phpmyadmin(config.inc.php) S4. Apache設定
Thumbnail
本專題為兩塊ESP8266-ESP01 ,分別為 Arduino+ESP-01+YL-69 土壤濕度檢測器與LED燈 ,以及 ESP-01 + DHT11 + LED 傳輸給伺服器端,並於伺服器上 WebSite 透過ESP-01上傳儲 存於 MYSQL 資料呈現曲線圖給前端使用者。此外,前端使用者
Thumbnail
本專題為兩塊ESP8266-ESP01 ,分別為 Arduino+ESP-01+YL-69 土壤濕度檢測器與LED燈 ,以及 ESP-01 + DHT11 + LED 傳輸給伺服器端,並於伺服器上 WebSite 透過ESP-01上傳儲 存於 MYSQL 資料呈現曲線圖給前端使用者。此外,前端使用者
Thumbnail
本專題為兩塊ESP8266-ESP01 ,分別為 Arduino+ESP-01+YL-69 土壤濕度檢測器與LED燈 ,以及 ESP-01 + DHT11 + LED 傳輸給伺服器端,並於伺服器上 WebSite 透過ESP-01上傳儲 存於 MYSQL 資料呈現曲線圖給前端使用者。此外,前端使用者
Thumbnail
本專題為兩塊ESP8266-ESP01 ,分別為 Arduino+ESP-01+YL-69 土壤濕度檢測器與LED燈 ,以及 ESP-01 + DHT11 + LED 傳輸給伺服器端,並於伺服器上 WebSite 透過ESP-01上傳儲 存於 MYSQL 資料呈現曲線圖給前端使用者。此外,前端使用者
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News