※本實驗目的為運用光敏電阻感應光源控制LED開關,已達到節約能源的目的;並利用ESP32的WiFi功能結合ThingSpeak和手機App:Line,達到收集光敏電阻數據並及時通知手機App目前LED的狀態。

1.ESP32在Arduino開發環境架設

●由於在Arduino開發環境上架設ESP32之教學文章非常之多,因此這裡就不再多做贅述直接進入第二點。

Ps.請Google搜尋→ESP32環境安裝

2. 使用Arduino撰寫程式碼

※由於Youtube上有許多非常優良的Arduino教學影片,因此這裡便不多做贅述,只會附上程式碼,其餘前置動作,請各位自行上Youtube搜尋囉!

Ps.下方有ThingSpeak和Line的設定教學

以下為Arduino程式碼

※注意 程式碼內需修改的[你的APIKey]會在ThingSpeak教學時取得APIKey。

#include
#include
//請修改以下參數——————————————–
char ssid[] = “SSID”;//輸入要連接之WiFi的名稱
char password[] = “SSID Password”;//輸入要連接之WiFi的密碼
//請修改為你自己的API Key,並將https改為http

String url = “http://api.thingspeak.com/update?api_key=你的APIKey“;
int photocellPin = 39; // 光敏電阻 (photocell) 接在 anallog pin 39 (SVN)
//———————————————————
int photocellVal = 0; // photocell variable
int LED=0;
String LED_status = “OFF”;
int vv;

void setup()
{
  Serial.begin(115200);
  pinMode(LED, OUTPUT); //設定 DIO Pin 2 為 LED 輸出
  pinMode(photocellPin,INPUT);

  Serial.print(“開始連線到無線網路SSID:”);
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)
   {
     Serial.print(“”);
     delay(1000);
   }
   Serial.println(“已連接WiFi”);
}

void loop()
{
// 讀取光敏電阻並輸出到 Serial Port
  photocellVal = analogRead(photocellPin);
  Serial.println(“”);
  Serial.print(“讀取光敏值:”);
  Serial.println(photocellVal);
  delay(100);
  vv=analogRead(photocellPin);

  if (vv<400)
  {
    digitalWrite(LED, HIGH);
    Serial.println(“LED ON”);
    LED_status=”ON”;
  }
  else
  {
    digitalWrite(LED, LOW);
    Serial.println(“LED OFF”);
    LED_status=”OFF”;
  }

   //開始傳送到thingspeak
   Serial.println(“傳送數值至網頁”);
   HTTPClient http;
   //將光敏值以http get參數方式補入網址後方
   String url1 = url + “&field1=” + photocellVal ;
   //http client取得網頁內容
   http.begin(url1);
   int httpCode = http.GET();

   if (httpCode == HTTP_CODE_OK)
    {
      //讀取網頁內容到payload
      String payload = http.getString();
      //將內容顯示出來
      Serial.print(“以上為第”);
      Serial.print(payload);
      Serial.println(“筆資料”);
    }
    else
     {
       //讀取失敗
       Serial.println(“網路傳送失敗”);
     }
   http.end();

   Serial.println(“15秒後再次偵測”);
   delay(15000);//延遲15秒
}

3.Line Notify設定教學

※若以下教學有不懂處可點此→參考連結

第一步:進入LINE Notify網站→點此進入,並點擊右上角登入。

第二步:登入Line帳號。

第三步:點擊右上角[個人頁面]。

第四步:點擊下方[發行權杖]。

第五步:輸入通知機器人姓名及選擇接收通知的聊天室。

第六步:點選下方[複製]並將此權杖妥善保存。

※此權杖離開該介面便無法再找回該權杖,務必妥善保存。

※注意

若於第五步時選擇傳訊的對象是一個群組,那麼要多一個動作:邀請LINE Notify進入群組內,否則會出現此錯誤訊息[此帳號尚未被邀請至已連動的群組]。

4.ThingSpeak創建帳號教學

※若以下教學有不懂處可點此→參考連結

第一步:創建帳號,進入ThingSpeak網站→點此進入,並點擊右上角Sign Up。

第二步:輸入E-mail及用戶名稱,輸入完畢按下方Continue。

Ps. E-mail必須完全輸入正確,其餘隨意即可。

第三步:在標示在標示1打勾,並按下方Continue。

第四步:等待並前往你的E-mail收取認證信件

第五步:找到名稱[Verify Email Address]的信件並點擊紅框處。

第六步:完成第五步便會跳轉到這個畫面,便可回到第四步的畫面點擊Continue。

第七步:輸入密碼和勾選後,點擊下方Continue。

Ps.密碼須包含數字及大小寫英文

