Μάθημα 4.1: IoT & ESP32 – Wi-Fi, Bluetooth και Cloud Dashboards
Καλωσορίσατε στην Ενότητα 4 του Arduino Masterclass! Στο project MLA, έπρεπε το ρομπότ μας να στέλνει δεδομένα στο ίντερνετ. Σε αυτό το μάθημα αφήνουμε τη θεωρία στην άκρη και περνάμε κατευθείαν στην πράξη με τον μικροελεγκτή ESP32.
⚠️ Ο Χρυσός Κανόνας του ESP32: Λειτουργεί στα 3.3V (όχι στα 5V του Arduino Uno). Μην συνδέσετε σήμα 5V απευθείας στα pin του, γιατί θα καεί!
Πάμε να γράψουμε κώδικα!
1. Σύνδεση στο Wi-Fi (Ο σωστός τρόπος)
Δεν αρκεί απλά να συνδεθούμε στο Wi-Fi μία φορά στο setup(). Τα ρούτερ κολλάνε και οι συνδέσεις χάνονται. Παρακάτω βλέπουμε πώς γράφουμε κώδικα που ελέγχει συνεχώς αν είμαστε online και, αν πέσει το ίντερνετ, επανασυνδέεται.
#include <WiFi.h> // Βασική βιβλιοθήκη για Wi-Fi στο ESP32
const char* ssid = "YOUR_WIFI_NAME";
const char* password = "YOUR_WIFI_PASSWORD";
// Μεταβλητή για να παρακολουθούμε πότε κάναμε τον τελευταίο έλεγχο
unsigned long previousMillis = 0;
const long interval = 10000; // Έλεγχος κάθε 10 δευτερόλεπτα
void setup() {
Serial.begin(115200); // Προσοχή: Το ESP32 "ακούει" συνήθως στα 115200 baud
connectToWiFi(); // Καλούμε την δική μας συνάρτηση σύνδεσης
}
void loop() {
unsigned long currentMillis = millis();
// Αντί για delay(), ελέγχουμε κάθε 10 δευτερόλεπτα αν έπεσε το Wi-Fi
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Χάθηκε η σύνδεση! Γίνεται προσπάθεια επανασύνδεσης...");
WiFi.disconnect();
connectToWiFi();
} else {
Serial.println("Το Wi-Fi λειτουργεί κανονικά. IP: " + WiFi.localIP().toString());
}
}
// Εδώ μπαίνει ο υπόλοιπος κώδικας του project σας...
}
// Μια ξεχωριστή, "καθαρή" συνάρτηση για τη σύνδεση
void connectToWiFi() {
Serial.print("Σύνδεση στο ");
Serial.println(ssid);
WiFi.begin(ssid, password);
// Όσο δεν είναι συνδεδεμένο, τύπωνε τελείες
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nΕπιτυχής Σύνδεση!");
}
2. Bluetooth: Όταν δεν έχουμε Wi-Fi (Android)
Αν το project σας είναι στο βουνό, το Wi-Fi δεν μας βοηθάει. Μπορούμε όμως να στείλουμε δεδομένα απευθείας στο κινητό μας χρησιμοποιώντας το κλασικό Bluetooth (απαιτεί Android συσκευή και μια εφαρμογή όπως το "Serial Bluetooth Terminal").
Δείτε πόσο μοιάζει με τη χρήση της κλασικής Σειριακής Οθόνης:
#include "BluetoothSerial.h"
// Δημιουργούμε ένα αντικείμενο Bluetooth
BluetoothSerial SerialBT;
int fakeTemperature = 25; // Μια ψεύτικη τιμή αισθητήρα για τη δοκιμή
void setup() {
Serial.begin(115200);
// Το όνομα που θα φαίνεται όταν ψάχνετε για Bluetooth στο κινητό σας
SerialBT.begin("UniqueTech_ESP32");
Serial.println("Το Bluetooth ξεκίνησε! Κάντε σύζευξη (pair) από το κινητό σας.");
}
void loop() {
fakeTemperature++; // Αυξάνουμε την τιμή για να βλέπουμε αλλαγή
// Στέλνουμε τα δεδομένα ΣΤΟ ΚΙΝΗΤΟ μέσω Bluetooth
SerialBT.print("Θερμοκρασία: ");
SerialBT.print(fakeTemperature);
SerialBT.println(" C");
// Διαβάζουμε αν ο χρήστης έστειλε κάτι από το κινητό στο ESP32
if (SerialBT.available()) {
char incomingChar = SerialBT.read();
Serial.print("Λάβαμε από το κινητό: ");
Serial.println(incomingChar);
}
delay(2000); // Στέλνουμε δεδομένα κάθε 2 δευτερόλεπτα
}
3. Cloud Dashboards: Ανεβάζοντας δεδομένα στο Internet
Για να δείτε τα δεδομένα σας σε ένα γράφημα στο ίντερνετ, πλατφόρμες όπως το ThingSpeak είναι ιδανικές. Η διαδικασία είναι απλή: κάνουμε ένα HTTP GET Request σε ένα συγκεκριμένο URL, βάζοντας στο τέλος την τιμή του αισθητήρα μας.
Αυτός ο κώδικας διαβάζει έναν αναλογικό αισθητήρα και τον στέλνει στο Cloud:
#include <WiFi.h>
#include <HTTPClient.h> // Βιβλιοθήκη για να ανοίγουμε ιστοσελίδες (HTTP Requests)
const char* ssid = "YOUR_WIFI_NAME";
const char* password = "YOUR_WIFI_PASSWORD";
// To API Key που σας δίνει το ThingSpeak όταν φτιάχνετε λογαριασμό
String apiKey = "YOUR_THINGSPEAK_API_KEY";
const char* serverName = "[http://api.thingspeak.com/update](http://api.thingspeak.com/update)";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println("\nWi-Fi Connected!");
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
// Διαβάζουμε μια τιμή π.χ. από ένα ποτενσιόμετρο στο Pin 34
int sensorValue = analogRead(34);
// Φτιάχνουμε το τελικό Link: [http://api.thingspeak.com/update?api_key=ΚΛΕΙΔΙ&field1=ΤΙΜΗ](http://api.thingspeak.com/update?api_key=ΚΛΕΙΔΙ&field1=ΤΙΜΗ)
String serverPath = String(serverName) + "?api_key=" + apiKey + "&field1=" + String(sensorValue);
// Ξεκινάμε τη σύνδεση με το URL
http.begin(serverPath.c_str());
// Στέλνουμε το αίτημα (GET)
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
Serial.print("Κωδικός επιτυχίας (200=ΟΚ): ");
Serial.println(httpResponseCode);
} else {
Serial.print("Σφάλμα κατά την αποστολή. Κωδικός: ");
Serial.println(httpResponseCode);
}
http.end(); // Κλείνουμε τη σύνδεση για εξοικονόμηση μνήμης
}
// Το ThingSpeak επιτρέπει νέα δεδομένα δωρεάν κάθε 15 δευτερόλεπτα!
delay(15000);
}
💡 Unique Tech Pro-Tips (Από το εργαστήριο)
Μην βάζετε μεγάλα
delay()στο IoT: Όπως είδατε στο πρώτο παράδειγμα με το Wi-Fi, προτιμάμε τη συνάρτησηmillis(). Τα μεγάλαdelay(10000)"παγώνουν" τον μικροελεγκτή, και αν πέσει το ίντερνετ εκείνη τη στιγμή, το σύστημα δεν θα το καταλάβει εγκαίρως.Το Wi-Fi πεινάει για ρεύμα: Όταν το ESP32 συνδέεται, τραβάει πολύ ρεύμα (spikes). Αν το τροφοδοτείτε από φθηνά καλώδια, η πλακέτα θα κάνει συνεχώς Restart. Χρησιμοποιήστε καλή πηγή τροφοδοσίας!
Είστε πλέον online! Στο επόμενο μάθημα (Μάθημα 4.2), θα χρησιμοποιήσουμε την επεξεργαστική ισχύ του ESP32 για κάτι πρωτοποριακό: Τεχνητή Νοημοσύνη (TinyML).
Μείνετε συντονισμένοι!
Η ομάδα της Unique Tech
Σχόλια
Δημοσίευση σχολίου