วันอาทิตย์ที่ 30 กรกฎาคม พ.ศ. 2560

Code โปรเจค Arduino ง่ายๆ เปิด ปิดไฟด้วยเสียง



เปิดปิดไฟด้วยเสียง


เรียนรู้วิธีควบคุม Arduino  ด้วย เซ็นเซอร์เสียง LM393 เราจะควบคุม การ ปิด เปิด ไฟ LED ด้วยเสียงตบมือ โดยเราจะใช้เซ็นเซอร์ตรวจจับเสียง LM393 +  รีเลย์ และแสดงผลด้วยไฟ LED



อุปกรณ์ที่ใช้



1. Arduino UNO R3 - Made in italy

2. Sound Detection Sensor Module LM393

3. สาย Jumper Female to Male ยาว 20cm.

4. สาย Jumper Male to Male ยาว 20cm.

5. Prototype PCB Board 4x6 cm Double Sides

6. สกรูหัวกลม+น็อตตัวเมีย ขนาด 3มม ยาว 12มม

7. Relay 1 Channel DC 5V Module

8. SMD LED Lighting G4 AC DC 12V

9. รางถ่าน AA 8 ก้อน



การต่อวงจร ระหว่าง  เซ็นเซอร์เสียง LM393  กับ Arduino UNO




LM393 <--> UNO

+5V  <--> 5V

GND <--> GND
OUT <--> D4



การต่อวงจร ระหว่าง Relay กับ Arduino UNO





Relay
 <--> UNO

5V <--> 5V
GND <--> GND
IN <--> D5



การต่อวงจร ระหว่าง UNO+ Relay + LED + รางถ่าน


*** การต่อ LED กับ PCB Board ด้านล่างต้องใช้ ตะกั่วบัดกรี Jumper กับ ขา LED ให้เชื่อมต่อกัน ทั้ง 2 ขา ***

*** LED เป็น LED แบบไม่มีขั้ว ต่อเข้าด้านไหนก็ทำงานได้เช่นกัน ***




หมายเหตุ : ที่ 5V ของ Arduino มี 2 สาย จาก เซ็นเซอร์เสียง และ Relay ที่ใช้ร่วม 5V จุดเดียวกัน ให้ เชื่อมต่อ 2 เส้น รวมกันก่อน ให้เหลือ 1 เส้น แล้วจึงเสียบเข้าไปที่ 5V 



บล็อกไดอะแกรม





อธิบายโค้ด



int sound_sensor = 4;  // ประกาศให้พินดิจิตอล 4 เป็นตัวแปรชื่อ sound_sensor มีชนิดของข้อมูลคือ int คือ เลขจำนวนเต็ม 

int relay = 5;   // ประกาศให้พินดิจิตอล 5 เป็นตัวแปรชื่อ relay มีชนิดของข้อมูลคือ int คือ เลขจำนวนเต็ม                               

int clap = 0;  // ประกาศตัวแปรชื่อ clap มีชนิดของข้อมูลคือ int คือ เลขจำนวนเต็ม มีค่าเริ่มต้น เป็น 0

long detection_range_start = 0;  // ประกาศตัวแปรชื่อ detection_range_start มีชนิดของข้อมูลคือ long คือ เลขจำนวนเต็ม มีค่าเริ่มต้น เป็น 0

long detection_range = 0;   // ประกาศตัวแปรชื่อ long detection_range มีชนิดของข้อมูลคือ long คือ เลขจำนวนเต็ม มีค่าเริ่มต้น เป็น 0

boolean status_lights = false;   // ประกาศตัวแปรชื่อ status_lights มีชนิดของข้อมูลคือ boolean คือ มีค่าได้เพียงสองค่าคือ จริง-true และ เท็จ-false โดยให้มีค่าเริ่มต้น เป็น เท็จ-false 

void setup() { // ฟังก์ชัน setup จะทำงานครั้งแรก เพียงครั้งเดียวเท่านั้น

pinMode(sound_sensor, INPUT);   //  ให้ พินดิจิตอล 4 ตัวแปร sound_sensor เป็นพินโหมด แบบอินพุท เพื่อรับค่า จากเซ็นเซอร์เสียง

pinMode(relay, OUTPUT);   //  ให้ พินดิจิตอล 5  ตัวแปร relay เป็นพินโหมด แบบเอาท์พุทเพื่อส่งค่าการทำงานให้กับ รีเลย์

}  // สิ้นสุดการทำงานของฟังก์ชัน setup



