---
title: 農業科技2-暗渠排水
tags: 農業科技
---
裝switch開關-有過會有 "ㄆㄧㄚˋ"
DC+接VCC
DC-接GND
D10接NI
CODE要動要加入函式庫-草稿-匯入函式庫ZIP檔
感知器接觸不良濕度就會沒反應
````#include <SoftwareSerial.h>
#include <Wire.h>
#include <avr/wdt.h>
//lcd需要的涵數
#include <motoLiquidCrystal_I2C.h>
LiquidCrystal_I2C mylcd(0x27,16,2);
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
//濕度感測
pinMode(A0, INPUT);
//switch 開關 1
pinMode(10, OUTPUT);
//lcd
mylcd.init();
mylcd.backlight();
}
/*循環區*/
void loop()
{
digitalWrite(13,HIGH);
Serial.println("on");
Serial.println(analogRead(A0));
int value_a0 = 1023 - analogRead(A0);
Serial.println(value_a0);
//設定LCD要列印在第0個位置,第0列。
mylcd.setCursor(0,0);
mylcd.print("SM:");
mylcd.setCursor(4,0);
mylcd.print(value_a0);
if (value_a0 > 30 && value_a0 < 450) {
digitalWrite(10,HIGH);
//設定LCD要列印在第0個位置,第一列。
mylcd.setCursor(0,1);
mylcd.print("SWITCH:");
mylcd.setCursor(8,1);
mylcd.print("ON ");
}else {
digitalWrite(10,LOW);
//設定LCD要列印在第0個位置,第一列。
mylcd.setCursor(0,1);
mylcd.print("SWITCH:");
mylcd.setCursor(8,1);
mylcd.print("OFF ");
}
digitalWrite(13,LOW);
//Serial.println("off");
delay(1000);
}
````
剪下來的電-正接正(紅)-com/負接負(黑)

