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.整合成智能澆灌系統
  1. #include <Wire.h>
  2. #include <esp_LiquidCrystal_I2C.h>
  3. esp_LiquidCrystal_I2C mylcd(0x27, 16, 2);
  4. const int AnalogIn = A0; //設定類比腳位
  5. int readingIn = 0; //測量值
  6. int no = 0;//計數器
  7. int relayPin = 12; //繼電器引腳
  8. int limitValue = 700; //限值(需要調整),
  9. //在空氣中的溼度感測器時是1024 或是 0
  10. void setup() {
  11. Serial.begin(9600);
  12. pinMode(relayPin , OUTPUT);
  13. mylcd.init();
  14. mylcd.backlight();
  15. mylcd.setCursor(0, 0);
  16. mylcd.print("Welcome to");
  17. mylcd.setCursor(0, 1);
  18. mylcd.print("My sensor");
  19. delay(1000);
  20. }
  21. void loop() {
  22. no++;
  23. readingIn = analogRead(AnalogIn); //讀取數值
  24. Serial.println(readingIn);
  25. mylcd.clear();
  26. mylcd.setCursor(0, 0);//移到第一行第一個位置
  27. mylcd.print("NO:");
  28. mylcd.print(no);
  29. mylcd.setCursor(0, 1);//移到第二行第一個位置
  30. mylcd.print(readingIn);
  31. if (readingIn > limitValue) {
  32. digitalWrite(relayPin , HIGH);
  33. mylcd.setCursor(7, 1);//移到第二行第8個位置
  34. mylcd.print("Pump ON");
  35. delay(1000);
  36. } else {
  37. digitalWrite(relayPin , LOW);
  38. mylcd.setCursor(7, 1);//移到第二行第8個位置
  39. mylcd.print("Pump Off");
  40. delay(1000);
  41. }
  42. delay(1000);//每秒測量一次
  43. }

2.將資料送至雲端記錄
  1. #include <Wire.h>
  2. #include <esp_LiquidCrystal_I2C.h>
  3. #include <ESP8266WiFi.h>
  4. const char* ssid = "mywifi"; //wifi 帳號
  5. const char* password = "aaaa";// wifi 密碼
  6. const char* safekey = "1234";//檢查碼
  7. const uint16_t port = 80; //上傳的主機port
  8. const char* host = "192.168.0.100"; //上傳的主機ip
  9. const char* php_url = "/myfarm/t2.php";//上傳在主機的程式
  10. byte sensor_id = 1; //偵測器ID
  11. esp_LiquidCrystal_I2C mylcd(0x27, 16, 2);
  12. const int AnalogIn = A0; //設定類比腳位
  13. int readingIn = 0; //測量值
  14. int no = 0;//計數器
  15. int relayPin = 12; //繼電器引腳
  16. int limitValue = 800; //限值(需要調整)0
  17. WiFiClient client;
  18. void setup()
  19. {
  20. Serial.begin(9600);
  21. pinMode(relayPin , OUTPUT);
  22. mylcd.init();
  23. mylcd.backlight();
  24. mylcd.clear();
  25. mylcd.setCursor(0, 0);
  26. mylcd.print("System start!");
  27. WiFi.begin(ssid, password);
  28. Serial.println("");
  29. int t = 0;
  30. mylcd.setCursor(0, 1);
  31. while (WiFi.status() != WL_CONNECTED) {
  32. t++;
  33. if (t > 15) break;
  34. Serial.print(".");
  35. mylcd.print(".");
  36. delay(500);
  37. }
  38. Serial.println("");
  39. Serial.print("Connected to ");
  40. Serial.println(ssid);
  41. Serial.print("IP address: ");
  42. Serial.println(WiFi.localIP());
  43. mylcd.setCursor(0, 1);
  44. mylcd.print(WiFi.localIP());
  45. delay(2000);
  46. mylcd.clear();
  47. }
  48. void loop()
  49. {
  50. no++;
  51. readingIn = analogRead(AnalogIn); //讀取數值
  52. Serial.println(readingIn);
  53. if (readingIn > 0) {
  54. no++;
  55. String things_request = "GET " + String(php_url);
  56. things_request += "?safekey=" + String(safekey);
  57. things_request += "&sensor_id=" + String(sensor_id);
  58. things_request += "&hh=" + String(readingIn) + "\r\n\r\n";
  59. Serial.println(things_request);
  60. if (client.connect(host, port)) {
  61. client.print(things_request);
  62. Serial.println("Request: [ok]");
  63. client.stop();
  64. } else {
  65. Serial.println("Request: [error]");
  66. }
  67. mylcd.clear();
  68. mylcd.setCursor(0, 0);
  69. mylcd.print(no);
  70. mylcd.setCursor(7, 0);
  71. mylcd.print(String("H:") + String(readingIn));
  72. if (readingIn > limitValue) {
  73. digitalWrite(relayPin , HIGH);
  74. mylcd.setCursor(0, 1);//移到第二行第8個位置
  75. mylcd.print("Pump ON");
  76. delay(1000);
  77. } else {
  78. digitalWrite(relayPin , LOW);
  79. mylcd.setCursor(0, 1);//移到第二行第8個位置
  80. mylcd.print("Pump Off");
  81. delay(1000);
  82. }
  83. delay(5000);//間隔5秒送一次資料,建議修改
  84. }
  85. }
