เพิ่มความสามารถของกริ่งไร้สายธรรมดา ให้สามารถแจ้งเตือนได้ผ่าน Line Notify พร้อมกับรูปจากกล้อง IP Cam
สวัสดีครับ ช่วงนี้ก็เข้าหน้าฝนเป็นที่เรียบร้อย น้ำก็เข้ากริ่งบ้านผมเป็นที่เรียบร้อย กดทีคือไฟช๊อตดับทั้งบ้าน ผมก็เลยไปซื้อกริ่งไร้สายมาราคาแค่ 100 บาท ลองกดดูก็ใช้ได้ตามที่มันควรจะเป็น
แล้วผมก็คิดว่า ทำไมกดกริ่งแล้วไม่ให้มันยิงไปที่ Line Notify ด้วยเลยหละ ตามโลโก้ของ Line Notify เลยที่เป็นรูปกริ่ง ความคิดนี้ก็คงจะเข้าท่านะ
เริ่มจากการแกะวงจรกริ่งไร้สายที่เป็นตัวรับออกมาดู วงจรไม่ได้ซับซ้อนอะไรมาก ลองไล่ดูจากปุ่มข้างๆ ที่เอาไว้เปลี่ยนเสียงกริ่ง เชื่อมต่อมาที่ IC ตัวใหญ่ที่ชื่อ SXD059A ผมก็เดาว่า IC ตัวนี้ทำหน้าที่เล่นเสียงแน่ๆ แน่นอนครับ ง่ายๆ ไปหา Datasheet ใน Google ดู….. อืมม ไม่เจอ! เลยทำการ Probe ขา IC ดู การที่มันจะเล่นเสียงได้เวลามีคนกดกริ่ง ต้องมีสัญญาณ Rising edge ไม่ก็ Falling edge เข้ามา trigger มันที่ขา IC สักขาแหละ! แล้วก็เจอตามที่คิดไว้ เมื่อมีคนกดกริ่ง จะมี Logic High (3v) เข้ามาที่ขา IC ตามที่วงไว้ในรูป ซึ่งไฟนั้นก็มาจาก transistor ข้างๆ นั่นแหละ
ทีนี้ก็หวานหมูละ Logic High 3v สามารถให้ ESP8266 เช็คได้เลยผ่านคำสั่งdigitalWrite(PIN)
ไม่รอช้าครับ เชื่อมสายไปที่ขาดังกล่าวแล้วก็ต่อกับ NodeMCU เลย ผมต่อเข้ากับ PIN D1 และต่อ Ground เข้ากับแบ็ตขั้วลบเพื่อให้ครบวงจร
ทีนี้ก็รันโค้ดทดสอบว่าตัวบอร์ดของเราสามารถเช็คว่ามีคนกดกริ่งได้แล้ว จากตัวอย่าง Code ด้านล่าง
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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); | |
} | |
} |
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 เสร็จแล้วลองกดกริ่งดู ก็จะได้รับการแจ้งเตือนแบบนี้ครับ
เพียงแค่นี้ก็เสร็จแล้วครับกับ Mini project ทำง่ายๆ เสร็จภายใน 1 วัน (แต่จริงๆ คือเสร็จเร็วกว่านั้นอีก 5555) ขอบคุณที่รับชมครับ
ทั้งนี้ขอขอบคุณผู้พัฒนา Library TridentTD_LineNotify ด้วยนะครับ สำหรับ Library ดีๆ และใช้งานง่ายมาก
Code กดกริ่งแจ้งเตือนไลน์
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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); | |
} | |
} |
อยากได้แนวทาง คล้ายๆแบบนี้ครับ แต่ใช้เป็น module กล้อง ที่ต่อเข้าที่ esp8266 แล้วให้ module กล้องนั้นถ่ายรูปแล้วส่งรูปเข้าไลน์ครีบ รบกวนขอแนวทางด้วยครีบ
ถูกใจถูกใจ
มีคนทำแล้วครับ แต่ใช้บอร์ด ESP32 เนื่องจาก cpu แรงกว่า
https://www.thaieasyelec.com/article-wiki/embedded-electronics-application/capture-and-send-photo-message-to-line-notify-using-espino32-esp32-and-camera-expansion.html
ถูกใจถูกใจ
ขอบคุณมากๆครับผม
ถูกใจถูกใจ
เพิ่มกล้องเป็น2 ตัวละครับเพิ่มคำสั่งไหนครับ
ถูกใจถูกใจ
เพิ่ม username,password,ip อีกชุดแล้วตอนส่งให้ทำสองรอบโดยใช้ค่าของแต่ละกล้องครับ (เซฟรูปแล้วส่งไปไลน์สองรอบ)
ถูกใจถูกใจ
ขอบคุณครับได้แล้วครับ
ถูกใจถูกใจ
กล้อง VSTACAM จะใช้ concept นี้ ได้ไหมครับ หรือ เจ้าของโพสต์ ใช้ กล้องยี่ห้ออะไรครับ จะได้หามาลองครับผม
ถูกใจถูกใจ
scan ip กล้องได้ครับ แต่เข้าเว็บไม่ได้ครับไม่เห็นภาพ ข้อความส่งไลน์ได้ครับ ขอปรึกษาครับ
ถูกใจถูกใจ
แสดงว่ากล้องไม่รองรับครับ
ถูกใจถูกใจ
กล้องอาจจะไม่รองรับ web interface ครับ
ถูกใจถูกใจ
สอบถาม. ทำไม ไลน์ เด้งเอง ประมาณ 3 ครั้ง ต่อ วัน ครับ. คน กด เด้ง ปกติ ปลใช้ รีเลย์ กับ ออดบ้านปกติ ไฟ220 V
ถูกใจถูกใจ
สัญญาณกดออดที่เข้ามาน่าจะไม่เสถียรครับ ทำให้มันพลาดส่งข้อความไป
ถูกใจถูกใจ
สอบถามครับ ตามในคลิปใช้ไฟเลี้ยงจากตัวเสียงกริ่งเลยหรอครับ หรือต่อไฟเพิ่มเอา
ถูกใจถูกใจ
ต้องต่อไฟเลี้ยงผ่าน USB ครับ
แต่ตัวกริ่งสามารถรับไฟเลี้ยงได้โดยไม่ต้องใส่ถ่านโดยการต่อไฟ 3v จากบอร์ดเข้าไปที่ขั้ว + ของรางถ่าน
ถูกใจถูกใจ
กล้องบางตัวมัน 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” เพิ่มไปหลังโค้ดได้ไหมครับ
ขอบคุณครับ
ถูกใจถูกใจ
น่าจะได้นะครับ แต่อาจจะทำให้ระยะเวลาในการส่งรูปนานขึ้น
ถูกใจถูกใจ
ใส่ได้ไหมครับ &res=0 ส่งรูปได้ แต่รูปมันเล็ก 320×180 ถ้าได้ช่วยแน่ะนำบ้างครับ
ถูกใจถูกใจ
สอบถามครับ ลอง upload code ตัวเทส เเล้วมันขึ้นรัวๆเลยครับ ยังไม่ได้ต่ออุปกรณ์เลย
ถูกใจถูกใจ
int ledPin = D0; คือคำสั่งควบคุมอะไรครับ
ถูกใจถูกใจ
ไม่ได้ใช้ครับ สงสัยผมลืมเอาออก 😅
ถูกใจถูกใจ
ขึ้นแบบนี้ แต่ไม่ส่งรูปครับ
Doorbell Pressed
end message
[HTTP] begin…
/snapshot.jpg
http://192.168.1.106/cgi-bin/snapshot.cgi?loginuse=admin&loginpas=qwertyuiop2020
[HTTP] GET…
[HTTP] GET… code: 401
[FILE] open file for writing 1073675908
end image
ถูกใจถูกใจ
สามารถเอา URL ไปใส่เพื่อดูรูปใน Browser ได้ไหมครับ ถ้าไม่ได้แสดงว่ากล้องไม่รองรับครับ
ถูกใจถูกใจ
ได้ครับได้ปกติ
ถูกใจLiked by 1 person
อันนี้ผมไม่แน่ใจครับ
http code 401 คือไม่ได้รับอนุญาต ไม่แน่ใจว่ากล้องอาจจะต้องการให้ส่ง authorisation เพิ่มไปใน header ตอน request ไปขอรูปด้วยรึเปล่า
ถูกใจถูกใจ
ส่งกล้อง ไปให้ลอง ทดสอบได้ไหมครับ
ถูกใจถูกใจ
ลองเข้าตาม URL เลยครับ ถ้าเข้าแล้วไม่มีหน้าเว็บก็คือใช้ไม่ได้ครับ
ถูกใจถูกใจ
โปรเจคนี้ผมลองทำตั้งแต่ปีที่แล้ว ยังไม่สำเร็จเลยครับ ติดปัญหาเรื่อง กล้อง ไม่รู้จะใช้กล้องยี่ห้อไหน รุ่นไหน ซื้อกล้องมา 6 ตัวไม่ได้สักที ล่าสุดซื้อ vstacam อีก 2 รุ่น ไม่รู้จะได้อีกไหม ถ้าไม่ได้ก็ ยอมละครับ กับกล้อง 8-9 ตัว
ถูกใจถูกใจ
downloadAndSaveFile(“/snapshot.jpg”,”http://192.168.2.xxx:8080/img/snapshot.cgi?size=2?loginuse=admin&loginpas=password&res=0″);
ไม่สามารถส่งภาพได้
ไม่แน่ใจ ติดตรงไนดครับ
ถูกใจถูกใจ
SPIFFS Initialization … failed
File System Formatting Error
ถูกใจถูกใจ
เป็นที่ระบบไฟล์ของตัวบอร์ดอะครับ ไม่แน่ใจว่าตั้งค่า Flash size เป็น 3M SPIFFS รึยังครับ
ถูกใจถูกใจ
ขอบคุณครับ
ผมสามารถ กดกริ่ง แจ้งเตือนผ่านไลน์พร้อมถ่ายรูปได้แล้ว
แต่ถ้าต้องการรับค่าจาก D2 D3 ต้องเพิ่ม code รูปแบบไหนครับ
ถูกใจถูกใจ
ใช้กล้องยี่ห้อและรุ่น ไหนครับ
ถูกใจถูกใจ
อยากได้ซิธีปิด wifi hotspot ESP8266 ครับ
ถูกใจLiked by 1 person