void loop() {   // ฟังก์ชัน loop จะทำงานซ้ำ วนลูป ไปเรื่อยๆ

int status_sensor = digitalRead(sound_sensor);  // ประกาศตัวแปร status_sensor และรับค่าจาก พินดิจิตอล 4 ตัวแปร sound_sensor

  if (status_sensor == 0)   // ถ้า status_sensor เท่ากับ 0 

  {
     
    if (clap == 0)   // ถ้า clap เท่ากับ 0

     {

       detection_range_start = detection_range = millis();   // ให้ตัวแปร detection_range_start และ detection_range มีค่าเท่ากับ millis หรือ milliseconds คือการจับเวลาของ Arduino ทันทีที่มีไฟเลี้ยงเข้า

      clap++;   // ให้ clap มีค่าอยู่เท่าไรให้บวกหนึ่ง

    }
   
     
else if (clap > 0 && millis()-detection_range >= 50) // ถ้า clap มากกว่า 0 และ millis ลบกับ detection_range มากกว่าหรือเท่ากับ 50

     {
     
       
detection_range = millis();   // ให้ detection_range เท่ากับ millis

       clap++;   // ให้ clap มีค่าอยู่เท่าไรให้บวกหนึ่ง

    } 

   }

   if (millis()-detection_range_start >= 400)  // ถ้า millis ลบกับ detection_range_start มากกว่าหรือเท่ากับ 400

   {

     if (clap == 2)  // ถ้า clap เท่ากับ 2

     {

       if (!status_lights)   // ถ้า status_lights เป็นเท็จ

        {
           
           status_lights = true;   // ให้ status_lights เท่ากับ จริง 

           digitalWrite(relay, HIGH);   // ส่งข้อมูล HIGH ไปที่รีเลย์ เพื่อให้ไฟติด

        }
         
          else if (status_lights)   // ถ้า status_lights เป็นจริง

        {
           
           status_lights = false;   // ให้ status_lights เป็นเท็จ

           digitalWrite(relay, LOW);   // ส่งข้อมูล LOW ไปที่รีเลย์  เพื่อให้ไฟดับ

         }
     }

     clap = 0;   // ให้ clap  เท่ากับ 0

   }

 }   // สิ้นสุดการทำงานของฟังก์ชัน loop แล้วเริ่มทำงานฟังก์ชัน loop ใหม่ซ้ำไปเรื่อยๆ



อัพโหลดโค้ด


เปิดโปรแกรม Arduino (IDE) และ Upload โค้ดนี้ ไปยัง บอร์ด Arduino UNO R3




int sound_sensor = 4;
int relay = 5;

int clap = 0;

long detection_range_start = 0;
long detection_range = 0;
boolean status_lights = false;

void setup() {
  pinMode(sound_sensor, INPUT);
  pinMode(relay, OUTPUT);
}

void loop() {
  int status_sensor = digitalRead(sound_sensor);
  if (status_sensor == 0)
  {
    if (clap == 0)
    {
      detection_range_start = detection_range = millis();
      clap++;
    }
    else if (clap > 0 && millis()-detection_range >= 50)
    {
      detection_range = millis();
      clap++;
    }
  }
  if (millis()-detection_range_start >= 400)
  {
    if (clap == 2)
    {
      if (!status_lights)
        {
          status_lights = true;
          digitalWrite(relay, HIGH);
        }
        else if (status_lights)
        {
          status_lights = false;
          digitalWrite(relay, LOW);
        }
    }
    clap = 0;
  }
}


ไปที่ Tools > Board เลือกเป็น Arduino/Genuino UNO






ไปที่ Tools > Port แล้วเลือกพอร์ตที่ปรากฏ (กรณีใช้เครื่องคอมพิวเตอร์ที่มี COM Port มากกว่าหนึ่ง  ให้เลือกตัวอื่นที่ไม่ใช่ COM1)

ในตัวอย่างเลือกเป็น "COM3"

(ถ้ายังว่าง หรือ เป็น COM1 ให้ตรวจสอบการติดตั้งไดร์เวอร์ การต่อสาย USB ของ Arduino UNO)



