2019年7月11日 星期四
2019年7月10日 星期三
用wemos di dimi 玩物聯網(10)實作智能雲端澆灌系統
一、教學目標:整合土壤的溼度感測器、繼電器、抽水馬達、液晶顯示器等,建置一雲端澆灌控制系統,並將土壤溼度值記錄雲端
二、接線圖
(一)土壤溼度感測器
感測器腳位 D1 mini 接法
VCC→5V(電源腳位)
GND→GND(接地腳位)
AO→A0
(二)2x16LCD顯示器
D1 Mini LCD1602
GND GND
3v3 VCC
D2 SDA
D1 SCL
(三)繼電器
感測器腳位 d1 mini 接法
1. DC+→3.3V或5V(電源腳位)
2. DC-→GND(接地腳位)
3. IN→D6(數位腳位)
com:接馬達負極
NO:接電源負極
三、程式碼
1.整合成智能澆灌系統
2.將資料送至雲端記錄
二、接線圖
(一)土壤溼度感測器
感測器腳位 D1 mini 接法
VCC→5V(電源腳位)
GND→GND(接地腳位)
AO→A0
(二)2x16LCD顯示器
D1 Mini LCD1602
GND GND
3v3 VCC
D2 SDA
D1 SCL
(三)繼電器
感測器腳位 d1 mini 接法
1. DC+→3.3V或5V(電源腳位)
2. DC-→GND(接地腳位)
3. IN→D6(數位腳位)
com:接馬達負極
NO:接電源負極
三、程式碼
1.整合成智能澆灌系統
#include <Wire.h>
#include <esp_LiquidCrystal_I2C.h>
esp_LiquidCrystal_I2C mylcd(0x27, 16, 2);
const int AnalogIn = A0; //設定類比腳位
int readingIn = 0; //測量值
int no = 0;//計數器
int relayPin = 12; //繼電器引腳
int limitValue = 700; //限值(需要調整),
//在空氣中的溼度感測器時是1024 或是 0
void setup() {
Serial.begin(9600);
pinMode(relayPin , OUTPUT);
mylcd.init();
mylcd.backlight();
mylcd.setCursor(0, 0);
mylcd.print("Welcome to");
mylcd.setCursor(0, 1);
mylcd.print("My sensor");
delay(1000);
}
void loop() {
no++;
readingIn = analogRead(AnalogIn); //讀取數值
Serial.println(readingIn);
mylcd.clear();
mylcd.setCursor(0, 0);//移到第一行第一個位置
mylcd.print("NO:");
mylcd.print(no);
mylcd.setCursor(0, 1);//移到第二行第一個位置
mylcd.print(readingIn);
if (readingIn > limitValue) {
digitalWrite(relayPin , HIGH);
mylcd.setCursor(7, 1);//移到第二行第8個位置
mylcd.print("Pump ON");
delay(1000);
} else {
digitalWrite(relayPin , LOW);
mylcd.setCursor(7, 1);//移到第二行第8個位置
mylcd.print("Pump Off");
delay(1000);
}
delay(1000);//每秒測量一次
}
2.將資料送至雲端記錄
#include <Wire.h>
#include <esp_LiquidCrystal_I2C.h>
#include <ESP8266WiFi.h>
const char* ssid = "mywifi"; //wifi 帳號
const char* password = "aaaa";// wifi 密碼
const char* safekey = "1234";//檢查碼
const uint16_t port = 80; //上傳的主機port
const char* host = "192.168.0.100"; //上傳的主機ip
const char* php_url = "/myfarm/t2.php";//上傳在主機的程式
byte sensor_id = 1; //偵測器ID
esp_LiquidCrystal_I2C mylcd(0x27, 16, 2);
const int AnalogIn = A0; //設定類比腳位
int readingIn = 0; //測量值
int no = 0;//計數器
int relayPin = 12; //繼電器引腳
int limitValue = 800; //限值(需要調整)0
WiFiClient client;
void setup()
{
Serial.begin(9600);
pinMode(relayPin , OUTPUT);
mylcd.init();
mylcd.backlight();
mylcd.clear();
mylcd.setCursor(0, 0);
mylcd.print("System start!");
WiFi.begin(ssid, password);
Serial.println("");
int t = 0;
mylcd.setCursor(0, 1);
while (WiFi.status() != WL_CONNECTED) {
t++;
if (t > 15) break;
Serial.print(".");
mylcd.print(".");
delay(500);
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
mylcd.setCursor(0, 1);
mylcd.print(WiFi.localIP());
delay(2000);
mylcd.clear();
}
void loop()
{
no++;
readingIn = analogRead(AnalogIn); //讀取數值
Serial.println(readingIn);
if (readingIn > 0) {
no++;
String things_request = "GET " + String(php_url);
things_request += "?safekey=" + String(safekey);
things_request += "&sensor_id=" + String(sensor_id);
things_request += "&hh=" + String(readingIn) + "\r\n\r\n";
Serial.println(things_request);
if (client.connect(host, port)) {
client.print(things_request);
Serial.println("Request: [ok]");
client.stop();
} else {
Serial.println("Request: [error]");
}
mylcd.clear();
mylcd.setCursor(0, 0);
mylcd.print(no);
mylcd.setCursor(7, 0);
mylcd.print(String("H:") + String(readingIn));
if (readingIn > limitValue) {
digitalWrite(relayPin , HIGH);
mylcd.setCursor(0, 1);//移到第二行第8個位置
mylcd.print("Pump ON");
delay(1000);
} else {
digitalWrite(relayPin , LOW);
mylcd.setCursor(0, 1);//移到第二行第8個位置
mylcd.print("Pump Off");
delay(1000);
}
delay(5000);//間隔5秒送一次資料,建議修改
}
}
四、執行結果
用wemos di dimi 玩物聯網(9)繼電器的使用
一、教學目標:學習繼電器的操作與控制抽水馬達。
繼電器是一種電子控制器件,是用小的電流去控制較大電流的一種「自動開關」。因為抽水馬達所需的電流比較大,故無法直接利用di mini 的電源去推動。故我們增加了一個麵包板電源模組進行供電。並將其接地線(負極與 d1 mini 上的G 腳位相接)
1.繼電器規格:
模組工作電壓:+5VDC
RELAY 規格:10A 250VAC, 10A 125VAC, 10A 30VDC
com:共用端
NO:常開端
NC:常閉端
(1)繼電器沒有電壓時,是公共端與常閉端 接通。
(2)繼電器 有 電壓時,是公共端與常開端 接通。
2.麵包板電源模組規格
輸入電壓:6.5-12V﹝直流﹞或USB供電
輸出電壓:3.3V、5V可切換
最大輸出電流:<700ma
上下兩路獨立控制,可切換為0V、3.3V、5V
板載兩組3.3V、5V直流輸出插針,方便引用,並有電源指示led燈
3.抽水馬達規格
電流:接12V時300 ma 功率:3.6W(4.5~12V)
流量:12V時 2L/分鐘
進水口:內徑7.5mm 外徑10mm
出水口:內徑5.5mm 外徑8mm
二、接線圖
感測器腳位 d1 mini 接法
1. DC+→3.3V或5V(電源腳位)
2. DC-→GND(接地腳位)
3. IN→D6(數位腳位)
com:接馬達負極
NO:接電源負極
三、程式碼
1.每3秒鐘,讓繼電器起動一次,並讓抽水馬達
四、執行結果
五、參考資料
https://tutorials.webduino.io/zh-tw/docs/basic/component/relay.html
https://www.icshop.com.tw/product_info.php/products_id/26022/Twesid/5857e09e18c2ab428f8b7fb52cc92b5c
繼電器是一種電子控制器件,是用小的電流去控制較大電流的一種「自動開關」。因為抽水馬達所需的電流比較大,故無法直接利用di mini 的電源去推動。故我們增加了一個麵包板電源模組進行供電。並將其接地線(負極與 d1 mini 上的G 腳位相接)
1.繼電器規格:
模組工作電壓:+5VDC
RELAY 規格:10A 250VAC, 10A 125VAC, 10A 30VDC
com:共用端
NO:常開端
NC:常閉端
(1)繼電器沒有電壓時,是公共端與常閉端 接通。
(2)繼電器 有 電壓時,是公共端與常開端 接通。
2.麵包板電源模組規格
輸入電壓:6.5-12V﹝直流﹞或USB供電
輸出電壓:3.3V、5V可切換
最大輸出電流:<700ma
上下兩路獨立控制,可切換為0V、3.3V、5V
板載兩組3.3V、5V直流輸出插針,方便引用,並有電源指示led燈
3.抽水馬達規格
電流:接12V時300 ma 功率:3.6W(4.5~12V)
流量:12V時 2L/分鐘
進水口:內徑7.5mm 外徑10mm
出水口:內徑5.5mm 外徑8mm
二、接線圖
感測器腳位 d1 mini 接法
1. DC+→3.3V或5V(電源腳位)
2. DC-→GND(接地腳位)
3. IN→D6(數位腳位)
com:接馬達負極
NO:接電源負極
三、程式碼
1.每3秒鐘,讓繼電器起動一次,並讓抽水馬達
// 繼電器控制練習
//1、DC+:接電源正極 5v
//2、DC-:接電源負極
//3、IN:D6 (gpio 12)
int relayPin = 12; //繼電器引腳
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(relayPin , OUTPUT);
}
void loop() {
digitalWrite(relayPin , HIGH);
delay(3000);
digitalWrite(relayPin , LOW);
delay(3000);
}
四、執行結果
五、參考資料
https://tutorials.webduino.io/zh-tw/docs/basic/component/relay.html
https://www.icshop.com.tw/product_info.php/products_id/26022/Twesid/5857e09e18c2ab428f8b7fb52cc92b5c
用wemos di dimi 玩物聯網(8)土壤溼度感測器的使用
一、教學目標:學習類比輸入,將土壤的溼度作立即的測量,並顯示於顯示器
二、接線圖
感測器腳位 d1 mini 接法
1. VCC→3.3V或5V(電源腳位)
2. GND→GND(接地腳位)
3. DO→D1~D9(數位腳位) 可以設定邊界值(藍色的可變電阻是用於土壤濕度的閥值調節)4. AO→A0(類比腳位), 本範例是接在此腳位A0
三、程式碼
1.利用serial monitor(序串埠監視窗)顯示結果
2.將測量結果顯示在2x16LCD上
五、參考資料
http://lihan.shinyo.bixone.com/Arduino/arduino-2015.10.13-5.html
二、接線圖
感測器腳位 d1 mini 接法
1. VCC→3.3V或5V(電源腳位)
2. GND→GND(接地腳位)
3. DO→D1~D9(數位腳位) 可以設定邊界值(藍色的可變電阻是用於土壤濕度的閥值調節)4. AO→A0(類比腳位), 本範例是接在此腳位A0
三、程式碼
1.利用serial monitor(序串埠監視窗)顯示結果
const int AnalogIn = A0; //設定類比腳位
int readingIn = 0; //測量值
void setup() {
Serial.begin(9600);
}
void loop() {
readingIn = analogRead(AnalogIn); //讀取數值
Serial.println(readingIn);
delay(500);
}
2.將測量結果顯示在2x16LCD上
#include <Wire.h>
#include <esp_LiquidCrystal_I2C.h>
esp_LiquidCrystal_I2C mylcd(0x27, 16, 2);
const int AnalogIn = A0; //設定類比腳位
int readingIn = 0; //測量值
int no = 0;//計數器
void setup() {
Serial.begin(9600);
mylcd.init();
mylcd.backlight();
mylcd.setCursor(0, 0);
mylcd.print("Welcome to");
mylcd.setCursor(0, 1);
mylcd.print("my sensor");
delay(2000);
}
void loop() {
no++;
readingIn = analogRead(AnalogIn); //讀取數值
Serial.println(readingIn);
mylcd.clear();
mylcd.setCursor(0, 0);//移到第一行第一個位置
mylcd.print("NO:");
mylcd.print(no);
mylcd.setCursor(0, 1);//移到第二行第一個位置
mylcd.print(readingIn);
delay(1000);//每秒測量一次
}
四、執行結果
五、參考資料
http://lihan.shinyo.bixone.com/Arduino/arduino-2015.10.13-5.html
2019年6月21日 星期五
2019年6月18日 星期二
用wemos d1 mini 玩物聯網(7) PMS5003T 實作PM2.5 感測器
一、感測器介紹
PMS5003T是一款可以同時監測空氣中顆粒物濃度及溫濕度的二合一感測器。其中顆粒物濃度的監測基於鐳射散射原理,可連續採集並計算單位體積內空氣中不同粒徑的懸浮顆粒物個數,即顆粒物濃度分佈,進而換算成為質量濃度。
二、接線圖
VCC-> 5V
GND->GND
RXD->D6
TXD->D5
三、程式碼
PMS5003T是一款可以同時監測空氣中顆粒物濃度及溫濕度的二合一感測器。其中顆粒物濃度的監測基於鐳射散射原理,可連續採集並計算單位體積內空氣中不同粒徑的懸浮顆粒物個數,即顆粒物濃度分佈,進而換算成為質量濃度。
二、接線圖
GND->GND
RXD->D6
TXD->D5
三、程式碼
#include <Wire.h>
#include <esp_LiquidCrystal_I2C.h>
#include <ESP8266WiFi.h>
#include <SoftwareSerial.h>
const char* ssid = "HJN"; //wifi 帳號
const char* password = "11111111";// wifi 密碼
const char* safekey = "fhjh";//檢查碼
const uint16_t port = 80; //上傳的主機port
const char* host = "192.168.137.1"; //上傳的主機ip
const char* php_url = "/airbox/t2.php";//上傳在主機的程式
byte sensor_id = 1; //偵測器ID
long lPmcf10;
long lPmcf25;
long lPmcf100;
long lTemperature;
long lHumidity;
esp_LiquidCrystal_I2C mylcd(0x27, 16, 2);
SoftwareSerial pms5003t_Serial(D5, D6);
#define PMS5003T_PM10 1
#define PMS5003T_PM25 2
#define PMS5003T_PM100 3
#define PMS5003T_TEMPER 4
#define PMS5003T_HUMI 5
long pms_pmcf10 = 0;
long pms_pmcf25 = 0;
long pms_pmcf100 = 0;
long pms_pmat10 = 0;
long pms_pmat25 = 0;
long pms_pmat100 = 0;
long pms_Temperature = 0;
long pms_Humidity = 0;
int no = 0;
WiFiClient client;
void setup()
{
Serial.begin(9600);
mylcd.init();
mylcd.backlight();
pms5003t_Serial.begin(9600);
lPmcf10 = 0;
lPmcf25 = 0;
lPmcf100 = 0;
lTemperature = 0;
lHumidity = 0;
mylcd.clear();
mylcd.setCursor(0, 0);
mylcd.print("Yo Airbox");
WiFi.begin(ssid, password);
Serial.println("");
int t = 0;
mylcd.setCursor(0, 1);
while (WiFi.status() != WL_CONNECTED) {
t++;
if (t > 15) break;
Serial.print(".");
mylcd.print(".");
delay(500);
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
mylcd.setCursor(0, 1);
mylcd.print(WiFi.localIP());
delay(2000);
mylcd.clear();
}
void loop()
{
lPmcf10 = 0;
lPmcf10 = pms5003t_read_(PMS5003T_PM10);
Serial.println((String("PM1.0: ") + String(lPmcf10)));
delay(500);
lPmcf25 = pms5003t_read_(PMS5003T_PM25);
Serial.println((String("PM2.5: ") + String(lPmcf25)));
delay(500);
lPmcf100 = pms5003t_read_(PMS5003T_PM100);
Serial.println((String("PM10: ") + String(lPmcf100)));
delay(500);
lTemperature = pms5003t_read_(PMS5003T_TEMPER);
Serial.println((String("Temperature: ") + String(lTemperature)));
delay(500);
lHumidity = pms5003t_read_(PMS5003T_HUMI);
Serial.println((String("Humidity: ") + String(lHumidity)));
delay(500);
if (lPmcf10 > 0) {
no++;
String things_request = "GET " + String(php_url);
things_request += "?safekey=" + String(safekey);
things_request += "&sensor_id=" + String(sensor_id);
things_request += "&pm10=" + String(lPmcf10);
things_request += "&pm25=" + String(lPmcf25);
things_request += "&pm100=" + String(lPmcf100);
things_request += "&tt=" + String(lTemperature);
things_request += "&hh=" + String(lHumidity) + "\r\n\r\n";
Serial.println(things_request);
if (client.connect(host, port)) {
client.print(things_request);
Serial.println("Request: [ok]");
client.stop();
} else {
Serial.println("Request: [error]");
}
if (client.connect("api.thingspeak.com", 80)) {
String things_request = "GET /update?api_key=Your_Write_API_Key&field1=" + String(lPmcf10) + "&field2=" + String(lPmcf25) + "&field3=" + String(lPmcf100) + "&field4=" + String(lTemperature) + "&field5=" + String(lHumidity) + "\r\n\r\n";
// client.print(things_request);
client.stop();
}
mylcd.clear();
mylcd.setCursor(0, 0);
mylcd.print(no);
mylcd.setCursor(5, 0);
mylcd.print(String(" PM2.5: ") + String(lPmcf25) );
mylcd.setCursor(0, 1);
mylcd.print(String("T:") + String(lTemperature) + String("C"));
mylcd.setCursor(9, 1);
mylcd.print(String("H:") + String(lHumidity) + String("%"));
delay(5000);
}
}
//G5t check
long pms5003t_read_(int datatype) {
int count = 0;
unsigned char c;
unsigned char high;
pms5003t_Serial.listen();
while (pms5003t_Serial.available()) {
c = pms5003t_Serial.read();
if ((count == 0 && c != 0x42) || (count == 1 && c != 0x4d)) {
Serial.println("pms5003t check failed");
break;
}
if (count > 27) {
Serial.println("pms5003t completed");
break;
}
else if (count == 4 || count == 6 || count == 8 || count == 10 || count == 12 || count == 14 || count == 24 || count == 26) {
high = c;
}
else if (count == 5) {
pms_pmcf10 = 256 * high + c;
}
else if (count == 7) {
pms_pmcf25 = 256 * high + c;
}
else if (count == 9) {
pms_pmcf100 = 256 * high + c;
}
else if (count == 11) {
pms_pmat10 = 256 * high + c;
}
else if (count == 13) {
pms_pmat25 = 256 * high + c;
}
else if (count == 15) {
pms_pmat100 = 256 * high + c;
}
else if (count == 25) {
pms_Temperature = (256 * high + c) / 10;
}
else if (count == 27) {
pms_Humidity = (256 * high + c) / 10;
}
count++;
}
while (pms5003t_Serial.available()) pms5003t_Serial.read();
if (datatype == PMS5003T_PM10)
return pms_pmcf10;
else if (datatype == PMS5003T_PM25)
return pms_pmcf25;
else if (datatype == PMS5003T_PM100)
return pms_pmcf100;
else if (datatype == PMS5003T_TEMPER)
return pms_Temperature;
else if (datatype == PMS5003T_HUMI)
return pms_Humidity;
}
四、執行結果
五、參考資料
用wemos d1 mini 玩物聯網(6) IFTTT 的介紹與基本使用
一、IFTTT簡介
FTTT 簡單來說就是 當 什麼 發生時 就做 什麼 事, 這 2 個「什麼」就是「服務」, 讓不同的平台、服務可以整合在一起。
二、使用方法
(1)註冊 官網:https://ifttt.com/ ,請點選 Sign Up 註冊帳號, 或是直接按Sign In ,可以利用GMAIL帳號作同步認證作登入
(2)登入後,點選個人帳號,再點選New Applet,將會有一系列的步驟來協助建立。
步驟5 建立通知email的內容格式設定,有支援中文。
(1) evenName:代表觸發器名稱,以本例為tt123
(2)OccurredAt 代表發生時間
(3)Value1 , Value2, Valu3代表要傳送的資料
用兩個大括號,前後夾,代表它是一個變數,不要去動到。
<?php
$url ="http://maker.ifttt.com/trigger/line_0606/with/key/bEcMfXQzyIpvECSsXvEJ2n?";
$url .="value1=a&value22=b&value3=c";
echo $response = file_get_contents($url);
?>
FTTT 簡單來說就是 當 什麼 發生時 就做 什麼 事, 這 2 個「什麼」就是「服務」, 讓不同的平台、服務可以整合在一起。
二、使用方法
(1)註冊 官網:https://ifttt.com/ ,請點選 Sign Up 註冊帳號, 或是直接按Sign In ,可以利用GMAIL帳號作同步認證作登入
(2)登入後,點選個人帳號,再點選New Applet,將會有一系列的步驟來協助建立。
再點選 「+this」
步驟1.Choose a service, 我們選擇 webhook進行篩選,再點選藍色方塊,進入下個步驟。
所謂的webhook的利用傳送一段網址給ifttt, 來觸發程式。
所謂的webhook的利用傳送一段網址給ifttt, 來觸發程式。
步驟2.Choose trigger(選擇觸發器),將你的「事件」命名,我們 命名為tt123 ,是利用「收到網絡請求」的方式來進行。
步驟3. 接下來設定系統要做什麼事情,點選「+that」
選擇一個行動的服務,我們選擇用「email」來通知該事件被觸發,也就是事件觸發後立即發信。內建信箱是登入的email, 當然也可以選擇line,
步驟4 .點選,send me a email 藍色方塊,進行設定
(1) evenName:代表觸發器名稱,以本例為tt123
(2)OccurredAt 代表發生時間
(3)Value1 , Value2, Valu3代表要傳送的資料
用兩個大括號,前後夾,代表它是一個變數,不要去動到。
步驟6 完成後,點選下 Receive notifications when this Applet runs 即可完成啟動。
步驟 7
接下來進行 尋找觸發的網址格式,我們直接進到以下網址
https://ifttt.com/maker_webhooks,選擇右上角的「Document」
觸發器名稱:tt123
your key=系統會給您一串文字
填入觸發器的名稱,按下「Test It!」即可進行測試。
也可以直接打入以下網址:
即可以試驗,其中value1=a代表會傳遞a
https://maker.ifttt.com/trigger/tt123/with/key/your key?valu1=a&value=b&value=c
t3.php
$url ="http://maker.ifttt.com/trigger/line_0606/with/key/bEcMfXQzyIpvECSsXvEJ2n?";
$url .="value1=a&value22=b&value3=c";
echo $response = file_get_contents($url);
?>
參考資料
- http://blog.ilc.edu.tw/blog/index.php?op=printView&articleId=675501&blogId=868
- http://hammer1007.blogspot.com/2018/07/esp82665-5ifttt-line.html
訂閱:
文章 (Atom)







