วันจันทร์ที่ 6 กุมภาพันธ์ พ.ศ. 2560

Home Alarm Systems ระบบเตือนภัยภายในบ้านควบคุมโดยบอร์ด Arduino

Home Alarm Systems ระบบเตือนภัยภายในบ้านควบคุมโดยบอร์ด Arduino
อุปกรณ์ที่ใช้
1. บอร์ด Arduino Uno R3 (EADN014) (บทความ Arduino) Q'ty 1 pcs

           เป็นบอร์ดไมโครคอนโทรเลอร์ตระกูล AVR ที่มีการพัฒนาแบบ Open Source คือมีการเปิดเผยข้อมูลทั้งด้าน Hardware และ Software ตัวบอร์ด Arduino ถูกออกแบบมาให้ใช้งานได้ง่าย ดังนั้นจึงเหมาะสำหรับผู้เริ่มต้นศึกษา และสามารถนำไปดัดแปลงเพิ่มเติม หรือพัฒนาต่อยอดได้อีกด้วย


2. จอ LCD Character 20x4 (EDPM045) (บทความ LCD) Q'ty 1 pcs
           จอ Liquid Crystal Display (LCD) เป็นจอแสดงผลรูปแบบหนึ่งที่นิยมนำมาใช้งานร่วมกับระบบสมองกลฝังตัวอย่างแพร่หลาย จอ LCD มีทั้งแบบแสดงผลเป็นตัวอักขระเรียกว่า Character LCD ซึ่งมีการกำหนดตัวอักษรหรืออักขระที่สามารถแสดงผลไว้อยู่แล้ว และแบบแสดงเป็นจุดเรียกว่า Graphic LCD


3. บอร์ดรีเลย์ 2 Channels (EFDV237) (บทความ Relay) Q'ty 1 pcs
           รีเลย์ (Relay) เป็นอุปกรณ์ไฟฟ้าชนิดหนึ่ง ซึ่งทำหน้าที่ตัดต่อวงจรแบบเดียวกับสวิตช์ โดยควบคุมการทำงานด้วยไฟฟ้า รีเลย์มีหลายประเภทหลายขนาด ตั้งแต่ขนาดเล็กที่ใช้ในงานอิเล็กทรอนิกส์ทั่วไป จนถึงขนาดใหญ่ที่ใช้ในงานไฟฟ้าแรงสูง โดยมีรูปร่างแตกต่างกันออกไป แต่มีหลักการทำงานที่คล้ายคลึงกัน สำหรับรีเลย์นิยมใช้ในการตัด-ต่อวงจร นอกจากนี้ยังสามารถนำไปใช้งานแบบอื่นได้หลากหลายรูปแบบ


4. Keypad 4x4 (EMSW025) Q'ty 1 pcs
           แป้นปุ่มกดหรือ Keypad เป็นอุปกรณ์สำหรับรับอินพุตจากผู้ใช้ มีลักษณะเป็นปุ่มกดหลายปุ่มจัดเรียงกันในลักษณะเป็นอาร์เรย์ แบ่งเป็นแถวแนวนอน (Row) และแถวแนวตั้ง (Column) เช่น 3x4 (12 ปุ่ม) หรือ 4x4 (16 ปุ่ม) เป็นต้น แต่ละปุ่มก็จะมีสัญลักษณ์เขียนกำกับไว้ เช่น ตัวเลข 0-9 # * A-D เป็นต้น


5. Buzzer Module (EADN028) Q'ty 1 pcs
           ลำโพงแบบ Magnetic-diaphragm ขนาดเล็กให้เสียงดัง มีความต้านทานภายในต่ำ Buzzer จะคล้ายกับลำโพงคือมันสามารถส่งเสียงได้โดยการสั่นสะเทือนที่เป็นจังหวะความถี่แล้วเกิดเป็นคลื่นเสียง


6. Flame Detector Module (EFDV309) Q'ty 1 pcs
           อุปกรณ์ตรวจจับเปลวไฟ (Flame Detector) สามารถตรวจจับเปลวไฟในขณะที่เกิดเหตุเพลิงไหม้ มักติดตั้งไว้เพื่อตรวจสอบในบริเวณที่มีวัตถุไวไฟวางอยู่


7. LED Module (EADN023) Q'ty 2 pcs
           LED (Light-Emitting Diode) หรือที่แปลเป็นไทยว่า ไดโอดเปล่งแสง หลอดไฟLED เมื่อได้รับแรงดันไฟฟ้าจะปล่อยคลื่นแสงออกมาให้ความสว่าง หลอดไฟ LED ที่เราเห็นมีขายกันตามร้านอุปกรณ์อิเล็กทรอนิกส์นั้นมีหลายแบบ โดยแต่ละแบบนั้นจะมีหลักการทำงานเหมือนกัน


8. PIR Motion Sensor Module (ESEN071) (บทความ PIR) Q'ty 1 pcs
           อุปกรณ์ Sensor ชนิดหนึ่งที่ใช้ตรวจจับคลื่นรังสี Infrared ที่แพร่จาก มนุษย์ หรือ สัตว์ ที่มีการเคลื่อนไหว ทำให้มีการนำเอา PIR มาประยุคใช้งานกันเป็นอย่างมากใช้เพื่อตรวจจับการเคลื่อนไหวของสิ่งมีชีวิต หรือ ตรวจจับการบุกรุกในงานรักษาความปลอดภัย