(ถ้าไม่พบให้ทำการติดตั้งไดร์เวอร์ก่อน) 
การติดตั้งโปรแกรม Arduino (IDE) และ การติดตั้งไดร์เวอร์




กดปุ่ม 
 เพื่ออัพโหลด



หากสามารถอัพโหลดโปรแกรมลงบอร์ดได้สำเร็จ จะแสดงคำว่า Done uploading. ที่แถบด้านล่าง







การปรับค่า Sound Detection Sensor Module LM393

ให้เอาไขควงหมุน ปรับค่าการรับสัญญาณเสียง ที่ เซ็นเซอร์เสียง LM393 โดยให้หมุนตัว R ปรับค่าได้ แบบ trimpot สีฟ้า โดย เมื่อ ตบมือ 2 ครั้ง ให้ ไฟ LED สีแดง ที่ รีเลย์ ติด และ เมื่อ ตบมืออีก 2 ครั้ง ให้ ไฟ LED สีแดง ที่ รีเลย์ ดับ






ทดสอบการทำงาน โดย  เมื่อไฟติดอยู่ ตบมือ 2 ครั้ง ไฟจะดับ และ เมื่อ ตบมืออีก 2 ครั้ง  ไฟจะติด



วีดีโอผลลัพธ์การทำงานของ โปรเจค Arduino ง่ายๆ เปิด ปิด ไฟด้วยเสียง






Code โปรเจค Arduino UNO + Blynk ปิด เปิด ไฟ LED ผ่าน อินเตอร์เน็ต


โปรเจค นี้จะเป็นการนำ Arduino UNO ควบคุมการแสดงผล ปิดเปิด ไฟ LED ด้วยแอพ Blynk ที่สามารถเชื่อมต่ออุปกรณ์ Device ของเราเข้ากับ internet ได้อย่างง่ายดาย

IoT หรือ Internet of Things หรือเทคโนโลยีของ อุปกรณ์และเครื่องใช้ต่างๆ ที่จะทำงานโดยมีการเชื่อมโยงถึงกันผ่านทางเครือข่ายอินเทอร์เน็ต กำลังเป็นเทคโนโลยีที่ถูกพูดถึงมากขึ้นเรื่อยๆ เราได้เห็นทั้งฮาร์ดแวร์รุ่นใหม่ๆ มีการประกาศมาตรฐาน มีทั้งบริการและเครื่องมือชนิดใหม่ ออกมาให้ได้ติดตามกันอย่างต่อเนื่อง  โดยเจ้าบริการที่ว่านี้มีชื่อว่า Blynk

 Blynk Application เป็นโปรแกรมบนมือถือที่ทำให้เราสร้างหน้าต่างควบคุมหรือแสดงผลเชื่อมต่อกับพวกไมโครคอนโทรเลอร์(Ardunio, ESP8266, Raspberry Pi) ได้ง่ายๆ และยังสามารถควบคุมผ่าน อินเตอร์เน็ต ได้อีกด้วย



อุปกรณ์ที่ใช้


1. Arduino UNO R3 - Made in italy

2. สาย Jumper Female to Male ยาว 20cm.

3. สาย Jumper Male to Male ยาว 20cm.

4. Prototype PCB Board 4x6 cm Double Sides

5. แผ่นอะคริลิคใส ขนาด 15 x 30 เซนติเมตร

6. สกรูหัวกลม+น็อตตัวเมีย ขนาด 3มม ยาว 12มม

7. Relay 1 Channel DC 5V Module

8. SMD LED Lighting G4 AC DC 12V

9. รางถ่าน AA 8 ก้อน


...


การต่อวงจร ระหว่าง Relay กับ Arduino UNO







Relay
 <--> UNO

5V <--> 5V
GND <--> GND
IN <--> D7



การต่อวงจร ระหว่าง UNO Relay + LED + รางถ่าน




ไปที่ Play Store ค้นหา Blynk

ติดตั้ง เหมือน App ทั่วๆไป



เปิด Blynk Application ขึ้นมา

-> Create New Account






กรอก อีเมล และ พาสเวิด -> Sign Up




-> New Project





เลือก DEVICE



เลือกเป็น Arduino UNO





