Πίνακας περιεχομένων:
- Βήμα 1: Υλικά και εργαλεία
- Βήμα 2: Σύνδεση των Softpots στο ESP32
- Βήμα 3: Ασύρματη σύνδεση του ESP32 και του RPI
- Βήμα 4: Σύνδεση του ιστότοπου και της βάσης δεδομένων σας
- Βήμα 5: Συνδέστε τα πάντα μαζί
- Βήμα 6: Επιπλέον: Σύνδεση οθόνης LCD
Βίντεο: Μέτρηση θέσεων δακτύλων σε βιολί με ESP32: 6 βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:37
Ως βιολί, ήθελα πάντα μια εφαρμογή ή ένα εργαλείο που θα μπορούσε να μου δείξει τη θέση των δακτύλων μου στο βιολί με μεγάλη ακρίβεια. Με αυτό το έργο προσπάθησα να το φτιάξω. Αν και αυτό είναι ένα πρωτότυπο και μπορείτε ακόμα να προσθέσετε πολλές δυνατότητες.
Προσπάθησα επίσης να διαχωρίσω το ESP32 και το rPI και έτσι έκανα το ESP32 να στέλνει δεδομένα ασύρματα στο rPi. Αυτό είναι ίσως το πιο δύσκολο πράγμα σε αυτό το έργο.
Είναι επίσης πολύ σημαντικό στο τέλος αυτού του έργου να μην αποθηκεύεται τίποτα στον υπολογιστή σας αλλά να είναι είτε στο rPI είτε στο ESP32.
Βήμα 1: Υλικά και εργαλεία
Πριν μπούμε στις ιδιαιτερότητες της κατασκευής αυτού του έργου χρειαζόμαστε μερικά πράγματα.
- 4x Linear Softpot: Γραμμικά ποτενσιόμετρα για τη μέτρηση της θέσης ενός δακτύλου (ένα βιολί έχει 4 χορδές)
- ESP32: Μια μονάδα ESP32 για την ανάγνωση των δεδομένων από τα γραμμικά softpots.
- ένα βιολί 4/4: ένα βιολί για να τοποθετήσετε τις γραμμικές μαλακές γλάστρες στην κορυφή.
- ένα Raspberry Pi με κάρτα SD: ένα raspberry pi που θα αποθηκεύσει τη βάση δεδομένων και τον ιστότοπό μας.
- Ποτενσιόμετρο 10k: ένα ποτενσιόμετρο για τη φωτεινότητα της οθόνης LCD
- Οθόνη LCD: μια οθόνη LCD που εμφανίζεται στα ip addres του rPi
- Σετ συγκόλλησης: Για συγκόλληση όλων των στοιχείων από κοινού
- Σύρματα από αρσενικό σε αρσενικό και σύρματα από αρσενικό σε θηλυκό: Καλώδια για τη σύνδεση όλων των στοιχείων
- Καλώδιο Micro USB: Για τροφοδοσία του ESP32
Βήμα 2: Σύνδεση των Softpots στο ESP32
Πρώτα απ 'όλα πρέπει να συνδέσουμε τα softpots μας με το esp32. Συνδέουμε την αριστερή και τη δεξιά ακίδα με το 5V και το GND αντίστοιχα. Συνδέουμε τον μεσαίο πείρο σε έναν αναλογικό πείρο στο ESP32. Πρέπει επίσης να συνδέσουμε το μεσαίο πείρο με αντίσταση 10k ohm και να το συνδέσουμε με το GND. Αυτό συμβαίνει έτσι ώστε η έξοδός μας από τα softpots να μην επιστρέφει τυχαία τιμή.
Στη συνέχεια, συνδέουμε το ESP32 με το καλώδιο micro usb στον υπολογιστή μας, ώστε να μπορούμε να ανεβάσουμε κώδικα σε αυτό. Θα χρησιμοποιήσουμε το Arduino IDE για τον προγραμματισμό του ESP32. Αλλά πρώτα πρέπει να εγκαταστήσουμε τον πυρήνα Arduino για το ESP32, ώστε να μπορούμε να τον ανεβάσουμε. Αυτό μπορεί να γίνει εδώ.
Στη συνέχεια, μπορούμε να αρχίσουμε να γράφουμε κώδικα.
Πρώτα πρέπει να αντιστοιχίσουμε τις καρφίτσες μας στις οποίες συνδέσαμε τη μεσαία καρφίτσα των softpots.
const int SOFT_POT_PIN1 = 34;
const int SOFT_POT_PIN2 = 35;
const int SOFT_POT_PIN3 = 32;
const int SOFT_POT_PIN4 = 33;
ανυπόγραφο για μεγάλο χρονικό διάστημα
ανυπόγραφο μακρύ softPotTime;
Στη συνέχεια, μπορούμε να στήσουμε τις καρφίτσες μας. Και πρέπει να ξεκινήσουμε τη σειριακή μας οθόνη και τον χρόνο μας.
void setup () {
onTime = millis ();
Serial.begin (115200);
Serial.println ("Έναρξη προγράμματος");
pinMode (SOFT_POT_PIN1, INPUT);
pinMode (SOFT_POT_PIN2, INPUT);
pinMode (SOFT_POT_PIN3, INPUT);
pinMode (SOFT_POT_PIN4, INPUT); }
void getdata (byte pdata ) {
// Διαβάστε την τιμή ADC του μαλακού δοχείου
Στη συνέχεια, πρέπει να διαβάσουμε τις καρφίτσες μας, ώστε να μπορούμε να λαμβάνουμε τα δεδομένα μας.
int softPotADC1 = analogRead (SOFT_POT_PIN1);
nt softPotADC2 = analogRead (SOFT_POT_PIN2);
int softPotADC3 = analogRead (SOFT_POT_PIN3);
int softPotADC4 = analogRead (SOFT_POT_PIN4);
Στη συνέχεια, βάζουμε τις τιμές σε μια λίστα, ώστε να μπορούμε εύκολα να την εξάγουμε αργότερα.
για (int i = 0; i <4; i ++) {
int Names = {softPotADC1, softPotADC2, softPotADC3, softPotADC4};
int softpot = Ονόματα ;
αν (softpot> 10) {
pdata [0] = i;
pdata [1] = softpot;
pdata [2] = millis ();
} } }
}
Βήμα 3: Ασύρματη σύνδεση του ESP32 και του RPI
Για ασύρματη σύνδεση των ESP32 και RPI, θα χρησιμοποιήσουμε μια βιβλιοθήκη που ονομάζεται websocket. Για να εγκαταστήσετε αυτήν τη βιβλιοθήκη, μπορούμε να λάβουμε τα αρχεία εδώ. Θα χρειαστεί να αλλάξουμε κάποιο κώδικα στα ίδια τα αρχεία για να χρησιμοποιήσουμε αυτήν τη βιβλιοθήκη για το ESP32.
Θα χρειαστεί να αλλάξουμε τα MD5.c και MD5.h.
- MD5Init σε MD5InitXXX
- MD5Ενημέρωση σε MD5UpdateXXX
- MD5Final έως MD5FinalXXX
Θα χρειαστεί επίσης να διαγράψουμε τις γραμμές avr/io.h στα αρχεία sha1.
Στη συνέχεια, μπορούμε να προσθέσουμε τη βιβλιοθήκη στο Arduino IDE με σκίτσο> συμπεριλάβετε βιβλιοθήκη> προσθέστε βιβλιοθήκη. ZIP και στη συνέχεια μπορούμε να επιλέξουμε τη βιβλιοθήκη σας σε ένα αρχείο zip.
Μετά από αυτό μπορούμε να αρχίσουμε να γράφουμε τον κωδικό μας.
Πρώτα για το ESP32:
Συμπεριλαμβανομένης της βιβλιοθήκης μας
#συμπεριλάβω #συμπεριλάβω
Αναθέτοντας ξανά τις καρφίτσες μας.
const int SOFT_POT_PIN1 = 34;
const int SOFT_POT_PIN2 = 35;
const int SOFT_POT_PIN3 = 32;
const int SOFT_POT_PIN4 = 33;
Εκχώρηση του διακομιστή wifi μας
Διακομιστής WiFiServer (80).
Εκκίνηση του διακομιστή ιστού μας
WebSocketServer webSocketServer;
Εκχώρηση SSID και κωδικού πρόσβασης για το wifi σας
const char* ssid = "το SSID του wifi σας";
const char* password = "ο κωδικός πρόσβασης wifi σας";
void setup () {
Ρύθμιση της σειριακής οθόνης σας
Serial.begin (115200);
Ρύθμιση των softpots σας
pinMode (SOFT_POT_PIN1, INPUT);
pinMode (SOFT_POT_PIN2, INPUT);
pinMode (SOFT_POT_PIN3, INPUT);
pinMode (SOFT_POT_PIN4, INPUT);
Ξεκινάμε το wifi μας και συνδεόμαστε με αυτό
WiFi.begin (ssid, κωδικός πρόσβασης);
ενώ (WiFi.status ()! = WL_CONNECTED) {
καθυστέρηση (1000)?
Serial.println ("Σύνδεση σε WiFi.."); }
Serial.println ("Συνδεδεμένο στο δίκτυο WiFi");
Serial.println (WiFi.localIP ());
server.begin (); καθυστέρηση (100)? }
void getdata (char *pdata) {
Διαβάζοντας τα δεδομένα σας
// Διαβάστε την τιμή ADC του μαλακού δοχείου
int softPotADC1 = analogRead (SOFT_POT_PIN1);
int softPotADC2 = analogRead (SOFT_POT_PIN2);
int softPotADC3 = analogRead (SOFT_POT_PIN3);
int softPotADC4 = analogRead (SOFT_POT_PIN4);
Τοποθέτηση των δεδομένων σε μια λίστα και μετατροπή τους σε δεκαεξαδικό.
sprintf (pdata, " %x, %x, %x, %x, %x", softPotADC1, softPotADC2, softPotADC3, softPotADC4, millis ());
}
void loop () {
Σύνδεση του πελάτη σας (το rPI)
WiFiClient client = server.available ();
if (client.connected ()) {
καθυστέρηση (10)?
if (webSocketServer.handshake (πελάτης)) {
Serial.println ("Ο πελάτης είναι συνδεδεμένος");
Αποστολή και λήψη δεδομένων.
while (client.connected ()) {
δεδομένα καρτών [30];
getdata (δεδομένα)
Serial.println (δεδομένα);
webSocketServer.sendData (δεδομένα);
καθυστέρηση (10)? // Απαιτείται καθυστέρηση για τη σωστή λήψη των δεδομένων}
Serial.println ("Ο πελάτης αποσυνδέθηκε");
καθυστέρηση (100)? }
αλλιώς {
Serial.println ("shitsfuckedyo");
} } }
Στη συνέχεια, για το rPI σε python:
Εισαγωγή των βιβλιοθηκών μας
εισαγωγή websocketimport χρόνο
Εκχώρηση σφαιρικού variabel i
i = 0
Ρύθμιση το πολύ 200 μηνυμάτων που μπορούμε να λάβουμε
nrOfMessages = 200
κλάση Websocket ():
def _init _ (self):
Αρχικοποίηση της ιστοσελίδας μας και σύνδεση με το ESP32
self.ws = websocket. WebSocket ()
self.ws.connect ("ws: //172.30.248.48/")
Λήψη των δεδομένων μας
def work (self):
self.ws.send ("μήνυμα nr: 0")
αποτέλεσμα = self.ws.recv () time.sleep (0,5) αποτέλεσμα επιστροφής
Κλείσιμο του websocket αφού λάβετε τα πάντα
def close (self):
self.ws.close ()
Βήμα 4: Σύνδεση του ιστότοπου και της βάσης δεδομένων σας
Όσον αφορά τη σύνδεση της βάσης δεδομένων και του ιστότοπού μας, θα πρέπει πρώτα απ 'όλα να δημιουργήσετε τη βάση δεδομένων σας στο pi εγκαθιστώντας το mariadb: sudo apt install mariadb.
Στη συνέχεια, μπορείτε να το προσπελάσετε κάνοντας: sudo mariadb.
Στη συνέχεια, θα χρειαστεί επίσης να δημιουργήσετε τον ιστότοπό σας. Μπορείτε να το κάνετε αυτό όπως θέλετε, αλλά πρέπει να χρησιμοποιήσετε το Flask και πρέπει να έχετε μια φόρμα στο HTML σας για να σταματήσετε και να ξεκινήσετε τα δεδομένα σας.
Στη συνέχεια, μπορείτε να εισαγάγετε αυτόν τον κώδικα για να συνδέσετε τη βάση δεδομένων και τον ιστότοπό σας (τόσο ο ιστότοπός σας όσο και η βάση δεδομένων πρέπει να είναι και οι δύο στο pi σας, αυτό μπορεί να γίνει χρησιμοποιώντας την καρτέλα ανάπτυξης στις ρυθμίσεις του pycharm)
από το flaskext.mysql εισαγωγή MySQL
app.config ["MYSQL_DATABASE_HOST"] = "localhost"
app.config ["MYSQL_DATABASE_DB"] = "το όνομα της βάσης δεδομένων σας"
app.config ["MYSQL_DATABASE_USER"] = "ο χρήστης της βάσης δεδομένων σας"
app.config ["MYSQL_DATABASE_PASSWORD"] = "ο κωδικός πρόσβασης της βάσης δεδομένων σας"
Λειτουργία για την εξαγωγή δεδομένων από τη βάση δεδομένων μας.
def get_data (sql, params = Καμία):
conn = mysql.connect ()
δρομέας = conn.cursor ()
εκτύπωση ("λήψη δεδομένων")
προσπαθήστε:
εκτύπωση (sql)
cursor.execute (sql, params)
εκτός από την εξαίρεση ως e:
εκτύπωση (ε)
επιστροφή Λάθος
αποτέλεσμα = cursor.fetchall ()
δεδομένα =
για τη σειρά στο αποτέλεσμα:
data.append (λίστα (σειρά))
cursor.close ()
conn.close ()
επιστροφή δεδομένων
Λειτουργία για την εισαγωγή δεδομένων στη βάση δεδομένων μας
def set_data (sql, params = Καμία):
conn = mysql.connect ()
δρομέας = conn.cursor ()
προσπαθήστε:
log.debug (sql)
cursor.execute (sql, params) conn.commit ()
log.debug ("SQL uitgevoerd")
εκτός από την εξαίρεση ως e:
log.exception ("Fout bij uitvoeren van sql: {0})". μορφή (ε))
επιστροφή Λάθος
cursor.close ()
conn.close ()
επιστροφή True
Θα χρειαστεί επίσης να βάλουμε νήμα στην εφαρμογή μας, ώστε να μπορείτε να κάνετε άλλα πράγματα κατά την εγγραφή.
class ThreadedTask (threading. Thread):
def _init _ (self,):
Ρύθμιση νήματος
νήμα. Νήμα._ init _ (μόνος)
Δημιουργία λίστας για τη διατήρηση όλων των δεδομένων που λάβατε
self.data_all =
def run (self):
ώρα. ύπνος (5)
Εισαγάγετε τον δικό σας κώδικα python όπου λαμβάνετε τα δεδομένα
εισαγωγή Receive_websocket
Λάβετε τα δεδομένα σας
w = Rece_websocket. Websocket ()
Προσθέστε τα δεδομένα σας στη λίστα σας και εκτυπώστε τα.
για i στην περιοχή (0, 200):
self.data_all.append (w.work (). split (","))
εκτύπωση (self.data_all)
task = ThreadedTask ()
Στη συνέχεια, μπορείτε να κάνετε το task.run () για να ξεκινήσετε το νήμα σας και να αρχίσετε να λαμβάνετε δεδομένα.
Βήμα 5: Συνδέστε τα πάντα μαζί
Για να τρέξετε τον ιστότοπό σας από το Pi σας, πρέπει να χρησιμοποιήσετε μια υπηρεσία:
[Μονάδα] Περιγραφή = παράδειγμα uWSGI για την εξυπηρέτηση διεπαφής ιστού project1
Μετά = network.target
BindsTo = mysqld.service
Μετά = mysqld.service
[Υπηρεσία]
Αλλαγή στον χρήστη σας
Χρήστης = pi
Ομάδα = www-δεδομένα
Εδώ πρέπει να εισαγάγετε τον κατάλογο του αρχείου Flask
WorkingDirectory =/home/pi/project1/web
Κατάλογος του αρχείου ini που μπορείτε να βρείτε αργότερα.
ExecStart =/usr/bin/uwsgi --ini /home/pi/project1/conf/uwsgi-flask.ini
[Εγκαθιστώ]
WantedBy = multi-user.target
uwsgi-flask.ini που πρέπει να τοποθετήσετε στον κατάλογο που καθορίσατε στο ExecStart παραπάνω
[uwsgi] module = web: app virtualenv =/home/pi/project1/env
κύρια = πραγματικές διαδικασίες = 5
plugins = python3
πρίζα = project1.sock chmod-socket = 660 vacuum = true
die-on-term = αλήθεια
Τώρα μπορείτε να διαβάσετε τα δεδομένα σας και να τα εμφανίσετε στον ιστότοπό σας.
Βήμα 6: Επιπλέον: Σύνδεση οθόνης LCD
Μπορούμε να συνδέσουμε μια οθόνη LCD έτσι ώστε να μπορούμε να δείξουμε τη διεύθυνση IP του Pi μας για τον ιστότοπό μας.
εισαγωγή RPi. GPIO ως GPIOimport time
εντολές εισαγωγής
GPIO.cleanup ()
D0 = 22
D1 = 5
D2 = 6
D3 = 13
D4 = 19
D5 = 26
D6 = 20
D7 = 21
λίστα = [22, 5, 6, 13, 19, 26, 20, 21]
Ε = 24
RS = 23
οθόνη τάξης:
def _init _ (self):
GPIO.setmode (GPIO. BCM)
self.setup ()
#Function set self.stuur_instructie (0x3f) #Display self.stuur_instructie (0x0c) #On + cursor self.stuur_instructie (0x01) @staticmethod def setup (): GPIO.setup (list, GPIO. OUT) GPIO.setup (, RS], GPIO. OUT)
def stuur_instructie (self, byte):
GPIO.output (E, GPIO. HIGH)
GPIO.output (RS, GPIO. LOW)
self.set_GPIO_bits (byte)
ώρα. ύπνος (0,005)
GPIO.output (E, GPIO. LOW)
def stuur_teken (self, char):
temp = ord (char)
GPIO.output (E, GPIO. HIGH)
GPIO.output (RS, GPIO. HIGH)
self.set_GPIO_bits (θερμοκρασία)
ώρα. ύπνος (0,005)
GPIO.output (E, GPIO. LOW)
def set_GPIO_bits (self, byte):
για i στο εύρος (0, 8):
εάν (byte & (2 ** i)) == 0:
GPIO.output (λίστα , GPIO. LOW)
αλλού:
GPIO.output (λίστα , GPIO. HIGH)
def main ():
s = Οθόνη ()
teken = "Τοπική διεύθυνση IP:"
για επιστολή σε teken:
s.stuur_teken (γράμμα)
teken2 = commands.getoutput ("ip addr show wlan0 | grep -Po 'inet / K [d.]+'")
εκτύπωση (teken2)
s.stuur_instructie (0xc0)
για το γράμμα2 στο teken2:
s.stuur_teken (γράμμα 2)
εάν _name_ == '_main_': #Πρόγραμμα ξεκινώντας από εδώ
προσπαθήστε:
κύριος()
εκτός από το KeyboardIntruptrupt:
πέρασμα
Στη συνέχεια, μπορούμε να δημιουργήσουμε μια υπηρεσία για την εκκίνηση της οθόνης LCD κατά την εκκίνηση.
Συνιστάται:
Μέτρηση ταχύτητας κινητήρα χρησιμοποιώντας Arduino: 6 βήματα
Μέτρηση ταχύτητας κινητήρα χρησιμοποιώντας Arduino: Είναι δύσκολο να μετρηθούν οι στροφές του κινητήρα; Δεν νομίζω. Εδώ είναι μια απλή λύση. Μόνο ένας αισθητήρας IR και το Arduino στο κιτ σας μπορούν να το κάνουν. Σε αυτήν την ανάρτηση θα δώσω ένα απλό σεμινάριο που εξηγεί τον τρόπο μέτρησης των στροφών κάθε κινητήρα χρησιμοποιώντας αισθητήρα IR και A
Μέτρηση της θερμοκρασίας: 7 βήματα
Μέτρηση της θερμοκρασίας: هو قياس درجه الحراره باستخدام الكاميرا االحراريه
4 βήματα για τη μέτρηση της εσωτερικής αντίστασης της μπαταρίας: 4 βήματα
4 βήματα για τη μέτρηση της εσωτερικής αντίστασης της μπαταρίας: Ακολουθούν τα 4 απλά βήματα που μπορούν να σας βοηθήσουν να μετρήσετε την εσωτερική αντίσταση του κτυπήματος
Μέτρηση θερμοκρασίας χρησιμοποιώντας την πλατφόρμα Esp32 και Thingsio.ai: 6 βήματα
Μέτρηση θερμοκρασίας χρησιμοποιώντας την πλατφόρμα Esp32 και Thingsio.ai: Σε αυτό το σεμινάριο θα εξηγήσω σχετικά με τη μέτρηση της θερμοκρασίας στο περιβάλλον χρησιμοποιώντας ενσωματωμένο αισθητήρα θερμοκρασίας που υπάρχει στον πίνακα ανάπτυξης esp32. Το esp32 έχει πολλούς ενσωματωμένους αισθητήρες όπως ο αισθητήρας αίθουσας που χρησιμοποιείται ως αισθητήρας εγγύτητας, αφής
Μέτρηση περιεχομένου υγρασίας εδάφους με χρήση του Esp32 και της πλατφόρμας Thingsio.ai: 6 βήματα
Μέτρηση περιεχομένου υγρασίας εδάφους χρησιμοποιώντας πλατφόρμα Esp32 και Thingsio.ai: Σε αυτό το σεμινάριο θα εξηγήσω σχετικά με την ανάγνωση της περιεκτικότητας σε υγρασία στο έδαφος χρησιμοποιώντας το esp32 και στη συνέχεια την αποστολή των τιμών στην πλατφόρμα clouds thingsio.ai IoT