9. IIC (I2C) Adaptor Plate (EFDV296) Q'ty 1 pcs
           โมดูล I2C Bus เป็นโมดูลแปลงขาสัญญาณ Parallel เป็น I2C เพื่อลดจำนวนขาสัญญาณในการใช้งานจาก 16 ขาเหลือเพียง ขา ส่วนใหญ่นำมาใช้งานคู่กับจอ Character LCD เพื่อให้สะดวกต่อการเชื่อมต่อ และสามารถต่อจอแสดงผลหรืออุปกรณ์อื่นได้ในจำนวนที่มากขึ้น สามารถปรับให้รองรับได้ถึง ตำแหน่งแอดเดรส (20-27) เพื่อความยืดหยุ่นในการใช้งาน


หลักการทำงาน
           ระบบจำลองการรักษาความปลอดภัยภายในบ้านนี้ จะทำงานในขณะที่ผู้ใช้งานนั้นไม่อยู่บ้านหรือล็อคบ้านไว้ ระบบนี้ประกอบไปด้วยเซ็นเซอร์ที่ทำหน้าที่ในการตรวจจับสิ่งต่างๆ เช่น การบุกรุกเข้ามาโจรกรรม การเกิดอัคคีภัย เป็นต้น
           ขณะทำงานระบบจะเปิดการตรวจจับโดยรับสัญญาณอินพุตจากเซ็นเซอร์ 2 อย่างด้วยกันคือ PIR Motion Sensor (เซ็นเซอร์ตรวจจับการเคลื่อนไหว) ในระบบจำลองนี้ จะติดเซนเซอร์ไว้ในห้องรับแขก และ Flame Detector Sensor (เซ็นเซอร์ตรวจจับเปลวไฟ) จะติดเซนเซอร์ไว้ในห้องครัว เมื่อผู้อาศัยไม่อยู่บ้านหรือล็อคบ้านไว้ PIR Motion Sensor และ Flame Detector Sensor จะทำงาน เมื่อมีการเคลื่อนไหวภายในบ้าน สัญญาณกันขโมยจะส่งเสียง Alarm แจ้งเตือนออกทาง Buzzer ทันที หรือเมื่อเกิดเปลวไฟบริเวณห้องครัว (Flame Detector Sensor จะทำงานและสัญญาณ Alarm ก็จะทำงานเช่นกัน
           แต่เมื่อผู้อาศัยกลับมาแล้วและปลดล็อคประตูด้วยรหัสผ่าน “1234” ตามด้วยเครื่องหมาย ตามที่ตั้งไว้ มีผลทำให้ระบบเซนเซอร์ตรวจจับปิดการทำงาน และหลังจากปลดล็อคแล้ว ผู้อาศัยจะสามารถควบคุมการปิดเปิดเครื่องใช้ไฟฟ้าภายในบ้านได้ โดยกดปุ่มที่ Keypad (ปุ่ม A - หลอดไฟดวงที่ หรือ ปุ่ม B - หลอดไฟดวงที่ 2) และเมื่อผู้อาศัยจะเข้านอน ต้องการล็อคบ้านและเปิดระบบเตือนภัย ก็สามารถทำได้โดยกดที่ Keypad (ปุ่มC) 
           จากการทำงานของระบบนี้ เป็นเพียงการทำงานเบื้องต้นให้เห็นภาพ ผู้ใช้สามารถนำไปต่อยอดพัฒนาเพิ่มเติมได้ เช่น เชื่อมต่อกับ GSM Module เพื่อสื่อสารผ่านเครือข่ายโทรศัพท์มือถือและอินเตอร์เน็ต หรือเชื่อมต่ออุปกรณ์ LAN หรือ Wi-Fi เพิ่มเติมเพื่อสื่อสารผ่านอินเตอร์เน็ต แล้วประยุกต์การทำงานให้เกิด Alarm ให้ระบบส่ง SMS หรือโทรออกไปยังเจ้าของบ้านเพื่อเตือนภัยได้อีกด้วย
วิธีการต่อวงจร


โค้ดโปรแกรมการทำงาน การควบคุมการทำงานอุปกรณ์ต่างๆ (อ้างอิงตามบทความนี้) จำเป็นต้องมีการเรียกใช้ไลบรารี่ต่างๆ ดังต่อไปนี้คือ Password, Keypad, Wire และLiquidCrystal_I2C 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <Password.h>
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

Password password = Password( "1234" ); // Set the Password

// Set the LCD address to 0x27 for a 20 chars and 4 line display
LiquidCrystal_I2C lcd(0x27, 20, 4);

const byte ROWS = 4;        // Four rows
const byte COLS = 4;        //  columns
const int status_lock = A0; // LED Status Pin
const int status_unlock = A1; // LED Status Pin
const int led_bed = 11;     // Home Light2 Pin
const int led_bath = 12;    // Home Light1 Pin
int pir = A2;               // PIR Sensor Pin
int flame = A3;             // Flame Sensor Pin
int Buzzer = 10;            // Buzzer Module Pin
int alarmValue = 0; 
int fl = 0, state = 0, state1 = 0, state2 = 0, Alarm_fl = 0; // Flag
int dir = 8, dir1 = 0;
String test = "                    ";
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = { 2,3,4,5, };// Connect keypad ROW0, ROW1, ROW2 and
                    // ROW3 to these Arduino pins.
byte colPins[COLS] = { 6,7,8,9 };// Connect keypad COL0, COL1, COL2 and
                        // COL3 to these Arduino pins.

// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
ในส่วนแรกของโปรแกรมเป็นการประกาศเรียกใช้ไลบรารี่และตั้งค่า เริ่มจากกำหนด Password ในบทความนี้เป็น Password("1234" );
กำหนดค่าของจอ LCD (ในบทความนี้ ใช้จอ LCD ร่วมกับ I2C Adaptor) ต้องทำการกำหนดค่า ค่า คือ ตำแหน่งแอดเดรส จำนวนตัวอักษร และจำนวนบรรทัดเป็นLiquidCrystal_I2C lcd(0x27, 20, 4);
กำหนดค่าตัวแปรต่างๆ ที่ต้องการนำไปใช้ในโปรแกรม
และสุดท้าย กำหนดขาในการนำไปใช้งานกับ Keypad โดยต้อง Mapkey ที่ต้องการใช้งานไว้ก่อนว่าเป็นแบบไหน ซึ่งในบทความนี้ใช้เป็น 4x4 Keypad พร้อมทั้งกำหนดPinRow, PinColumn หลังจากกำหนดเสร็จแล้วเรียกใช้ฟังก์ชั่นในการสร้าง Keypad จากไลบรารี่โดยนำพารามิเตอร์ที่กำหนดไว้ใส่ลงไปในฟังก์ชั่นเพื่อ Mapkey

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void setup()
{
    Serial.begin(9600); // Define Serial for Debug Sensor & Keyped
    lcd.begin();  //Define LCD
    lcd.backlight();
    pinMode(status_lock, OUTPUT);    // Sets the digital pin as output
    pinMode(status_unlock, OUTPUT);  // Sets the digital pin as output
    pinMode(led_bed, OUTPUT);        // Sets the digital pin as output
    pinMode(led_bath, OUTPUT);       // Sets the digital pin as output

    keypad.addEventListener(keypadEvent); // Add an event listener for this keypad
    // Sets First Screen LCD
     lcd.print("* Hello Welcome To *");
     lcd.setCursor(0, 1);
     lcd.print(" Home Alarm Systems ");
     lcd.setCursor(0, 2);
     lcd.print("www.ThaiEasyElec.com");
     lcd.setCursor(0, 3);
     lcd.print("  ** Home Lock **  ");
}

void loop()
{
  keypad.getKey(); // Check the Keyped
  motion_on();     // Open PIR Motion Sensor
  flame_on();      // Open Flame Detector Sensor
  close_all_power(); // Close Light1-2 and Set status_lock
}
ฟังก์ชั่น Setup เป็นการตั้งค่าหรือกำหนดการทำงานอินพุตเอาต์พุตของขาต่างๆ ดังนี้
กำหนดความเร็วในการสื่อสาร Serial เพื่อใช้ในการรับ-ส่งข้อมูลกับคอมพิวเตอร์
เรียกใช้ฟังก์ชั่นเพื่อ Initial จอ LCD ที่เรานำมาใช้งานในที่นี้เป็นการติดต่อแบบ I2C
กำหนดการทำงานของขา status_lock(A0)  status_unlock(A1)  led_bed(11)  led_bath(12) ให้เป็นโหมดเอาต์พุต
ฟังก์ชั่น Loop เรียกใช้งานฟังก์ชั่นย่อยๆ ด้วยกันทั้งหมด ฟังก์ชั่น คือ
motion_on(); = เปิดการใช้งาน PIR Motion Sensor รับค่าจาก Analog A2 เพื่อตรวจสอบการเคลื่อนไหว
flame_on(); = เปิดการใช้งาน Flame Detector รับค่าจาก Analog A3 เพื่อตรวจสอบเปลวไฟ
close_all_power(); = ปิดหรือตัดไฟเครื่องใช้ไฟฟ้าที่ไม่ได้ใช้งานภายในบ้าน 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//take care of some special events
void keypadEvent(KeypadEvent eKey){
    switch (keypad.getState()){
    case PRESSED:
        //Serial.print("Pressed: ");
        //Serial.println(eKey);
        lcd.setCursor(dir1, 3);
        lcd.print(test);
        test = "*";
        lcd.setCursor(dir, 3);
        lcd.print(test);
        dir1 = dir;
        switch (eKey){
            case 'A':
                if(fl == 1){
                    if(state == 0){
                        digitalWrite(led_bed, HIGH); // Open the light 2
                        state = 1;
                    }else if(state == 1){
                        digitalWrite(led_bed, LOW); // Close the light 2
                        state = 0;
                    }
                }
                break;
            case 'B':
                if(fl == 1){
                    if(state1 == 0){
                        digitalWrite(led_bath, HIGH); // Open the light 1
                        state1 = 1;
                    }else if(state1 == 1){
                        digitalWrite(led_bath, LOW); // Close the light 1
                        state1 = 0;
                    }
                }
                break;
            case 'C':
                if(fl == 1){
                    state2 = 1;
                    lcd.setCursor(0, 3);
                    lcd.print("  ** Home Lock **  ");
                    dir  = 8;
                    dir1 = 0;
                    test = "                    ";
                }
                break;
            case '#':
                checkPassword(); // Call the function checkPassword
                password.reset(); //Reset Key
                break;
            default:
                password.append(eKey);
        }
    }
}

KeypadEvent เป็นฟังก์ชั่นตรวจสอบเหตุการณ์ของ Keypad เมื่อกดคีย์เข้ามา ใช้ในการกำหนดเหตุการณ์ให้เป็นไปตามที่เราต้องการ เช่น ถ้าทำการกดปุ่ม ให้สั่งงาน Outputที่ขา led_bed (11) ให้อยู่ในสภาวะ HIGH(1) เป็นต้น ในบทความนี้เราได้กำหนดเหตุการณ์ไว้ด้วยกันทั้งหมด เหตุการณ์ด้วยกัน คือ
1.             เมื่อกดปุ่ม # ให้นำคีย์ที่กดเข้ามาก่อนหน้าไปตรวจสอบด้วยฟังก์ชั่นcheckPassword และเคลียร์ค่าคีย์ที่กดเข้ามาก่อนหน้าทั้งหมดเพื่อรอรับคีย์ใหม่
2.             เมื่อกดรหัสผ่านถูกต้องแล้ว การกดปุ่ม A หนึ่งครั้งจะเป็นการสั่งงานให้ Output1 อยู่ในสภาวะ HIGH หรือถ้ามีการกดซ้ำก็จะสั่งงาน Output1 อยู่สภาวะ LOW สลับกันไปเรื่อยๆ
3.             เมื่อกดรหัสผ่านถูกต้องแล้ว การกดปุ่ม B หนึ่งครั้งจะเป็นการสั่งงานให้ Output2 อยู่ในสภาวะ HIGH หรือถ้ามีการกดซ้ำก็จะสั่งงาน Output2 อยู่สภาวะ LOW สลับกันไปเรื่อยๆ
4.             กดปุ่ม C เมื่อต้องการล็อคบ้านหรือเปิดระบบการแจ้งเตือนขึ้นมาใหม่อีกครั้ง

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void checkPassword(){ // Function check the password
    if (password.evaluate()){
    //Add code to run if it works
        while(1){
            //Serial.println("Success");
            fl = 1;
            digitalWrite(status_lock, LOW);
            digitalWrite(status_unlock, HIGH);
            lcd.setCursor(0, 3);
            lcd.print(" ** Home Unlock ** ");
            keypad.getKey();
            Alarm_off();
            password.reset();
        }
    }else{
        Serial.println("Wrong");
        //add code to run if it did not work
        lcd.setCursor(0, 3);
        lcd.print("**Password Wrong **");
        delay(1000);
    }
}

checkPassword เป็นฟังก์ชั่นตรวจสอบ password ว่าคีย์ที่กดเข้ามานั้นตรงกับที่กำหนดไว้ข้างต้นหรือไม่ ในฟังก์ชั่นนี้เราต้องกำหนดเหตุการณ์ว่าถ้า password ถูกต้อง จะให้ทำอะไร และถ้าไม่ถูกต้องจะให้ทำอะไร เราได้กำหนดไว้แล้วในที่นี้ คือ
กรณี password ถูกต้อง ให้สั่งงาน Output ที่ขา status_lock เป็นสภาวะ LOWพร้อมทั้งสั่งงาน Output ที่ขา status_unlock เป็นสภาวะ HIGH ต่อมาให้เปลี่ยนการแสดงผลทางหน้าจอ LCD บรรทัดที่ เป็น HomeUnlock และทำการวนรอรับค่าจาก Keypad อีกครั้งเพื่อใช้ในการสั่งงาน เปิด-ปิด ไฟภายในบ้าน พร้อมทั้งตัดระบบเตือนภัยทั้งหมด
กรณี password ไม่ถูกต้อง ให้ทำการกลับเริ่มต้นรับคีย์ใหม่จนกว่า password จะถูกต้อง

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void close_all_power(){ // Function close the light all.
    digitalWrite(status_lock, HIGH);
    digitalWrite(status_unlock, LOW);
    digitalWrite(led_bed, LOW);
    digitalWrite(led_bath, LOW);
}
void Alarm(){ // Function Alarm.
    tone(Buzzer, 10, 100); // Alarm at 10 Hz 100 milliseconds.
    delay(100); // delay 100 milliseconds
    tone(Buzzer, 300, 100);// Alarm at 300 Hz 100 milliseconds.
    delay(100); // delay 100 milliseconds
}
void Alarm_off(){ // Function Alarm off.
    digitalWrite(Buzzer,HIGH); //Set buzzer pin is HIGH for stop alarm
}

close_all_power เป็นฟังก์ชั่นกำหนดให้ปิดไฟทั้งหมดที่ต้องการหรือสั่งงานให้Output ที่ต้องการ อยู่ในสภาวะ LOW ทั้งหมด
Alarm เป็นฟังก์ชั่นสั่งงานหรือกำหนดให้ buzzer ดังที่ความถี่เท่าไร นานแค่ไหน ในบทความนี้เราจะตั้งให้สลับเสียงกัน เสียงเพื่อให้เหมือนกับ Alarm 2 เสียงทั่วๆ ไป เราสามารถกำหนดเพิ่มเติมหรือแก้ไข ขึ้นอยู่กับการนำไปใช้งาน
Alarm_off เป็นฟังก์ชั่นกำหนดให้ buzzer ไม่ส่งเสียงดังหรือปิด buzzer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void motion_on(){ // Function Open PIR Motion Sensor.
    alarmValue = analogRead(pir); // Read analog sensor 0-1023.
    //Serial.println (alarmValue); // Debug Sensor value.
    if(alarmValue >= 1000){ // Check the value
        Alarm();
    }
        if(alarmValue < 1000){
        Alarm_off();
    }
}
void flame_on(){ // Function Open Flame Detector Sensor.   
    alarmValue = analogRead(flame); // Read analog sensor 0-1023.
    //Serial.println (alarmValue);  // Debug Sensor value. 
    if(alarmValue <= 700){   // Check the value     
        Alarm();
    }
    if(alarmValue > 700){
        Alarm_off();
    }
}

motion _on เป็นฟังก์ชั่นเปิดใช้งาน PIR Motion Sensor การทำงานคือรับค่าที่ได้จาก Sensor มาเป็น Analog แรงดัน 0-5 V มาแปลงเป็นดิจิตอล โดยต้องบันทึกค่าไว้ก่อนว่าตอนที่ไม่มีการเคลื่อนไหวจะเท่ากับเท่าไร ในที่นี้ค่าตอนที่ไม่มีการเคลื่อนไหวอ่านได้ประมาณ 700 และเมื่อมีการเคลื่อนไหวอ่านได้ประมาณ 1000+ จึงกำหนดว่าถ้ามากกว่า1000 แสดงว่ามีการเคลื่อนไหวให้ทำการ Alarm ทันที แต่ถ้าน้อยกว่า 1000 แสดงว่าไม่มีการเคลื่อนไหวก็ไม่ต้อง Alarm (ผู้ใช้ต้องตรวจสอบค่าที่ได้จากเซ็นเซอร์แต่ละตัวก่อนการใช้งาน เนื่องจากค่า output นั้นขึ้นอยู่กับอุปกรณ์แต่ละตัวทำให้ค่าที่ได้อาจไม่เท่ากัน)
flame_on เป็นฟังก์ชั่นเปิดการใช้งาน Flame Detector การทำงานคือรับค่าที่ได้จากSensor มาเป็น Analog แรงดัน 0-5 V เช่นเดียวกันกับ PIR Motion Sensor แต่ Flame Detector นั้นใช้ในการตรวจวัดแสงไฟ หรือเปลวไฟ ต้องทำการบันทึกค่าไว้ก่อนว่าตอนที่ไม่เกิดเปลวไฟจะเท่ากับเท่าไร และตอนที่เกิดเปลวไฟนั้นมีค่าเท่าไร ในที่นี้ค่าตอนยังไม่มีเปลวไฟ ค่าที่ได้ประมาณ 800+ และเมื่อเกิดเปลวไฟค่าที่ได้ลดลงเหลือประมาณ 500+ แต่ไม่เกิน 700 จึงกำหนดว่าถ้าน้อยกว่า 700 แสดงว่ามีเปลวไฟเกิดขึ้นให้ทำการ Alarmทันที แต่ถ้ามากกว่า 700 แสดงว่าไม่มีเปลวไฟเกิดขึ้นก็ไม่ต้อง Alarm  (เช่นเดียวกับ PIR Motion Sensor ผู้ใช้ต้องตรวจสอบค่าที่ได้จากเซ็นเซอร์แต่ละตัวก่อนการใช้งาน  เนื่องจากค่า output นั้นขึ้นอยู่กับอุปกรณ์แต่ละตัวทำให้ค่าที่ได้อาจไม่เท่ากัน)
         หากสนใจจะต่อขยายเพิ่มเติมสามารถนำไปต่อกับ GSM โมดูล แล้วเมื่อเกิด Alarmให้ส่ง SMS หรือโทรออกไปแจ้งผู้อาศัยได้ สามารถหาข้อมูลเพิ่มเติมและประยุกต์ใช้ได้จากบทความด้านล่างครับ



อ้างอิง
http://www.thaieasyelec.com/article-wiki/embedded-electronics-application/home-alarm-systems-control-by-arduino.html

การใช้งาน Arduino + Relay Module ควบคุมการปิดเปิดเครื่องใช้ไฟฟ้า

การใช้งาน Arduino + Relay Module ควบคุมการปิดเปิดเครื่องใช้ไฟฟ้า

ตัวอย่างการใช้งาน Arduino + Relay Module
ควบคุมการปิดเปิดเครื่องใช้ไฟฟ้า



    รีเลย์ (Relay) เป็นอุปกรณ์ไฟฟ้าชนิดหนึ่ง ซึ่งทำหน้าที่ตัดต่อวงจรแบบเดียวกับสวิตช์ โดยควบคุมการทำงานด้วยไฟฟ้า Relay มีหลายประเภท ตั้งแต่ Relay ขนาดเล็กที่ใช้ในงานอิเล็กทรอนิกส์ทั่วไป จนถึง Relay ขนาดใหญ่ที่ใช้ในงานไฟฟ้าแรงสูง โดยมีรูปร่างหน้าตาแตกต่างกันออกไป แต่มีหลักการทำงานที่คล้ายคลึงกัน สำหรับการนำ Relay ไปใช้งาน จะใช้ในการตัดต่อวงจร ทั้งนี้ Relay ยังสามารถเลือกใช้งานได้หลากหลายรูปแบบ


ภายใน Relay จะประกอบไปด้วยขดลวดและหน้าสัมผัส 
         หน้าสัมผัส NC (Normally Close) เป็นหน้าสัมผัสปกติปิด โดยในสภาวะปกติหน้าสัมผัสนี้จะต่อเข้ากับขา COM (Common) และจะลอยหรือไม่สัมผัสกันเมื่อมีกระแสไฟฟ้าไหลผ่านขดลวด         หน้าสัมผัส NO (Normally Open) เป็นหน้าสัมผัสปกติเปิด โดยในสภาวะปกติจะลอยอยู่ ไม่ถูกต่อกับขา COM (Common) แต่จะเชื่อมต่อกันเมื่อมีกระแสไฟไหลผ่านขดลวด         ขา COM (Common) เป็นขาที่ถูกใช้งานร่วมกันระหว่าง NC และ NO ขึ้นอยู่กับว่า ขณะนั้นมีกระแสไฟฟ้าไหลผ่านขดลวดหรือไม่ หน้าสัมผัสใน Relay 1 ตัวอาจมีมากกว่า 1 ชุด ขึ้นอยู่กับผู้ผลิตและลักษณะของงานที่ถูกนำไปใช้ จำนวนหน้าสัมผัสถูกแบ่งออกดังนี้         สวิตช์จะถูกแยกประเภทตามจำนวน Pole และจำนวน Throw ซึ่งจำนวน Pole (SP-Single Pole, DP-Double Pole, 3P-Triple Pole, etc.) จะบอกถึงจำนวนวงจรที่ทำการเปิด-ปิด หรือ จำนวนของขา COM นั่นเอง และจำนวน Throw (ST, DT) จะบอกถึงจำนวนของตัวเลือกของ Pole ตัวอย่างเช่น SPST- Single Pole Single Throw สวิตช์จะสามารถเลือกได้เพียงอย่างเดียวโดยจะเป็นปกติเปิด (NO-Normally Open) หรือปกติปิด (NC-Normally Close) แต่ถ้าเป็น SPDT- Single Pole Double Throw สวิตช์จะมีหนึ่งคู่เป็นปกติเปิด (NO) และอีกหนึ่งคู่เป็นปกติปิดเสมอ (NC) 
ตัวอย่างที่1 ควบคุมมอเตอร์ให้หมุนได้ทั้งซ้าย-ขวา โดยไม่ต้องการคุมความเร็วรอบ
มอเตอร์หมุนขวา     
        มอเตอร์หมุนซ้าย

    จากวงจรนี้ เราจะเห็นได้ว่าในการจะควบคุมให้มอเตอร์หมุนไปกลับ หรือ ซ้าย-ขวา นั้นจะต้องใช้ Relay 2 ตัวในการควบคุม วิธีการต่อวงจรเป็นดังนี้
• นำขั้ว + ของมอเตอร์ต่อเข้ากับขา COM ของรีเลย์ตัวที่ 1
• นำขั้ว – ของมอเตอร์ต่อเข้ากับขา COM ของรีเลย์ตัวที่ 2
• นำขา NC ของรีเลย์ทั้ง 2 ตัว ต่อเข้ากับไฟลบ (GND)
• นำขา NO ของรีเลย์ทั้ง 2 ตัว ต่อเข้ากับไฟบวก (+5VDC)
วิธีต่อใช้งานจริงตามภาพด้านล่างนี้ โดยมีอุปกรณ์ดังนี้ Arduino + Relay Module + DC Motor



ภาพแสดงการต่อใช้งาน Arduino + Relay Module + Motor


หลักการการทำงานคือ มีบอร์ด Arduino UNO R3 ในการรับข้อมูลจากคอมพิวเตอร์สื่อสารผ่านพอร์ต Serial แล้วนำค่าที่ได้ไปตรวจสอบว่าตรงกับค่าที่กำหนดไว้หรือไม่ ถ้าตรงกันก็สั่งให้ Relay ทำงานตามที่เราต้องการ
ตัวอย่างโค้ดโปรแกรม
#define R 13 //กำหนดขาที่นำไปต่อกับรีเลย์
#define L 12
char test ; //สร้างตัวแปรไว้สำหรับรอรับข้อมูล
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
pinMode(R, OUTPUT); // กำหนดโหมดให้เป็น Output
pinMode(L, OUTPUT);
}
void loop() // run over and over
{
if (Serial.available()) // ตรวจสอบว่ามีข้อมูลเข้ามาหรือไม่
test = Serial.read();
else if (test == '1') // ถ้าข้อมูลที่เข้ามาคือ 1, 2, 3 ให้ทำงานตามที่กำหนด
{
digitalWrite(R, HIGH);
digitalWrite(L, LOW);
else if (test == '2')
{
digitalWrite(L, HIGH);
digitalWrite(R, LOW);
}
else if (test == '3')
{
digitalWrite(L, LOW);
digitalWrite(R, LOW);
}
}
ขั้นตอนการทดสอบ
1. ดาวน์โหลดโปรแกรมสำหรับส่งข้อมูลผ่าน Serial (ในบทความนี้ใช้โปรแกรม Terminal.exe)
2. เปิดโปรแกรม Arduino นำโค้ดตัวอย่างด้านบน ไปรันและอัพโหลดไปยัง Arduino UNO R3
3. เปิดโปรแกรม Terminal.exe เลือก Com Port และกำหนดความเร็วในการรับส่งข้อมูล จากนั้นกดปุ่ม Connect

4. ทำการส่งข้อมูลให้ Arduino โดยพิมพ์ข้อความลงในช่องด้านล่างของโปรแกรม
a. ข้อมูลที่กำหนดไว้คือ 1 = หมุนขวา, 2 = หมุนซ้าย, 3 = หยุดหมุน



อ้างอิง
www.thaieasyelec.com/article-wiki/review-product-article/ตัวอย่างการใช้งาน-arduino-relay-module-ควบคุมการปิดเปิดเครื่องใช้ไฟฟ้า.html

วันศุกร์ที่ 20 มกราคม พ.ศ. 2560

Eight digital tube module LED display Eight serial 595 drivers พร้อมสายไฟ

Eight digital tube module LED display Eight serial 595 drivers พร้อมสายไฟ
LED แสดงผลดิจิตอลขนาด 8 หลักสีแดง
รายละเอียด Eight digital tube module LED display Eight serial 595 drivers
1. Driven by 2 595 digital tube, need microcontroller IO port 3 road, according to the principle of digital tube dynamic scanning display;
2. Wide working voltage of 3.3 V to 5 V.
3. PCB size: 71 mm * 22 mm
4. Digital tube type: 0.36 four of Yang
ตัวอย่างโคดพร้อมใช้งานใน 1 นาที (ก็อปไปวางแล้วออกเลย)
/*
    written by Jason Berger , พ.ไพศาล , arduinoall
 reedited by Phaisarn Te. @060614
 
 8-Digit 7-Segment display driver.
 2x 74HC595 wired to 2x 4-digit 7-segment displays
 bits 0-7 select a digit
 bits 8-14 A-G
 
 */

//กำหนด ขา pin
const int SCLK_pin=4;
const int RCLK_pin=5;
const int DIO_pin =6;


// 0-9   --> ใช้ค่า 0-9
// 0.-9. --> ใช้ค่า 10-19
// space --> ' '
// A-Z, a-z --> 'A' 'B' ... 'a' 'b'

// กำหนดค่าที่ต้องการแสดงเริ่มต้น เช่น
char disp_c[]= {
  ' ','O','N','I','U','D','R','A'}; //   = แสดงคำว่า ARDUINO
//char disp_c[]= {' ','N','O',' '}; //   = แสดงคำว่า ON
//char disp_c[]= {'F','F','O',' '}; //   = แสดงคำว่า OFF
//char disp_c[] = {2,4,16,' '};        //  = แสดงค่า   6.42   (ei 16 --> 6.)


int  disp[8];

//time values for delay workaround
unsigned long prev =0;
unsigned long waitMS=20;




void setup()
{

  pinMode(RCLK_pin,OUTPUT);
  pinMode(DIO_pin,OUTPUT);
  pinMode(SCLK_pin,OUTPUT);

  showDisplay();
}  

int n;
unsigned long start=millis();
byte b = 0;
void loop()
{
  showDisplay();
  if(b==0){

    b++;
    wait(3000);     // หน่วงเวลาแสดงข้อความต้อนรับ
  }
  else{
    if ( millis() > (prev + waitMS))
    {
      //code to loop in here


      // ระหว่าง loop แก้ไขแสดงค่าอื่นๆได้

      /*
      // ตัวอย่างแสดงคำว่า Ardu
       disp_c[0] = 'u';
       disp_c[1] = 'd';
       disp_c[2] = 'r';
       disp_c[3] = 'A';
       */

      // ตัวอย่างแสดงค่า 95.42
      /*disp_c[0] = 2;
       disp_c[1] = 4;
       disp_c[2] = '-'; //15;  // --> แสดงเลข 5.
       disp_c[3] = 9;*/


      // ตัวอย่าง การ run เลข
      // แก้ไขตรงนี้      disp_c[0] = n%10;                           // แสดงผลหลัก 1
      disp_c[1] = (n/10)%10;                   // แสดงผลหลัก 2
      disp_c[2] = (n/100)%10+10;          // แสดงผลหลัก 3
      disp_c[3] = (n/1000)%10;              // แสดงผลหลัก 4

     // แก้ไขตรงนี้
      disp_c[4] = 'd';
      disp_c[5] = 'c';
      disp_c[6] = 'b';
      disp_c[7] = 'a';
      n++;
      if(n>=10000) {
        n=0;
      }

      // หน่วงเวลา
      wait(200);
    }
  }
}


void showDisplay()
{
  setDisp();
  for(int i=0; i<8; i++)
  {
    setDigit(i,disp[i]);
  }
}

void setDigit(int dig, int character)
{
  int digits[]= {
    128,64,32,16,8,4,2,1      };

  //character set (0-9)0-9
  //            (10-19)0.-9.
  //            (20-45)A-Z
  //            (46-71)a-z
  //            (72)- (73) space
  int characters[]= {
    3,159,37,13,153,73,65,31,1,9,
    2,158,36,12,152,72,64,30,0,8,
    17,1,99,3,97,113,67,145,243,135,145,227,85,19,3,49,25,115,73,31,129,129,169,145,137,37,
    5,193,229,133,33,113,9,209,247,143,81,227,85,213,197,49,25,245,73,225,199,199,169,145,137,37,
    253,255      };

  digitalWrite(RCLK_pin, LOW);
  shiftOut(DIO_pin, SCLK_pin, LSBFIRST, characters[character]);
  shiftOut(DIO_pin, SCLK_pin, LSBFIRST, digits[dig]);
  digitalWrite(RCLK_pin, HIGH);
}

void setDisp()
{
  for (int i=0; i<8;i++)
  {
    int val = disp_c[i];
    if((val >= 32)&&(val <= 47)){ // ! ถึง / ไม่ให้แสดง
      switch (val){
      case 45 :
        val = 72;
        break;  // เครื่องหมาย -
      default :
        val = 73;
        break;  // ค่าอื่นระหว่างนี้ ไม่ให้แสดง
      }
    }
    else if((val >= 48)&&(val <= 57)) //0-9
    {
      val -= 48;
    }
    else if((val >= 65)&&(val <= 90)) //A-Z
    {
      val -= 45;
    }
    else if((val >= 97)&&(val <= 122)) //a-z
    {
      val -= 51;
    }

    disp[i] = val;

  }
}   
void wait( unsigned long milsec)
{
  prev = millis();
  waitMS = milsec;
}
ถ้าต้องการปรับเปลียนโคดแสดงตัวเลขเอง หรือต้องการสร้างวงจรเอง 
ลองดูได้ที่เว็บนี้ครับ http://portfolio.girshwin.com/led_shift.php

อ้างอิง


https://www.arduinoall.com/product/128/eight-digital-tube-module-led-display-eight-serial-595-drivers-พร้อมสายไฟ

วันพฤหัสบดีที่ 12 มกราคม พ.ศ. 2560

LCD 16x2 Keypad Shield for Arduino

LCD 16x2 Keypad Shield for Arduino
จอแสดงผล LCD ขนาด 16 ตัวอักษร 2 บรรทัด พร้อมปุ่มกด สามารถใช้ป้อนค่าปุ่มที่กดให้กับ Arduino เอาไปควบคุมข้อมูลต่าง ๆ ที่ต้องการได้อย่างสะดวก ไม่ต้องต่อสายเพิ่ม แค่เสียบก็พร้อมใช้งาน เหมาะสำหรับงานแสดงผลข้อมูลออกจอ LCD ที่ต้องการรับค่าปุ่มจากผู้ใช้ไปประมวลผล
ตัวอย่างโคด Arduino LCD Keypad 
// อัพโหลดเสร็จ ปรับความสว่างของจอ LCD โดยหมุนตามเข็มนาฬิกาเพื่อให้ตัวอักษรเข้มขึ้น
//Sample using LiquidCrystal library
#include <LiquidCrystal.h>

/*******************************************************

This program will test the LCD panel and the buttons
Mark Bramwell, July 2010

********************************************************/

// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// define some values used by the panel and buttons
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor 
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 // For V1.1 us this threshold
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 250)  return btnUP; 
 if (adc_key_in < 450)  return btnDOWN; 
 if (adc_key_in < 650)  return btnLEFT; 
 if (adc_key_in < 850)  return btnSELECT;  

 // For V1.0 comment the other threshold and use the one below:
/*
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 195)  return btnUP; 
 if (adc_key_in < 380)  return btnDOWN; 
 if (adc_key_in < 555)  return btnLEFT; 
 if (adc_key_in < 790)  return btnSELECT;   
*/


 return btnNONE;  // when all others fail, return this...
}

void setup()
{
 lcd.begin(16, 2);              // start the library
 lcd.setCursor(0,0);
 lcd.print("Push the buttons"); // print a simple message
 Serial.begin(9600);
}

void loop()
{
 lcd.setCursor(9,1);            // move cursor to second line "1" and 9 spaces over
 lcd.print(millis()/1000);      // display seconds elapsed since power-up


 lcd.setCursor(0,1);            // move to the begining of the second line
 lcd_key = read_LCD_buttons();  // read the buttons

 switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
   case btnRIGHT:
     {
     lcd.print("RIGHT ");
     break;
     }
   case btnLEFT:
     {
     lcd.print("LEFT   ");
     break;
     }
   case btnUP:
     {
     lcd.print("UP    ");
     break;
     }
   case btnDOWN:
     {
     lcd.print("DOWN  ");
     break;
     }
   case btnSELECT:
     {
     lcd.print("SELECT");
     break;
     }
     case btnNONE:
     {
     lcd.print("NONE  ");
     break;
     }
 }


}
1602 LCD 16x2 Keypad Shield for Arduino