เลือก connection type เป็น USB




ตั้งชื่อ Project ในตัวอย่างชื่อ led-v1 -> Create




โปรกรม จะส่ง Auth Toke ไปที่ อีเมล ที่เรากรอกไว้ -> OK


โดยทุกๆครั้งที่เริ่มสร้างโปรเจคใหม่ AUTH TOKEN จะถูกเปลี่ยนใหม่เสมอ ซึ่ง KEY นี้เองที่เป็นเสมือนกุญแจสำหรับเชื่อมต่อ


คลิก เครื่องหมาย +




คลิก เพิ่ม Button




จะมี ปุ่ม BUTTON เพิ่มเข้ามาที่หน้าจอ แล้วจึง คลิกที่ BUTTON เพื่อตั้งค่า




เลือก เป็นแบบ SWITCH แล้ว คลิก ที่ PIN




Select pin -> Digital -> D7 -> CONTINUE




BUTTON จะอยู่ริมซ้ายมือบน




เพื่อความสวยงาม ให้ ลาก BUTTON ไว้กลางหน้าจอ




ไปที่

http://www.blynk.cc/getting-started/

ดาวน์โหลด ไลบรารี่ Blynk





เปิด โปรแกรม 
ARDUINO IDE จากนั้นให้ทำการเพิ่ม ไลบรารี่ Blynk  ให้กับ Arduino (IDE) ของเรา

เมื่อเพิ่มเสร็จแล้วไปที่ File -> Eamples -> Blynk -> Boards_USB_Serial -> Arduino_Serial_USB





แก้ไข YourAuthToken ที่เราได้รับจาก อีเมล



ที่เราได้รับจาก อีเมล






เมื่อแก้ไขแล้ว อัพโหลดโค้ด ไปยัง  Arduino UNO




/*************************************************************
  Download latest Blynk library here:
    https://github.com/blynkkk/blynk-library/releases/latest

  Blynk is a platform with iOS and Android apps to control
  Arduino, Raspberry Pi and the likes over the Internet.
  You can easily build graphic interfaces for all your
  projects by simply dragging and dropping widgets.

    Downloads, docs, tutorials: http://www.blynk.cc
    Sketch generator:           http://examples.blynk.cc
    Blynk community:            http://community.blynk.cc
    Social networks:            http://www.fb.com/blynkapp
                                http://twitter.com/blynk_app

  Blynk library is licensed under MIT license
  This example code is in public domain.

 *************************************************************
  =>
  =>          USB HOWTO: http://tiny.cc/BlynkUSB
  =>

  Feel free to apply it to any other example. It's simple!
 *************************************************************/

/* Comment this out to disable prints and save space */
#define BLYNK_PRINT DebugSerial


// You could use a spare Hardware Serial on boards that have it (like Mega)
#include <SoftwareSerial.h>
SoftwareSerial DebugSerial(2, 3); // RX, TX

#include <BlynkSimpleStream.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "bd1043f4d0084767b4a7f5650ce12c26"; // ต้องแก้ไข


void setup()
{
  // Debug console
  DebugSerial.begin(9600);

  // Blynk will work through Serial
  // Do not read or write this serial manually in your sketch
  Serial.begin(9600);
  Blynk.begin(Serial, auth);
}

void loop()
{
  Blynk.run();
}


**** ต้องแก้ไข  USB Port ของ Arduino UNO ให้ตรงกัน ****

ในตัวอย่าง จะเป็น COM3




ไปที่ Arduino ไลบรารี่ blynk-library-0.x.x คลิกขวาเปิดไฟล์ blynk-ser เพื่อทำการแก้ไข



ตรง COMM_PORT แก้ไขให้ตรงกับ Port  Arduino ของเรา ในตัวอย่างคือ COM3 แล้วจึง Save




จากนั้น คลิกซ้าย เปิดไฟล์ให้ทำงาน (ต้องเปิดไฟล์นี้ไว้ตลอดในขณะทดสอบ)



กลับไปที่ Blynk Application คลิกที่ เครื่องหมาย สามเหลี่ยม



เพื่อทดสอบการทำงานของโปรแกรม led-v1




...

วีดีโอผลลัพธ์การทำงานของ โปรเจค Arduino UNO + Blynk ปิด เปิด ไฟ LED ผ่าน อินเตอร์เน็ต