第八步:完成ThingSpeak帳號創建,點選OK後會詢問是否用於商業用途,點選紅框選項,並點選

               OK,完成創建帳號。

5.ThingSpeak頻道設定

※若以下教學有不懂處可點此→參考連結

第一步:點選NewChannel進入創建頻道。

第二步:輸入所需資料,輸入完畢後點選最下方Save Channel。

Ps.大部分可忽略,如需增加其他資料請自行勾選。

第三步:點選API Keys。

第四步:複製紅框內APIKey,並到程式碼內的[貼入你的API Key]處貼上。

6.設定 ThingHTTP

※此部分為ThingSpeak傳送信息至Line的設定。

第一步:點擊Apps中的ThingHTTP,並點擊New ThingHTTP按鈕。

第二步:相關欄位設定(參照下表),完成設定後點選最下方Save ThingHTTP。

  • URL:https://notify-api.line.me/api/notify
  • Method:POST
  • Content Type:application/x-www-form-urlencoded
  • Header的name=Authorization
  • Header的value=Bearer 你的Token
    Bearer與Token中間要記得插入一個英文空白
  • Body部份輸入
       message=偵測目前Photocell Vaule為”%%trigger%%”。
    %%trigger%% 代表將來會被後續設定的React觸發的欄位值,稍後設定完成會顯示光敏值。

Ps.此處的Token指的是在Line Notify設定教學中的第六步所取得的權杖。

7.設定React

第一步:點選Apps中的React,並點選New React。

第二步:相關欄位設定(參照下表),完成設定後點選最下方Save React。

  • Condition Type (數值種類):選擇數值類Numeric。
  • 監控頻率(Test Frequency):選擇監控每次新增的值。
  • 監控頻道(if channel):選擇上面建立好的頻道。
  • 監控欄位(field):選擇監控哪一個欄位,本處選擇欄位1(Photocell Value)。
  •  比較方式:數值類比較大小,此處選擇「大於400」時觸發,選is Greater than。
  • 數值:輸入400
  • Action:反應方式選擇ThingHTTP,即條件達到時,要傳送一個ThinhHTTP亦即上面的LINE通知。
  • perform ThingHTTP:選擇剛剛建立好LINE通知的那個ThingHTTP。
  • Options:觸發通知的頻率,兩個選擇分別是1.條件達成後,只發一次通知,或2.每次條件達成都發通知,我們選擇1.條件達成後,只發一次通知。

8.實驗電路圖

所需元件與線材

元件

ESP32*1

LED*1

電阻*1(連接光敏電阻用)

Ps.請視LED狀況決定是否需再外加電阻。

線材

杜邦線*4

單芯線*2 (麵包板接線之常用線材)

Micro USB*1 (ESP32燒綠程式用線)

完成以上步驟後,即可上傳程式碼至ESP32,觀察實驗結果,若光敏值超過400時,LED便會關閉,手機就會收到LINE通知囉。

※因受限於使用的為ThingSpeak免費版功能,因此ThingSpeak需15秒才會做一次數值傳輸,所以於程式碼內設定為間隔15秒才會偵測一次光敏值並傳送數值至ThingSpeak再透過ThingSpeak傳送訊息至Line。

1 軟體 : Arduino ( v1.8.12 ) 會隨版本更新

2 元件及材料 :

ESP 32 、 超音波 、蜂鳴器 、 杜邦線x6、

Micro USB線x1

Arduino

教學 : https://zanrobot.com/uncategorized/3699

下載 : tps://www.arduino.cc/zh/main/software?setlang =cn

超音波蜂鳴器接線圖接

BZ(+) 接P12,
BZ ( – ) 接GND
trigPin 接 5 (GPIO5)
echoPin 接 4 (GPIO4)
Vcc 接 3.3 V

ESP 32 前置

教學 : https://zanrobot.com/uncategorized/3699

程式編碼

const int trigPin = 5;

const int echoPin = 4;

const int ledPin = 12;

const int freq = 2000;

const int ledChannel = 0;

const int resolution = 8;

long duration; int distance;

int safetyDistance;

void setup() { pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

Serial.begin(115200);

ledcSetup(ledChannel, freq, resolution);

ledcAttachPin(ledPin, ledChannel);

ledcWriteTone(ledChannel, 0);

}

void loop()

{ digitalWrite(trigPin, LOW);

delayMicroseconds(2);

digitalWrite(trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);

{ distance= duration*0.034/2;

safetyDistance = distance; if (safetyDistance <= 30){ ledcWriteTone(ledChannel,0);

delay(100);

}

if (safetyDistance < 5){ ledcWriteTone(ledChannel,1730);

delay(100);

}

if (safetyDistance < 20){ ledcWriteTone(ledChannel,1046);

delay(100); }

}

Serial.print(“Distance: “);

Serial.println(distance);

}