四、執行結果










用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秒鐘,讓繼電器起動一次,並讓抽水馬達

  1. // 繼電器控制練習
  2. //1、DC+:接電源正極 5v
  3. //2、DC-:接電源負極
  4. //3、IN:D6 (gpio 12)
  5. int relayPin = 12; //繼電器引腳
  6. void setup() {
  7. // initialize digital pin LED_BUILTIN as an output.
  8. pinMode(relayPin , OUTPUT);
  9. }
  10.  
  11. void loop() {
  12. digitalWrite(relayPin , HIGH);
  13. delay(3000);
  14. digitalWrite(relayPin , LOW);
  15. delay(3000);
  16. }
  17.  

四、執行結果


五、參考資料


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(序串埠監視窗)顯示結果

  1. const int AnalogIn = A0; //設定類比腳位
  2. int readingIn = 0; //測量值
  3.  
  4. void setup() {
  5. Serial.begin(9600);
  6. }
  7.  
  8. void loop() {
  9. readingIn = analogRead(AnalogIn); //讀取數值
  10. Serial.println(readingIn);
  11. delay(500);
  12. }
  13.  

2.將測量結果顯示在2x16LCD上
  1. #include <Wire.h>
  2. #include <esp_LiquidCrystal_I2C.h>
  3. esp_LiquidCrystal_I2C mylcd(0x27, 16, 2);
  4.  
  5. const int AnalogIn = A0; //設定類比腳位
  6. int readingIn = 0; //測量值
  7. int no = 0;//計數器
  8.  
  9. void setup() {
  10. Serial.begin(9600);
  11. mylcd.init();
  12. mylcd.backlight();
  13. mylcd.setCursor(0, 0);
  14. mylcd.print("Welcome to");
  15. mylcd.setCursor(0, 1);
  16. mylcd.print("my sensor");
  17. delay(2000);
  18. }
  19. void loop() {
  20. no++;
  21. readingIn = analogRead(AnalogIn); //讀取數值
  22. Serial.println(readingIn);
  23. mylcd.clear();
  24. mylcd.setCursor(0, 0);//移到第一行第一個位置
  25. mylcd.print("NO:");
  26. mylcd.print(no);
  27. mylcd.setCursor(0, 1);//移到第二行第一個位置
  28. mylcd.print(readingIn);
  29. delay(1000);//每秒測量一次
  30. }
四、執行結果
五、參考資料
http://lihan.shinyo.bixone.com/Arduino/arduino-2015.10.13-5.html