Code โปรเจค ESP8266 ESP-01 ปิด เปิด ไฟ LED ผ่าน WiFi

โปรแกรมนี้ จะควมคุมผ่าน ระบบอินทราเน็ต ที่ใช้ WiFi  หรือ วง แลน หรือใช้ เราเตอร์ เดียวกัน เท่านั้น




ก่อนอื่น ให้เชื่อมต่อ ESP8266 ESP-01 กับเราเตอร์ WiFi โดยใช้  ชื่อ WiFi ที่ต้องการเชื่อมต่อ และรหัสผ่าน ของเครือข่าย  เมื่อเชื่อมต่อเข้ากับ Router แล้ว  ตัว Router จะแจกไอพี (IP Address) มาให้เรา ซึ่งในตัวอย่างคือ 192.168.1.39

หมายเหตุ :

*** ต้องแก้ไข ไอพี ของ 
ESP8266 ESP-01 ให้ตรงกับที่เราได้รับมาจาก Router  ***





ไอพี ที่เราจะใช้  ซึ่งได้มาจาก ตัวอย่างบทความนี้


การใช้งาน ESP8266 ESP-01 Wireless WIFI Module

https://robotsiam.blogspot.com/2017/06/esp8266-esp-01-wireless-wifi-module.html


ในบทความ "การใช้งาน ESP8266 ESP-01 Wireless WIFI Module" เราได้เรียนรู้วิธี การติดต่อสื่อสารกับ ESP8266 ESP-01 และ ชุดคำสั่ง AT ซึ่งในบทความนี้เราจะแสดงวิธีการใช้โมดูล ESP-01 เพื่อให้    สามารถเข้าถึงเครือข่าย Wi-Fi และโต้ตอบกับอินพุตและเอาต์พุต

เมื่อเราได้ ไอพี ของ  ESP8266 ESP-01 มาแล้ว เราจึงจะสร้างเว็บเซิร์ฟเวอร์ ซึ่งสามารถ ควบคุมผ่านทาง เว็บเบราเซอร์ ของคอมพิวเตอร์ หรือ สมาร์ทโฟน แอนดรอยด์


อุปกรณ์ที่ใช้



1. Arduino UNO R3 - Made in italy

2. ESP8266 ESP-01 Wireless WIFI Module

3. ไอซีเร็กกูเลเตอร์ LD1117

4. คาปาซิเตอร์ 100 nF

5. คาปาซิเตอร์ 10 uF

6. สาย Jumper Female to Male ยาว 20cm.

7. สาย Jumper Male to Male ยาว 20cm.

8. Prototype PCB Board 4x6 cm Double Sides 2 ชิ้น

9. แผ่นอะคริลิคใส ขนาด 15 x 30 เซนติเมตร

10. สกรูหัวกลม+น็อตตัวเมีย ขนาด 3มม ยาว 12มม

11. Relay 1 Channel DC 5V Module

12. SMD LED Lighting G4 AC DC 12V

13. รางถ่าน AA 8 ก้อน


...

การต่อวงจร ระหว่าง ESP8266 ESP-01 กับ Arduino UNO




ESP-01 <--> UNO
VCC <--> 3.3V
GND <--> GND
CH_PD <--> 3.3V
RX <--> D6
TX <--> D7







การต่อวงจร ระหว่าง Relay กับ Arduino UNO





Relay
 <--> UNO

5V <--> 5V
GND <--> GND
IN <--> D5



การต่อวงจร ระหว่าง Relay + LED + รางถ่าน



ภาพรวมการต่อวงจร ระหว่าง UNO+ Relay + LED + รางถ่าน







อัพโหลดโค้ด ไปยัง  Arduino UNO




#include <SoftwareSerial.h>

#define TIMEOUT 5000 // mS
#define LED 5
SoftwareSerial mySerial(7, 6); // RX, TX


void setup()
{
 pinMode(LED,OUTPUT);
 Serial.begin(115200);
 mySerial.begin(115200);
 SendCommand("AT+RST", "Ready");
 delay(5000);
 SendCommand("AT+CWMODE=1","OK");
 SendCommand("AT+CIFSR", "OK");
 SendCommand("AT+CIPMUX=1","OK");
 SendCommand("AT+CIPSERVER=1,80","OK");
}