วันพุธที่ 4 มกราคม พ.ศ. 2560

Arduino วัดอุณหภูมิและความชื้น ด้วยเซนเซอร์ DHT22 / DTH21 / DHT11

วิธี ใช้งาน Arduino วัดอุณหภูมิและความชื้น ด้วยเซนเซอร์ DHT22 / DTH21 / DHT11 ใช้ได้ภายใน 3 นาที



Arduino สามารถใช้งานเป็นอุปกรณ์เซนเซอร์ ความชื้นและอุณหภูมิ สำหรับประยุกต์ใช้กับงานตามต้องการได้ เช่น ระบบควบคุมอุณหภูมิความชื้นในโรงเพาะเห็น ระบบควบคุมอัตโนมัติ หรือจะใช้ทำเป็นเซนเซอร์เล็ก ๆ สำหรับมอนิเตอร์อุณหภูมิความชื้นในสถานที่ต่าง ๆ การใช้งานเซนเซอร์อุณหภูมิและความชื้นร่วมกับ Arduino สามารถทำได้โดยง่าย เพราะมีไลบารีมาให้พร้อมใช้งาน เพียงแค่ก็อปไปวางก็สามารถดึงค่าอุณหภูมิและความชื้นออกมาได้แล้ว

ในตัวอย่างนี้ ใช้เซนเซอร์่วัดความชื้นและอุณหภูมิ DHT22 ร่วมกับ Arduino 



การต่อวงจร DHT11 / DHT22 กับ Arduino ต่อตามรูปนี้
สำหรับการต่อวงจร DHT21 กับ Arduino ต่อตามนี้


การเขียนโคด Arduino เพื่ออ่านค่าความชื้นและอุณหภูมิจากเซนเซอร์ DHT22
  • สายสีดำ -> Gnd
  • สายสีแดง -> 5 Vcc
  • สายสีเหลือง -> 2 (สาย ข้อมูล)
  • ต่อ R 4.7K คร่อมสายสีแดงกับสายสีเหลือง
2.เขียนโคดโปรแกรมตามนี้ (ก็อปวาง)
#include "DHT.h"
DHT dht;
void setup()
{
Serial.begin(9600);
Serial.println();
Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");
dht.setup(2); // data pin 2
}
void loop()
{
delay(dht.getMinimumSamplingPeriod());
float humidity = dht.getHumidity(); // ดึงค่าความชื้น
float temperature = dht.getTemperature(); // ดึงค่าอุณหภูมิ
Serial.print(dht.getStatusString());
Serial.print("\t");
Serial.print(humidity, 1);
Serial.print("\t\t");
Serial.print(temperature, 1);
Serial.print("\t\t");
Serial.println(dht.toFahrenheit(temperature), 1);
}

