אזעקה לאוטו עם esp8266

אזעקה לאוטו עם esp8266

אזעקה לאוטו עם esp8266

אם אין לכם ביטוח מקיף לרכב גניבה שלו היא משהו שאמור להדאיג אתכם. בעזרת שני לוחות של esp8266 ניצור מערכת אזעקה לרכב שתיתן לנו לישון בלילה בשקט.

קודם כל וידוי קטן: אחד הרכבים שלי הוא גרוטאה שלא שווה לעשות לו ביטוח מקיף, ולאחר שלפני שבוע ניסו לגנוב לי אותו החלטתי לעשות מעשה. אני אתקין esp8266 עם חיישן תנועה שבמקרה של פריצה ישלח הודעה ל- esp אחר שנמצא אצלי בבית וידליק זמזם.

בחירת הכלי המתאים

כמו בכל פרויקט אחר יש הרבה דרכים להגיע לאותה תוצאה ולפני שמתחילים צריך להחליט באיזה דרך בוחרים. קודם כל עשיתי רשימה של דרישות המערכת בשביל הצרכים שלי:

  • המערכת תופעל רק בקרבת הבית ברדיוס של 200 מטר בערך ורק בשעות הלילה שכן אלו השעות שבהם מתבצעות הפריצות
  • המערכת תהיה “שקטה”, כלומר הפורץ לא יידע שהיא הופעלה אלא רק המשתמש
  • המערכת תשלח סמס או תפעיל זמזם בבקר אחר שנמצא אצלי בבית
  • ההפעלה והכיבוי שלה ייעשו על ידי לחיצה על כפתור בתוך האוטו ולא על ידי שלט או האינטרנט
  • החיישן שאמור להפעיל את האזעקה יהיה חיישן תנועה חיישן קרבה או חיישן מסוג אחר כשהדרישות הם פשטות וצריכת זרם נמוכה

לאחר שעברתי על הדרישות הגעתי למסקנה שהכלי המתאים ביותר שנמצא ברשותי הוא בקר esp8266. אפשרות אחרת היא להשתמש במשדר רדיו אחר או במגן GPRS, אפשר להתחבר לאינטרנט או לשלוח סמס, אבל בשביל הצרכים שלי esp שמפעיל זמזם יכול לעשות את העבודה מצוין.

טווח

האפשרות הראשונה שחשבתי עליה היא שהבקר יתחבר לנתב הביתי שלנו ובמקרה של אזעקה ישלח בקשת HTTP לרספברי פיי ברשת המקומית או למחשב האישי. הצלחתי להפעיל את האפשרות הזו ואפילו לשלוח סמס דרך טוויליו, אבל כדי שהיא תעבוד הנתב הביתי צריך להיות ממש סמוך לחלון הבית כדי שיהיה קשר עין בינו ובין הבקר.

לא היה אכפת לי להעביר את הנתב לחלון אבל זה החליש את האות בינו לבין כל המחשבים האחרים בבית, וגם דרש כבל ארוך בין המודם לנתב. כדי לפתור את הבעיה הזו החלטתי להשתמש בעוד ESP8266 שישב על אדן החלון וישמש בתור נקודת גישה(access point) וכך לא יהיה צורך בכלל בנתב. במקום להתחבר לרשת הביתית שתי הבקרים ידברו ביניהם ללא תלות בנתב ובמקרה של אזעקה יופעל זמזם.

הטווח של esp8266 הוא גדול וכל עוד יש בין שתי הבקרים קשר עין אפשר להגיע לטווח של 200 מטר ואפילו יותר. במקרה שלי האוטו חונה בין 10-150 מטר מהבית והבקרים מתקשרים ביניהם בלי שום בעיה.

WIFI לא אוהב בטון ולכן חשוב לשמור על קשר עין ביניהם, אם אין קשר עין והתדר צריך לעבור בטון זה יכול להקטין את הטווח לאיזור ה50 מטר ואפילו פחות מזה.

blog-esp-range

בתמונה אפשר לראות את האוטו הכחול שנמצא לפחות 100 מטר מהבקר שנמצא בבית.

חיבורים

לפני שנעשה הלחמות וחיבורים קבועים נבנה אבטיפוס ונבדוק אותו לפחות במשך שבוע לראות שהוא עובד לפי התכנון.

טוב, אז יש לנו שתי בקרים של esp – אחד משמש כלוח של אזעקה עם חיישן תנועה , כפתור להפעלה וכיבוי וגם נורת לד לחיווי.

 

 

 

fritzing-esp-alarm

הלוח בשרטוט למעלה קצת שונה מהלוחות שאני משתמש בהם אבל העקרון הוא אותו דבר, צריך לשים לב למספור הפינים ולשנות אותו בתוכנה בהתאם לכך.

  • הנורה מתחברת לפין 16 – המספור בלוח הוא פין 0
  • הכפתור מתחבר לפין 5 – המספור בלוח הוא פין 1
  • החיישן מתחבר לפין 4 – המספור בלוח הוא פין 2

blog-esp-alarm-protoype

 

