DIY กริ่งไร้สาย แจ้งเตือนผ่านไลน์พร้อมถ่ายรูป | MaxMac’s One-Day Builds

เพิ่มความสามารถของกริ่งไร้สายธรรมดา ให้สามารถแจ้งเตือนได้ผ่าน Line Notify พร้อมกับรูปจากกล้อง IP Cam

สวัสดีครับ ช่วงนี้ก็เข้าหน้าฝนเป็นที่เรียบร้อย น้ำก็เข้ากริ่งบ้านผมเป็นที่เรียบร้อย กดทีคือไฟช๊อตดับทั้งบ้าน ผมก็เลยไปซื้อกริ่งไร้สายมาราคาแค่ 100 บาท ลองกดดูก็ใช้ได้ตามที่มันควรจะเป็น

IMG_5958

แล้วผมก็คิดว่า ทำไมกดกริ่งแล้วไม่ให้มันยิงไปที่ Line Notify ด้วยเลยหละ ตามโลโก้ของ Line Notify เลยที่เป็นรูปกริ่ง ความคิดนี้ก็คงจะเข้าท่านะ

เริ่มจากการแกะวงจรกริ่งไร้สายที่เป็นตัวรับออกมาดู วงจรไม่ได้ซับซ้อนอะไรมาก ลองไล่ดูจากปุ่มข้างๆ ที่เอาไว้เปลี่ยนเสียงกริ่ง เชื่อมต่อมาที่ IC ตัวใหญ่ที่ชื่อ SXD059A ผมก็เดาว่า IC ตัวนี้ทำหน้าที่เล่นเสียงแน่ๆ แน่นอนครับ ง่ายๆ ไปหา Datasheet ใน Google ดู….. อืมม ไม่เจอ!   เลยทำการ Probe ขา IC ดู การที่มันจะเล่นเสียงได้เวลามีคนกดกริ่ง ต้องมีสัญญาณ​ Rising edge ไม่ก็ Falling edge เข้ามา trigger มันที่ขา IC สักขาแหละ! แล้วก็เจอตามที่คิดไว้  เมื่อมีคนกดกริ่ง จะมี Logic High (3v) เข้ามาที่ขา IC ตามที่วงไว้ในรูป ซึ่งไฟนั้นก็มาจาก transistor ข้างๆ นั่นแหละ

IMG_5960.jpg

ทีนี้ก็หวานหมูละ Logic High 3v สามารถให้ ESP8266 เช็คได้เลยผ่านคำสั่งdigitalWrite(PIN)
ไม่รอช้าครับ เชื่อมสายไปที่ขาดังกล่าวแล้วก็ต่อกับ NodeMCU เลย ผมต่อเข้ากับ PIN D1 และต่อ Ground เข้ากับแบ็ตขั้วลบเพื่อให้ครบวงจร

ทีนี้ก็รันโค้ดทดสอบว่าตัวบอร์ดของเราสามารถเช็คว่ามีคนกดกริ่งได้แล้ว จากตัวอย่าง Code ด้านล่าง

/*
* doorBell_test.ino
* Copyright (c) 2019 Sitinut Waisara
* magiapp.me | github.com/maxmacstn
*/
int signalPin = D1;
void setup() {
Serial.begin(115200);
pinMode(signalPin,INPUT);
}
void loop() {
if(digitalRead(signalPin) == HIGH){
Serial.println("Doorbell Pressed");
delay(2000);
}
}

view raw
doorBell_test.ino
hosted with ❤ by GitHub

Flash เข้าไปที่ Board ของเราเลย เมื่อเสร็จแล้วลองกดกริ่งดู ถ้าขึ้นคำว่า Doorbell Pressed แสดงว่าได้เชื่อมต่อ hardware ทุกอย่างถูกต้องแล้ว

ต่อไปก็เป็นฝั่ง software ล้วนๆ ผมได้เขียน Code ให้ส่ง Line Notify เรียบร้อยแล้ว โค้ดอยู่ด้านล่างสุดสามารถก๊อปปี้ไปแก้ไขได้เลย เพียงแค่คุณใส่ Token ของ Line Notify (ขอ token ได้ที่นี่) และลง Library ชื่อ TridentTD_LineNotify และ ArduinoHTTPClient ผ่านทาง Library manager ได้เลย  อ้อ แล้วก็อย่าลืมตั้งค่า SSID และ Password ของ WiFi ของคุณด้วย

ถ้าไม่ต้องการใช้กล้อง IP สามารถข้ามขั้นตอนการเซ็ตกล้องด้านล่างได้ครับ