3. เปิดดูผลลัพธ์ที่หน้าจอ Serial Monitor ก็จะพบว่าเราสามารถดึงค่าอุณหภูมิ ความชื้น
จากเซนเซอร์ DHT22 / DHT21 / DHT11 โดยใช้ Arduino ออกมาใช้งานได้แล้ว



ข้อมูลอุปกรณ์เซนเซอร์ ความชื้นและอุณหภูมิ
อ้างอิง

https://www.arduinoall.com/article/18/%E0%B8%AA%E0%B8%AD%E0%B8%99-%E0%B8%A7%E0%B8%B4%E0%B8%98%E0%B8%B5-%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%87%E0%B8%B2%E0%B8%99-arduino-%E0%B8%A7%E0%B8%B1%E0%B8%94%E0%B8%AD%E0%B8%B8%E0%B8%93%E0%B8%AB%E0%B8%A0%E0%B8%B9%E0%B8%A1%E0%B8%B4%E0%B9%81%E0%B8%A5%E0%B8%B0%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B7%E0%B9%89%E0%B8%99-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2%E0%B9%80%E0%B8%8B%E0%B8%99%E0%B9%80%E0%B8%8B%E0%B8%AD%E0%B8%A3%E0%B9%8C-dht22-dth21-dht11-%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B9%84%E0%B8%94%E0%B9%89%E0%B8%A0%E0%B8%B2%E0%B8%A2%E0%B9%83%E0%B8%99-3-%E0%B8%99%E0%B8%B2%E0%B8%97%E0%B8%B5