棕-正極-5-24V 黃OUT=信號線 藍=GND=負極
土壤溼度要滿足/開水
````#include <Wire.h>
#include <SoftwareSerial.h>
//看門狗測試,如果秒數超過會重開機
#include <avr/wdt.h>
//lcd需要的涵數
#include <motoLiquidCrystal_I2C.h>
//LiquidCrystal_I2C lcd(0x3F,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display
LiquidCrystal_I2C mylcd(0x27,16,2);
int Liquid_level=0;
void setup()
{
//數位輸出13支腳,LED
pinMode(13, OUTPUT);
Serial.begin(9600);
//濕度感測
pinMode(A0, INPUT);
//switch開關1
pinMode(10, OUTPUT);
//水位傳感器
pinMode(5,INPUT);
//lcd
mylcd.init();
mylcd.backlight();
//----------------------------------------------------------看門狗
wdt_enable(WDTO_8S); //當機8秒後重開機
// Valid delays:
// WDTO_15MS
// WDTO_30MS
// WDTO_60MS
// WDTO_120MS
// WDTO_250MS
// WDTO_500MS
// WDTO_1S
// WDTO_2S
// WDTO_4S
// WDTO_8S
//-------------------------------------------------------------
}
void loop()
{
//變數宣告
int value_a0 = 1023 - analogRead(A0);
//int value_a0 = analogRead(A0);
Serial.print("土壤濕度:");
Serial.println(value_a0);
Liquid_level=digitalRead(5);
Serial.print("水位訊號:");
Serial.println(Liquid_level);
//開關控制-土壤濕度-----------------------
if (value_a0 > 20 && value_a0 < 600) {
//判斷水位
if (Liquid_level == 1) {
digitalWrite(10,HIGH);
//設定LCD要列印在第0個位置,第一列。
mylcd.setCursor(0,1);
mylcd.print("SWITCH:");
mylcd.setCursor(8,1);
mylcd.print("ON ");
}else {
digitalWrite(10,LOW);
//設定LCD要列印在第0個位置,第一列。
mylcd.setCursor(0,1);
mylcd.print("SWITCH:");
mylcd.setCursor(8,1);
mylcd.print("OFF");
}
}else {
digitalWrite(10,LOW);
//設定LCD要列印在第0個位置,第一列。
mylcd.setCursor(0,1);
mylcd.print("SWITCH:");
mylcd.setCursor(8,1);
mylcd.print("OFF");
}
//開關控制-土壤濕度-----------------------
digitalWrite(13,LOW);
delay(300);
digitalWrite(13,HIGH);
delay(300);
digitalWrite(13,LOW);
//同步顯示在LCD與LED
//設定LCD要列印在第0個位置,第0列。
mylcd.setCursor(0,0);
mylcd.print("SM:");
mylcd.setCursor(3,0);
mylcd.print(" ");
mylcd.setCursor(3,0);
mylcd.print(value_a0);
mylcd.setCursor(8,0);
mylcd.print("WT:");
mylcd.setCursor(11,0);
mylcd.print(Liquid_level);
Serial.println(value_a0);
Serial.println(Liquid_level);
delay(1000);
//看門狗測試,如果秒數超過會重開機
wdt_reset(); // reset watch dog timer
}
````
wdt_enable(WDTO_8S); //當機8秒後重開機
空氣溫溼度感知器
````#include <SoftwareSerial.h>
#include <Wire.h>
#include "motoDHT.h"
//DHT 01 D9
#define DHTPIN1 9 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22
DHT dht(DHTPIN1, DHTTYPE);
//DHT 02 D10
#define DHTPIN2 10 // what pin we're connected to
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22
DHT dht2(DHTPIN2, DHTTYPE);
//DHT 03 D11
#define DHTPIN3 11 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
DHT dht3(DHTPIN3, DHTTYPE);
//lcd需要的涵數
#include <motoLiquidCrystal_I2C.h>
LiquidCrystal_I2C mylcd(0x27,16,2);
/* LED 閃爍,延遲 1 秒 */
/*宣告區*/
void setup()
{
//在9600 bps開啟串列傳輸 erial.println 要可用需先加下列這段
Serial.begin(9600);
pinMode(13, OUTPUT); //設定第 13 pin 腳模式為輸出
//溫濕度
//Serial.begin(9600);
Serial.println("DHT11 01");
dht.begin();
//lcd
mylcd.init();
mylcd.backlight();
}
/*循環區*/
void loop()
{
digitalWrite(13,HIGH); //給數位腳位 13 pin 輸出高電壓 (LED 通電就亮)
Serial.println("on");
delay(2000); //延遲 1 秒鐘 (1000 毫秒)
//溫濕度1
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h1 = dht.readHumidity();
//讀取攝氏溫度
float t1 = dht.readTemperature();
//讀取華氏溫度
float f1 = dht.readTemperature(true);
// check if returns are valid, if they are NaN (not a number) then something went wrong!
if (isnan(t1) || isnan(h1)) {
Serial.println("Failed to read from DHT");
} else {
//濕度
Serial.print("Humidity: ");
Serial.print(h1);
Serial.print(" %\t");
//溫度
Serial.print("Temperature: ");
Serial.print(t1);
Serial.println(" *C");
}
//溫濕度2
float h2 = dht2.readHumidity();
//讀取攝氏溫度
float t2 = dht2.readTemperature();
//讀取華氏溫度
float f2 = dht2.readTemperature(true);
if (isnan(t2) || isnan(h2)) {
Serial.println("Failed to read from DHT");
} else {
//濕度
Serial.print("Humidity: ");
Serial.print(h2);
Serial.print(" %\t");
//溫度
Serial.print("Temperature: ");
Serial.print(t2);
Serial.println(" *C");
}
//溫濕度3
float h3 = dht3.readHumidity();
//讀取攝氏溫度
float t3 = dht3.readTemperature();
//讀取華氏溫度
float f3 = dht3.readTemperature(true);
if (isnan(t3) || isnan(h3)) {
Serial.println("Failed to read from DHT");
} else {
//濕度
Serial.print("Humidity: ");
Serial.print(h3);
Serial.print(" %\t");
//溫度
Serial.print("Temperature: ");
Serial.print(t3);
Serial.println(" *C");
}
//設定LCD要列印在第0個位置,第0列。
mylcd.setCursor(0,0);
mylcd.print("h1:");
mylcd.setCursor(3,0);
mylcd.print(h1);
mylcd.setCursor(0,1);
mylcd.print("t1:");
mylcd.setCursor(3,1);
mylcd.print(t1);
//設定LCD要列印
mylcd.setCursor(9,0);
mylcd.print("t2:");
mylcd.setCursor(12,0);
mylcd.print(t2);
//設定LCD要列印
mylcd.setCursor(9,1);
mylcd.print("t3:");
mylcd.setCursor(12,1);
mylcd.print(t3);
digitalWrite(13,LOW); //給數位腳位 13 pin 輸出低電壓 (LED 不通電就暗)
//Serial.println("off");
delay(1000);
}
````
只顯示一個感知器時的寫法
````#include <Wire.h>
#include <SoftwareSerial.h>#include "motoDHT.h"
//DHT 01 D9
#include "motoDHT.h"
//DHT 01 D9
#define DHTPIN1 9 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22
DHT dht(DHTPIN1, DHTTYPE);
//看門狗測試,如果秒數超過會重開機
#include <avr/wdt.h>
//lcd需要的涵數
#include <motoLiquidCrystal_I2C.h>
//LiquidCrystal_I2C lcd(0x3F,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display
LiquidCrystal_I2C mylcd(0x27,16,2);
int Liquid_level=0;
void setup()
{
//數位輸出13支腳,LED
pinMode(13, OUTPUT);
Serial.begin(9600);
//濕度感測
pinMode(A0, INPUT);
//switch開關1
pinMode(10, OUTPUT);
//水位傳感器
pinMode(5,INPUT);
dht.begin();
//lcd
mylcd.init();
mylcd.backlight();
//----------------------------------------------------------看門狗
wdt_enable(WDTO_8S); //當機8秒後重開機
// Valid delays:
// WDTO_15MS
// WDTO_30MS
// WDTO_60MS
// WDTO_120MS
// WDTO_250MS
// WDTO_500MS
// WDTO_1S
// WDTO_2S
// WDTO_4S
// WDTO_8S
//-------------------------------------------------------------
}
void loop()
{
//變數宣告
int value_a0 = 1023 - analogRead(A0);
//int value_a0 = analogRead(A0);
Serial.print("土壤濕度:");
Serial.println(value_a0);
Liquid_level=digitalRead(5);
Serial.print("水位訊號:");
Serial.println(Liquid_level);
//開關控制-土壤濕度-----------------------
if (value_a0 > 20 && value_a0 < 600) {
//判斷水位
if (Liquid_level == 1) {
digitalWrite(10,HIGH);
//設定LCD要列印在第0個位置,第一列。
mylcd.setCursor(0,1);
mylcd.print("SWITCH:");
mylcd.setCursor(8,1);
mylcd.print("ON ");
}else {
digitalWrite(10,LOW);
//設定LCD要列印在第0個位置,第一列。
mylcd.setCursor(0,1);
mylcd.print("SWITCH:");
mylcd.setCursor(8,1);
mylcd.print("OFF");
}
}else {
digitalWrite(10,LOW);
//設定LCD要列印在第0個位置,第一列。
mylcd.setCursor(0,1);
mylcd.print("SWITCH:");
mylcd.setCursor(8,1);
mylcd.print("OFF");
}
//開關控制-土壤濕度-----------------------
digitalWrite(13,LOW);
delay(300);
digitalWrite(13,HIGH);
delay(300);
digitalWrite(13,LOW);
//同步顯示在LCD與LED
//設定LCD要列印在第0個位置,第0列。
mylcd.setCursor(0,0);
mylcd.print("SM:");
mylcd.setCursor(3,0);
mylcd.print(" ");
mylcd.setCursor(3,0);
mylcd.print(value_a0);
mylcd.setCursor(8,0);
mylcd.print("WT:");
mylcd.setCursor(11,0);
mylcd.print(Liquid_level);
Serial.println(value_a0);
Serial.println(Liquid_level);
//溫濕度1
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h1 = dht.readHumidity();
//讀取攝氏溫度
float t1 = dht.readTemperature();
//讀取華氏溫度
float f1 = dht.readTemperature(true);
// check if returns are valid, if they are NaN (not a number) then something went wrong!
if (isnan(t1) || isnan(h1)) {
Serial.println("Failed to read from DHT");
} else {
//濕度
Serial.print("Humidity: ");
Serial.print(h1);
Serial.print(" %\t");
//溫度
Serial.print("Temperature: ");
Serial.print(t1);
Serial.println(" *C");
}
mylcd.setCursor(0,0);
mylcd.print("h1:");
mylcd.setCursor(3,0);
mylcd.print(h1);
mylcd.setCursor(0,1);
mylcd.print("t1:");
mylcd.setCursor(3,1);
mylcd.print(t1);
delay(1000);
//看門狗測試,如果秒數超過會重開機
wdt_reset(); // reset watch dog timer
}
````
連網https://iot.cht.com.tw/iot/login
ESP8266-只有wifi功能
電話線:
紅:VCC
黑:GND
黃:D2 RX
綠:D3 TX
//mega2560 VS ESP8266 TX3(14 黃 8266_RX)、RX3(15 綠 8266_TX) VS TX、RX
設定帳號+密碼
connect_status = WiFi.begin("帳號","密碼");
````//載入所需的涵式庫
#include <SoftwareSerial.h>
//---------------------------------------------------------------------------------------------------add
#include <Wire.h>
#include "motoWiFiEsp.h"
#include <motoMQTTClient.h>
//設定 WIFI 晶片使用 D2 D3 的數位腳位
SoftwareSerial esp8266_Serial(3,2); //D2 RX / D3 TX
WiFiEspClient esp_client;
int connect_status = WL_IDLE_STATUS;
//回傳 IP 位址的陣列,組成字串 ipAddressToString
String ipAddressToString(const IPAddress& ipAddress ) {
return String(ipAddress[0]) + String(".")+
String(ipAddress[1]) + String(".")+
String(ipAddress[2]) + String(".")+
String(ipAddress[3]);
}
MQTTClient mqtt_client;
void messageReceived(String topic, String payload, char * bytes, unsigned int length)
{
}
//---------------------------------------------------------------------------------------------------end
void setup()
{
//在9600 bps開啟串列傳輸 erial.println 要可用需先加下列這段
Serial.begin(9600);
//---------------------------------------------------------------------------------------------------add
//Baud Rate: 9600bps (出廠預設)
esp8266_Serial.begin(9600);
esp8266_Serial.listen();
WiFi.init(&esp8266_Serial);
if(WiFi.status()==WL_NO_SHIELD) {
Serial.println(F("Esp8266 module no present"));
while(true);
}
//連接 wifi ,重複處理直到連線成功。
while(connect_status != WL_CONNECTED) {
Serial.println(F("Connect to router..."));
//設定wifi的帳密
connect_status = WiFi.begin("oceanbox","28131989");
}
//MQTT 伺服器連線,連到中華電信 IOT
mqtt_client.begin("iot.cht.com.tw", esp_client);
//建立與中華電信的 MQTT 的連線,重複處理直到連線成功。
//客戶ID:oceanbox (任意填寫)
//帳號與密碼:PK3CTEM7KG2FYC439C為專案的金鑰(找金鑰設定)
while (!mqtt_client.connect("oceanbox","PK3CTEM7KG2FYC439C","PK3CTEM7KG2FYC439C")) {
Serial.print(".");
delay(1000);
}
Serial.println("connected");
//---------------------------------------------------------------------------------------------------end
pinMode(13, OUTPUT); //設定第 13 pin 腳模式為輸出
//濕度感測
pinMode(A0, INPUT);
//switch 開關 1
pinMode(10, OUTPUT);
}
/*循環區*/
void loop()
{
digitalWrite(13,HIGH); //給數位腳位 13 pin 輸出高電壓 (LED 通電就亮)
Serial.println("LED HIGH");
delay(1000); //延遲 1 秒鐘 (1000 毫秒)
//因為預設為1023,愈濕會愈低,改成濕度愈高,數值愈高
//先定義變數value_a0為整數
int value_a0 = 1023 - analogRead(A0);
//連上hinet
mqtt_client.loop();
//發佈下列訊號給 CLIENT 端
//7781729950為設備編號、value_a0為要上傳的訊號
mqtt_client.publish("/v1/device/7781729950/rawdata", (String("[{\"id\":\"sensor1\",\"value\":[\"") + String(value_a0) +
String("\"]}]")));
//印出目前的上網ip
Serial.println(ipAddressToString(WiFi.localIP()));
Serial.println(value_a0);
//如果濕度 > 50 就啟動SWITCH
if (value_a0 > 50) {
digitalWrite(10,HIGH);
}else {
digitalWrite(10,LOW);
}
digitalWrite(13,LOW); //給數位腳位 13 pin 輸出低電壓 (LED 不通電就暗)
Serial.println("LED LOW");
delay(1000);
}
````