สำหรับกล้อง IP  กล้องบ้านผมเป็นกล้องจีนธรรมดา ที่ใช้แอป P2PWIFICAM ในการดู และสามารถดึงไฟล์ snapshot ที่เป็น jpg ออกมาผ่าน web server ของตัวกล้องได้เลย ผ่านทาง url แบบด้านล่าง

http://192.168.1.XX/snapshot.cgi?user=xxxx&pwd=xxxx

ถ้ากล้องของคุณสามารถดึงไฟล์รูปได้แบบ URL ด้านบน ก็น่าจะใช้ได้  ให้ทำการเปลี่ยน ipCameraEnabled เป็น true และใส่ username, password และ ip กล้องของคุณ

หลังจากนั้นก็ลอง Flash เข้า NodeMCU เปิด Serial Monitor แล้วรอให้ขึ้นว่า  Doorbell Line notify READY  เสร็จแล้วลองกดกริ่งดู ก็จะได้รับการแจ้งเตือนแบบนี้ครับ

IMG_4757

เพียงแค่นี้ก็เสร็จแล้วครับกับ Mini project ทำง่ายๆ เสร็จภายใน 1 วัน  (แต่จริงๆ คือเสร็จเร็วกว่านั้นอีก 5555) ขอบคุณที่รับชมครับ

ทั้งนี้ขอขอบคุณผู้พัฒนา Library TridentTD_LineNotify ด้วยนะครับ สำหรับ Library ดีๆ และใช้งานง่ายมาก

Github repo

Code กดกริ่งแจ้งเตือนไลน์

/*
* Copyright (c) 2019 Sitinut Waisara
* magiapp.me | github.com/maxmacstn
*
* For sending notification + IP Cam snapshot image to Line Notify when Doorbell was pressed.
*
* Hardware : Generic doorbell with active high or you can connect with button + generic Chinese P2P IP Cam
*
*/
#include <TridentTD_LineNotify.h>
#include <FS.h>
#include <ESP8266HTTPClient.h>
//Setup WiFi
#define SSID "YOUR-WIFI-NAME"
#define PASSWORD "YOUR-WIFI-PASSWORD"
//Setup IP Camera (Generic P2P IP Camera)
String IPCAM_IP = "YOUR-IP-CAM-IP-ADDRESS";
String IPCAM_USERNAME = "YOUR-IP-CAM-IP-USERNAME";
String IPCAM_PASSWORD = "YOUR-IP-CAM-IP-PASSWORD";
#define TOKENCOUNT 1 //How many token that you want to send? (Size of array below)
String tokens[TOKENCOUNT] = {"YOUR-LINE-TOKEN"};
int ledPin = D0;
int signalPin = D1;
bool ipCameraEnabled = false; //Use IP Camera or just send the message?
void downloadAndSaveFile(String fileName, String url){
HTTPClient http;
Serial.println("[HTTP] begin…\n");
Serial.println(fileName);
Serial.println(url);
http.begin(url);
Serial.printf("[HTTP] GET…\n", url.c_str());
// start connection and send HTTP header
int httpCode = http.GET();
if(httpCode > 0) {
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTP] GET… code: %d\n", httpCode);
Serial.printf("[FILE] open file for writing %d\n", fileName.c_str());
File file = SPIFFS.open(fileName, "w");
// file found at server
if(httpCode == HTTP_CODE_OK) {
// get lenght of document (is -1 when Server sends no Content-Length header)
int len = http.getSize();
// create buffer for read
uint8_t buff[128] = { 0 };
// get tcp stream
WiFiClient * stream = http.getStreamPtr();
// read all data from server
while(http.connected() && (len > 0 || len == –1)) {
// get available data size
size_t size = stream->available();
if(size) {
// read up to 128 byte
int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));
// write it to Serial
//Serial.write(buff, c);
file.write(buff, c);
if(len > 0) {
len -= c;
}
}
delay(1);
}
Serial.println();
Serial.println("[HTTP] connection closed or file end.\n");
Serial.println("[FILE] closing file\n");
file.close();
}
}
http.end();
}
void sendLineNotify(){
digitalWrite(D0,LOW);
for (int i = 0; i < TOKENCOUNT; i++){
Serial.println("Send message " + i +1);
LINE.setToken(tokens[i]);
LINE.notify("Someone at frontdoor");
}
if(ipCameraEnabled){
downloadAndSaveFile("/snapshot.jpg","http://"+ IPCAM_IP +"/snapshot.cgi?user="+ IPCAM_USERNAME+"&pwd="+ IPCAM_PASSWORD);
//listFiles();
for (int i = 0; i < TOKENCOUNT; i++){
Serial.println("Send image " + i +1);
LINE.setToken(tokens[i]);
LINE.notifyPicture("Camera snapshot", SPIFFS, "/snapshot.jpg");
}
}
digitalWrite(D0,HIGH);
}
//List files in SPIFFS (For debugging)
void listFiles(void) {
Serial.println();
Serial.println("SPIFFS files found:");
Dir dir = SPIFFS.openDir("/"); // Root directory
String line = "=====================================";
Serial.println(line);
Serial.println(" File name Size");
Serial.println(line);
while (dir.next()) {
String fileName = dir.fileName();
Serial.print(fileName);
int spaces = 25 – fileName.length(); // Tabulate nicely
while (spaces–) Serial.print(" ");
File f = dir.openFile("r");
Serial.print(f.size()); Serial.println(" bytes");
}
Serial.println(line);
Serial.println();
delay(1000);
}
void setup() {
Serial.begin(115200);
pinMode(signalPin,INPUT);
pinMode(D0,OUTPUT);
digitalWrite(D0,HIGH);
WiFi.begin(SSID, PASSWORD);
Serial.printf("WiFi connecting to %s\n", SSID);
while(WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(400); }
Serial.printf("\nWiFi connected\nIP : ");
Serial.println(WiFi.localIP());
delay(1000);
if(ipCameraEnabled){
//Initialize File System
if(SPIFFS.begin()){
Serial.println("SPIFFS Initialize….ok");
}else{
Serial.println("SPIFFS Initialization…failed");
}
//Format File System
if(SPIFFS.format()){
Serial.println("File System Formated");
}else{
Serial.println("File System Formatting Error");
}
}
Serial.println("— Doorbell Line notify READY —");
}
void loop() {
if(digitalRead(signalPin) == HIGH){
Serial.println("Doorbell Pressed");
sendLineNotify();
delay(2000);
}
}

33 thoughts on “DIY กริ่งไร้สาย แจ้งเตือนผ่านไลน์พร้อมถ่ายรูป | MaxMac’s One-Day Builds

Add yours

  1. อยากได้แนวทาง คล้ายๆแบบนี้ครับ แต่ใช้เป็น module กล้อง ที่ต่อเข้าที่ esp8266 แล้วให้ module กล้องนั้นถ่ายรูปแล้วส่งรูปเข้าไลน์ครีบ รบกวนขอแนวทางด้วยครีบ

    ถูกใจ

    1. ต้องต่อไฟเลี้ยงผ่าน USB ครับ

      แต่ตัวกริ่งสามารถรับไฟเลี้ยงได้โดยไม่ต้องใส่ถ่านโดยการต่อไฟ 3v จากบอร์ดเข้าไปที่ขั้ว + ของรางถ่าน

      ถูกใจ

  2. กล้องบางตัวมัน snapshot ด้วยลิงค์
    192.168.1.100:54852/snapshot.cgi?user=admin&pwd=12345678
    มันได้ความละเอียดที่ 320×180
    แต่ถ้าใช้ลิงค์
    /192.168.1.100:54852/snapshot.cgi?user=admin&pwd=12345678&res=0
    จะได้ความละเอียดที่ 640×360
    จะใส่ “&res=0” เพิ่มไปหลังโค้ดได้ไหมครับ
    ขอบคุณครับ

    ถูกใจ

      1. อันนี้ผมไม่แน่ใจครับ
        http code 401 คือไม่ได้รับอนุญาต ไม่แน่ใจว่ากล้องอาจจะต้องการให้ส่ง authorisation เพิ่มไปใน header ตอน request ไปขอรูปด้วยรึเปล่า

        ถูกใจ

      1. โปรเจคนี้ผมลองทำตั้งแต่ปีที่แล้ว ยังไม่สำเร็จเลยครับ ติดปัญหาเรื่อง กล้อง ไม่รู้จะใช้กล้องยี่ห้อไหน รุ่นไหน ซื้อกล้องมา 6 ตัวไม่ได้สักที ล่าสุดซื้อ vstacam อีก 2 รุ่น ไม่รู้จะได้อีกไหม ถ้าไม่ได้ก็ ยอมละครับ กับกล้อง 8-9 ตัว

        ถูกใจ

  3. ขอบคุณครับ
    ผมสามารถ กดกริ่ง แจ้งเตือนผ่านไลน์พร้อมถ่ายรูปได้แล้ว
    แต่ถ้าต้องการรับค่าจาก D2 D3 ต้องเพิ่ม code รูปแบบไหนครับ

    ถูกใจ

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  เปลี่ยนแปลง )

Google photo

You are commenting using your Google account. Log Out /  เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out /  เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out /  เปลี่ยนแปลง )

Connecting to %s

Create a website or blog at WordPress.com

Up ↑

%d bloggers like this: