בסדרה זו נחבר את הרספברי פיי לאינטרנט של הדברים כדי לקבל מידע מהתקנים וגם לשלוט בהם.
הוא ישמש כרכזת – HUB ששולטת במכשירים שונים בבית. יש הרבה דרכים לעשות זאת אבל נתחיל מהדרך הפשוטה ביותר ונתקדם הלאה.
האינטרנט של הדברים
על פי ויקיפדיה:
“האינטרנט של הדברים (באנגלית: Internet of Things, או בקיצור IoT, הוא רשת של חפצים פיזיים, או “דברים”, המשובצים באלקטרוניקה, תוכנה וחיישנים המאפשרים תקשורת מתקדמת בין החפצים ויכולות איסוף והחלפת מידע. רשת זו צפויה להוביל לאוטומציה בתחומים רבים. האינטרנט של הדברים כולל בין השאר את תחומי “הבית החכם” ו”העיר החכמה”, ויכול להתייחס למגוון רחב של מכשירים. התקנים כאלה מצויים בשימוש כבר היום, ועל פי נתונים של חברת המחקר “גרטנר”, בסוף שנת 2020 מספר ההתקנים המחוברים בעולם יגיע לכ-26 מיליארד.”
באופן מסורתי, הדברים היחידים שהיו מחוברים לאינטרנט בבית הם המחשב הנייח, הלפטופ והסמארטפון ולאחרונה הצטרפו גם הטלוויזיה, קונסולות משחק וסטרימרים. בבית של העתיד כל החפצים בבית יוכלו להיות מחוברים לאינטרנט דבר שישפר את התפקוד שלהם וגם יוכל ליצור אוטומציה וחסכון בחשמל. לאינטרנט של הדברים יש כבר שימוש נרחב בתעשייה ולוגיסטיקה ומספר המכשירים בעולם המחוברים לאינטרנט כאמור יגיע לעשרות מיליארדים. דבר זה יצור מעין רשת עצבים כלל עולמית שבה חפצים פיזיים מחליפים מידע אחד עם השני ומתפקדים בהתאם.
קבלת נתונים מלוח WIFI
בפוסט הזה ניצור תקשורת פשוטה דו כיוונית בין הרספברי פיי לבין לוח esp8266 שיתקשרו ב WIFI.
ישנה פקודה בלינוקס שנקראת netcat או בקיצור nc. היא נותנת למחשב להקשיב למידע נכנס או לשלוח מידע למחשבים אחרים ברשת המקומית. לדוגמה הפקודה:
nc -l -k 5000
פותחת ברספברי פיי שרת בפורט 5000 ומחכה למידע, l זה קיצור של listen ו- k קיצור של keep.
אחרי שהשרת פתוח ניתן להעביר אליו מידע מלוח esp8266 או כל לוח אחר שמחובר לאינטרנט – סוג המידע שניתן להעביר הוא מחרוזות, מספרים, נתוני חיישנים או האם משהו פתוח או סגור…..
קודם כל נעביר מסר פשוט לרספברי פיי מלוח esp8266:
#include <ESP8266WiFi.h> const char* ssid = "your ssid"; const char* password = "your password"; const char* host = "raspberry pi ip address"; void setup() { WiFi.begin(ssid,password); while (WiFi.status() != WL_CONNECTED) { delay(500); } } void loop() { WiFiClient client; Serial.println("wifi connected"); const int httpPort = 5000; if (client.connect(host, httpPort)){ client.println("hello from esp"); delay(10000); } }
כפי שניתן לראות בדוגמה כל 10 שניות עובר מסר “hello from esp”. עכשיו נשכלל את זה קצת ונעביר קלט מכפתור שיודיע לרספברי פיי האם הכפתור נלחץ או לא :
#include <ESP8266WiFi.h> const char* ssid = "ssid"; const char* password = "pass"; const char* host = "pi ip address"; void setup() { Serial.begin(115200); delay(10); WiFi.begin(ssid,password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("....."); } } void loop() { delay(10); WiFiClient client; Serial.println("wifi connected"); const int httpPort = 5000; if (digitalRead(2) == HIGH){ if (client.connect(host, httpPort)){ delay(10); client.println("button pressed"); delay(300); } } }
אפשר גם להעביר נתונים מחיישנים שונים לרספברי פיי. בדוגמה הבאה הרספברי פיי יקבל נתוני טמפרטורה דרך ה- WIFI וישמור אותם בתוך בקובץ:
nc -l -k 5000 >> data.txt
כעת כל הנתונים שמגיעים נכנסים אוטומטית לתוך קובץ שנקרא data.txt, ואם רוצים אפשר גם להוסיף חותמת זמן לשורה על ידי הפקודה ts:
nc -l -k 5000 | ts >> data.txt
הפקודה לא נמצאת אוטומטית ברספברי פיי וצריך קודם להוריד את חבילת moreutils. כך אמור להראות הקובץ עם נתוני הטמפרטורה:
תקשורת בכיוון ההפוך
כדי להעביר מידע מהרספברי פיי ללוח WIFI אחר אנחנו צריכים להפוך את הלוח לשרת. יש הרבה דוגמאות לאיך להשתמש בארדואינו או ב- esp8266 כשרת אינטרנט.
בקבצי הדוגמאות יש דוגמה שנקראת wifiwebserver ונשתמש בה עם קצת שינויים כדי להדליק ולכבות ממסר.
הדוגמה בסביבת הפיתוח של ארדואינו מבוססת על שימוש בדפדפן להדליק ולכבות את פין 2 אבל אנחנו נשתמש בפקודת netcat כמו שהשתמשנו קודם. אפשר גם למחוק את התגובה שהשרת שולח. זהו הקוד לאחר השפצורים :
#include <ESP8266WiFi.h> const char* ssid = "your-ssid"; const char* password = "your-password"; // Create an instance of the server WiFiServer server(80); void setup() { Serial.begin(115200); delay(10); // prepare GPIO2 pinMode(2, OUTPUT); digitalWrite(2, 0); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // Start the server server.begin(); Serial.println("Server started"); // Print the IP address Serial.println(WiFi.localIP()); } void loop() { // Check if a client has connected WiFiClient client = server.available(); if (!client) { return; } // Wait until the client sends some data Serial.println("new client"); while(!client.available()){ delay(1); } // Read the first line of the request String req = client.readStringUntil('\r'); Serial.println(req); client.flush(); // Match the request if (req.indexOf("1") != -1) digitalWrite(2, HIGH); else if (req.indexOf("0") != -1) digitalWrite(2, LOW); }
השרת מחכה למידע ומשווה אותו ל- 0 או 1 , אם שולחים את המספר 1 הממסר נדלק ואם שולחים 0 הממסר נכבה. עכשיו כדי להפעיל את הממסר נשלח את הפקודה הבאה:
echo “1” | nc 192.168.1.102 80
כדי לכבות את הממסר:
echo “0” | nc 192.168.1.102 80
על ידי הממסר אפשר להדליק ולכבות כל מכשיר חשמלי בבית – מזגן, נורה, מקרר, מכונת קפה, דוד, טלוויזיה ועוד…. אזהרה: לא לגעת במתח גבוה אם אינכם מוסמכים לכך.
פקודות מתוזמנות – אוטומציה
בואו נניח שאנחנו רוצים להדליק את הדוד כל יום ב- 7 בבוקר ולכבות אותו ב- 8 איך אפשר לעשות את זה עם הרספברי פיי?
ישנה פקודה בלינוקס שנקראת crontab שאחראית לפקודות מתוזמנות ובעזרתה אפשר לשלוח פקודות בזמנים שקבענו מראש. כדי להתחיל לתזמן פקודה חדשה נקליד:
crontab -e
יכול להיות שתדרשו לבחור עורך טקסט , בחרו בנאנו. עכשיו נערוך את הקובץ להדליק את הממסר כל יום ב 7 בבוקר ולכבות אותו ב 8. הוסיפו לקובץ את שתי השורות התחתונות:
הסדר של פקודת crontab הוא דקה, שעה, יום, חודש ושבוע. * מסמנת כל הזמן(לדוגמה כל יום). כדי שהפקודות המתוזמנות יעבדו ברספברי פיי צריך לכוון בו את השעה כמובן.
זה הכל לפוסט הזה… בפוסט הבא נשתמש בפייתון ובמסד נתונים כדי לשפר את התפקוד של הרספברי פיי כחלק מהאינטרנט של הדברים.