影片

1 軟體 : Arduino ( v1.8.12 ) 會隨版本更新

2 元件及材料 :

ESP 32 板子
麵包板x1
杜邦線x4

電線x2
ledx1
220Ω 電阻x1
10k Ω 電阻x1

光敏電阻x1

Arduino

教學 : https://zanrobot.com/uncategorized/3699

下載 : tps://www.arduino.cc/zh/main/software?setlang =cn

接線圖

5V —-> +
GND —-> –
SVP —–> 光敏的端+10k
P13 —-> LED+端(腳長)

ESP 32 前置

教學 : https://zanrobot.com/uncategorized/3699

程式編碼

#include <BluetoothSerial.h>
BluetoothSerial SerialBT;//宣告藍芽物件=SerialBT

void setup() {
// put your setup code here, to run once:
Serial.begin(115200);//序列視窗
SerialBT.begin(“ESP32”);//<<藍芽名稱,請自己記得
pinMode(A0, INPUT);
pinMode(13,OUTPUT);//電燈relay
}
int pr_min = 400;
void loop() {
char analogRea=SerialBT.read();
int pr = analogRead(A0);{
Serial.println(pr);
SerialBT.println(pr);
delay(1000);
}
while(SerialBT.available())
{
char btdata=SerialBT.read();
Serial.print(btdata);//查看藍芽輸入的值
if (btdata==’3′){digitalWrite(13,HIGH);}//開電燈
if (btdata==’4′){digitalWrite(13,LOW);}//關電燈
}
delay(100);
}

手機app

先到play商店下載arduino bluetooth controller

開啟並開啟藍芽選到裝置

點擊裝置會出現此列表

按下

當程式執行成功時將出現光敏阻值
且輸入 3 Led 亮 4 Led關

執行

1 軟體 : Arduino ( v1.8.12 ) 會隨版本更新

2 元件及材料 :

ESP 32 、 伺服馬達 、 杜邦線x3、Micro USB線x1

Arduino

教學 : https://zanrobot.com/uncategorized/3699

下載 : tps://www.arduino.cc/zh/main/software?setlang =cn

伺服馬達接線圖

黃線 P16紅線5V 黑線 GND

ESP 32 前置

教學 : https://zanrobot.com/uncategorized/3699

程式編碼

#include <Servo.h>//宣告
Servo servo;//命名

int pos = 0;

void setup() {
Serial.begin(115200);//序列阜監控視窗
servo.attach(16); //橘色的線接主要是訊號線,接到 p16
}

void loop() {
if(Serial.available()){                 //
int num = Serial.parseInt();     // case 前置 num(數字鍵)

switch(num) {                            //   

case 1 :   //1~9
for(pos = 0; pos < 180; pos += 1) // 一度一度由 0 度旋轉到 180 度

servo.write(pos);
delay(15);
break;

case 2 : // 1~9
for(pos = 180; pos>=1; pos-=1) // 一度一度由 180 度旋轉到 0 度

servo.write(pos);
delay(15);
break;
}
}
}

注意!

上傳時如果出現了下方狀況

伺服ESP32網址:
https://github.com/RoboticsBrno/ServoESP32

解決過程

先到打開伺服esp32網址(上方網址)

將檔案下載

壓縮檔案

找到arduino 並打開資料夾

進入後找到libraries 並打開

將剛剛的壓縮檔放入即可

3 執行

開啟監控視窗

輸入設定的數值( 如 : 我是 case 1 就是輸入 1 )

影片

1 軟體 : Arduino ( v1.8.12 ) 會隨版本更新

2 元件與材料

ESP 32 板子
麵包板x1
杜邦線x6
ULN2003 步進馬達驅動模組
步進馬達x1

3 接上元件

線路圖

In 1p14 In 2p12 In 3p13

In 4p15 VDD5V 、 GND 接 GND

程式碼

#define A 14 //A 相線圈接到 Arduino Pin 14
#define B 12 //B 相線圈接到 Arduino Pin 12
#define A_BAR 13 // A_BAR 相線圈接到 Arduino Pin 13
#define B_BAR 15 // B_BAR 相線圈接到 Arduino Pin 15
#define rr 50 //轉速設定
#include <Stepper.h> //引入 Stepper.h 檔

Stepper stepper(200, A, A_BAR, B, B_BAR);

void setup(){
stepper.setSpeed(rr); //將馬達的速度設定成 50 RPM
}

void loop(){
stepper.step(2048); //順時針 1 圈
delay(2000);
stepper.step(-2048); //逆時針 1 圈
delay(2000);
}

 

 

 

4 執行