void loop(){


  
 String IncomingString="";
 boolean StringReady = false;

 while (mySerial.available()){
   IncomingString=mySerial.readString();
   StringReady= true;
  }

  if (StringReady){
    Serial.println("Received String: " + IncomingString);
  
  if (IncomingString.indexOf("LED=ON") != -1) {
    digitalWrite(LED,HIGH);
   }

  if (IncomingString.indexOf("LED=OFF") != -1) {
    digitalWrite(LED,LOW);
   }
  }
 }

boolean SendCommand(String cmd, String ack){
  mySerial.println(cmd); // Send "AT+" command to module
  if (!echoFind(ack)) // timed out waiting for ack string
    return true; // ack blank or ack found
}

boolean echoFind(String keyword){
 byte current_char = 0;
 byte keyword_length = keyword.length();
 long deadline = millis() + TIMEOUT;
 while(millis() < deadline){
  if (mySerial.available()){
    char ch = mySerial.read();
    Serial.write(ch);
    if (ch == keyword[current_char])
      if (++current_char == keyword_length){
       Serial.println();
       return true;
    }
   }
  }
 return false; // Timed out
}


หลังอัพโหลดเสร็จแล้ว ให้ไปที่ Tools -> Serial Monitor





เปิด Serial Monitor ของ Arduino ตั้งค่า baud rate 115200 และปรับช่องในรูปให้เป็น Both NL&CR

รอจนกระทั่งขึ้นคำว่า Received String:

แสดงว่าโปเจคเรา พร้อมทํางาน แล้ว





จากนั้นทดสอบการทำงานของ โปรเจค ESP8266 ESP-01 ปิด เปิด ไฟ LED  ด้วย WIFI


วิธีที่ 1 ทดสอบโดย เว็บเบราเซอร์ (web browser)



เริ่มด้วย เปิด เว็บเบราเซอร์ (web browser) ขึ้นมา

คำสั่ง LED=ON และ LED=OFF ต้องพิมพ์เป็นภาษาอังกฤษตัวพิมพ์ใหญ่ เท่านั้น


พิมพ์ http://192.168.1.39/LED=ON
หรือ 192.168.1.39/LED=ON
Enter

ไฟ LED จะติด



พิมพ์ http://192.168.1.39/LED=OFF
หรือ 192.168.1.39/LED=OFF
Enter

ไฟ LED จะดับ




วิธีที่ 2 ทดสอบโดย เว็บเพจ (web page)


ขั้นตอนการสร้างเว็บเพจ (*** ต้องแก้ไข ไอพี ให้ตรงกับที่เราได้รับมาจาก Router  ***)




 คลิกที่ปุ่ม ON ไฟ LED จะติด และ คลิกที่ปุ่ม OFF ไฟ LED จะดับ



วิธีที่ 3 
 ทดสอบโดย แอพแอนดรอยด์   (Android App)



ไปที่ Play Store ค้นหา :  mobile telnet





ติดตั้ง Mobile Telnet App





คลิกที่ สี่เหลี่ยม ด้านบนสุด ขวามือ แล้วคลิกที่ Telnet Settings





ช่อง IP ป้อน : ไอพี ของ ESP8266 ESP-01 เข้าไป
ช่อง Port ป้อน : 80 -> OK




คลิกที่ สี่เหลี่ยม ด้านบนสุด ขวามือ แล้วคลิกที่ Connect




รอสักครู่..



พิมพ์ LED=ON แล้วคลิก Send
ไฟ LED จะติด



พิมพ์ LED=OFF แล้วคลิก Send
ไฟ LED จะดับ




ถ้าขณะทดสอบดูที่ Tools -> Serial Monitor 





วีดีโอผลลัพธ์การทำงานของ โปรเจค ESP8266 ESP-01 ปิด เปิด ไฟ LED  ผ่าน WiFi



Code โปรเจค Arduino เปิดปิดไฟ ด้วย Wireless Joystick

PS2 Joystick Playstation Adapter for Arduino อะแดปเตอร์แปลงหัว PS2 เป็นขาต่อแบบ DIP สำหรับ Arduino คอนเนคเตอร์สำหรับแปลงจาก PS2 เป็นขา DI...