שימו לב שמספור הפינים שרשום על הלוח שונה מהפינים שאנחנו משתמשים בהם בתוכנה. תזכורת למספור הפינים:

 

node-mcu-pins

 

חיישן התנועה (PIR) יכול לעבוד על 5V או 3V. ברירת המחדל שלו היא לקבל 5V ולהוריד את המתח ל 3V על ידי מייצב.

בגלל שאנחנו רוצים להפעיל אותו ישירות עם 3V נצטרך לעקוף את המייצב ע”י הסרה שלו או ע”י הלחמת חוט בריבוע H:

 

blog-pir-motion-sensor-3

 

החיבורים של ה esp השני שנמצא בבית הם פשוטים, רק חיבור פין 4 לזמזם וחיבור לאפס:

 

blog-esp-ap

מקורות כח

יש כמה דרכים לספק לבקר כח:

  • מתח קבוע מהבטריה של האוטו לאחר שהורדנו אותו ל 5V. הבעיה היא שמתניעים את האוטו יש התפרצויות זרם שמסכנות את הבקר, וגם לאחר מכן אנחנו מחוברים לאלטרנטור כך שזה לא מומלץ. אם מישהו עשה זאת בהצלחה הוא מוזמן לדווח
  • בטריה רגילה או נטענת של 3V-3.7V שמתחברת לחיבור 3V של הבקר
  • powerbank נטען עם חיבור USB שנותן 5V ומתחבר ליציאת USB של הבקר. זאת הדרך שבחרתי בה בגלל הפשטות שלה ובגלל העובדה שהבקר יעבוד רק בשעות הלילה וייטען במהלך היום.

power-bank-smart-phone

יש כמה דברים שרצוי לא לעשות:

  • לא לחבר לפין 3V בלוח יותר מ 3.7V!!!
  • לא לחבר לפינים של הלוגיקה(gpio) יותר מ3.3V

קוד התוכנה

ה ESP8266 יכול לעבוד בכמה קונפיגורציות:

  • בתור תחנה(station) – מה שאומר שהוא עובד כמו סמארטפון או לפטופ שמתחבר לנתב הביתי ומקבל ממנו כתובת IP. בקונפיגורציה זו הוא יכול לשמש כלקוח, שרת, או לקוח + שרת
  • בתור נקודת גישה(access point) – זאת אומרת שהוא יהיה כמו נתב ושם הרשת שלו יופיע בטווח השידור שלו. כל מחשב ,לפטופ או מכשיר WIFI אחר יוכל להתחבר אליו על ידי הקלדת שם רשת וססמה

בפרויקט הזה הלוח שנמצא בבית מתפקד כנקודת גישה, והלוח שנמצא באוטו כתחנה… במקרה של אזעקה הלוח שנמצא באוטו מתחבר ללוח השני והלוח השני מפעיל זמזם. בארכיטקטורה זו אין בכלל חיבור לנתב הביתי ושתי הלוחות מתפקדים כמשדר ומקלט רדיו עצמאיים.

הקוד של לוח האזעקה הוא די מסובך ודורש כמה הסברים אבל קודם כל זוהי הלוגיקה הכללית:

  • כשהלוח מחובר לכח הוא מחכה ללחיצה על הכפתור
  • אם לחצנו על הכפתור הנורה תהבהב פעמיים ומצב הכפתור ישתנה למצב ההופכי.
  • אם מצב הכפתור הוא “אמת” הלוח ייכנס להשהייה של 30 שניות שתיתן לנו זמן לצאת מהאוטו.
  • בסוף ההשהייה הנורה תכבה כדי לחסוך בבטריה ומצב “אזעקה מוכנה” יהפוך לאמת
  • עכשיו צריכים להתקיים שתי תנאים שבהם האזעקה מוכנה והחיישן מגלה תנועה. כל פעם שהוא מגלה תנועה הוא סופר את הגילויים(בפועל בכל גילוי הספירה עולה בערך ב 4) ואם הוא עובר את סף 20 תנועות הוא מתחבר ללוח השני
  • הלוח השני פשוט מתוכנת להפעיל את הזמזם כשהוא מקבל בקשה. ברירת המחדל שממנה הוא משרת בקשות היא 192.168.4.1
  • בלוח האזעקה שתי המצבים הופכים לשקר והכל חוזר להתחלה ומתאפס
  • בזמן שהאזעקה דרוכה לחיצה על הכפתור תנטרל אותה במידה והרף לא עלה מעל 20

קוד של לוח האזעקה:

#include <ESP8266WiFi.h>
 const char* ssid = "espalarm"; // access point name
 const char* password = "hackme"; // password of esp access point
 const char* host = "192.168.4.1"; // default ip to serve content
 boolean button_state = false; // global variable of button state 
 boolean alarm_ready = false; // global variable of alarm_ready
 int count = 0; // counter of motion sensor
 void setup() { 
  //Serial.begin(115200);
  pinMode(4, INPUT); // motion sensor input pin
  pinMode(5, INPUT); // button input pin
  pinMode(16, OUTPUT); // led pin
  delay(10);
 }

void loop() {
  if (digitalRead(5) == HIGH){ // if button pressed
  button_state = !button_state; // toggle button_state
  delay(300); // debounce button with delay
  //Serial.println("button pressed state changed");
  digitalWrite(16, HIGH); // blink twice
  delay(500);
  digitalWrite(16, LOW);
  delay(500);
  digitalWrite(16, HIGH);
  delay(500);
  digitalWrite(16, LOW);
  delay(500);
  }
  if (!alarm_ready && button_state){ // check if button_state is on , do it only if alarm is not yet ready 
  //Serial.println("if state is on turn on led and wait 30 seconds");
  digitalWrite(16, HIGH); // turn led on
  delay(30000); // delay 30 seconds
  digitalWrite(16, LOW); // turn led off
  alarm_ready = true; // now alarm is ready 
  //Serial.println("alarm_ready true");
  }
  else if(!button_state){ // if button is pressed again turn alarm_ready off
  alarm_ready = false;
  count = 0; // reset counter
  // Serial.println("alarm_ready false");

 }
  if (alarm_ready && digitalRead(4) == HIGH ){ // if alarm_ready check for motion in the car
  count+=1; // add to counter
  // Serial.println(count);

 if (count > 20){ // if counter is bigger than threshold
  //Serial.println("alarm_ready and sensor detected - connect to esp");
  WiFi.begin(ssid,password);
  while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  }
  WiFiClient client;
  const int httpPort = 80;

 if (client.connect(host, httpPort)){
  delay(10);
  if(client.print(String("GET ") + "/" +" HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n") ){
  delay(10);
  //Serial.println("detected");
  button_state = false;
  alarm_ready = false;
  count = 0;
  }
  } 
  }
  }
  delay(1000);
 }

השארתי בכוונה את התקשורת הסיריאלית כי הקוד דורש הרבה שפצורים.

 

הקוד של נקודת גישה:

/* Create a WiFi access point and provide a web server on it. */

#include <ESP8266WiFi.h>
 #include <WiFiClient.h> 
 #include <ESP8266WebServer.h>

/* Set these to your desired credentials. */
 const char *ssid = "espalarm";
 const char *password = "hackme";

ESP8266WebServer server(80);

/* Just a little test message. Go to http://192.168.4.1 in a web browser
  * connected to this access point to see it.
  */
 void handleRoot() { // this is the function when a client is conncted
  server.send(200, "text/html", "<h1>You are connected</h1>"); // message for the browser
  digitalWrite(4, HIGH); // turn on buzzer
  delay(60000); // wait 60 seconds
  digitalWrite(4, LOW);
  delay(20000);
  digitalWrite(4, HIGH); // turn on buzzer again for a minute
  delay(60000);
  digitalWrite(4, LOW);
 }

void setup() {
  delay(1000);
  pinMode(4, OUTPUT);
  Serial.begin(115200);
  Serial.println();
  Serial.print("Configuring access point...");
  /* You can remove the password parameter if you want the AP to be open. */
  WiFi.softAP(ssid, password);

IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.on("/", handleRoot);
  server.begin();
  Serial.println("HTTP server started");
 }

void loop() {
  server.handleClient();
 }

הנה קישור לקוד המלא

התקנת הלוח באוטו

הלוח אבטיפוס עם המטריצה יותקן בצורה לא קבועה באוטו וייבדק במשך שבוע כדי לשפר את התפקוד שלו. הוא יופעל גם על ידי בטריה נטענת Li-ion של 3.7V וגם על ידי powerbank שמספק 5V כדי לבדוק מה עובד יותר טוב. לאחר שבוע המעגל יולחם, הלוח והחיישן יוחבאו בתוך האוטו ושתי הלוחות יותקנו בצורה קבועה כדי למנוע גניבה של האוטו.

blog-esp-car-prototype

עוד דברים שייבדקו הם טווח הבקר, משך חיי הסוללה וסובלנות של הבקר לתנאי חום.

לאחר שבוע של עבודה

אז אחרי שבוע של עבודה האזעקה עובדת כמו שצריך. הבטריה  powerbank היא של 2500mAh ומחזיקה 40 שעות ללא טעינה, זאת אומרת שאפשר להטעין אותה פעם ביומיים בערך. זמן טעינה הוא בערך שעתיים.

blog-esp8266-preforated

כשהלוח נמצא חבוי בתוך האוטו הטווח שלו יורד ומגיע בערך ל 100 מטר מהבית אבל זה תלוי גם בתנאים אחרים.

סך הכל זוהי לא אזעקה מקצועית אבל היא עושה עבודה טובה בשביל המחיר.

blog-alarm-esp8266-car

תגובה אחת על הפוסט “אזעקה לאוטו עם esp8266

  1. rotemlFem אומר:

    עברתי על האתר שלך וראיתי מספר בעיות.
    עקב המצב אשמח לעזור לך לייצר כמות גדולה של לקוחות ומכירות באונליין.

    אשמח לתת לך אינפורמציה נוספת בטלפון

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *