Daftar Isi:
2025 Pengarang: John Day | [email protected]. Terakhir diubah: 2025-01-23 14:49
Sebagai pemain biola, saya selalu menginginkan aplikasi atau alat yang dapat menunjukkan posisi jari saya pada biola dengan sangat tepat. Dengan proyek ini saya mencoba membangun ini. Meskipun ini adalah prototipe dan Anda masih dapat menambahkan banyak fitur.
Saya juga mencoba memisahkan ESP32 dan rPI dan dengan demikian saya membuat ESP32 mengirim data nirkabel ke rPi. Yang mungkin merupakan hal yang paling sulit tentang proyek ini.
Juga sangat penting bahwa pada akhir proyek ini tidak ada yang disimpan di komputer Anda selain di rPI atau ESP32.
Langkah 1: Bahan dan Alat
Sebelum masuk ke spesifikasi membangun proyek ini, kita memerlukan beberapa hal.
- 4x Linear Softpot: Potensiometer Linear untuk mengukur posisi jari (biola memiliki 4 senar)
- ESP32: Modul ESP32 untuk membaca data dari softpot linier.
- a 4/4 biola: biola untuk menempatkan softpot linier di atas.
- a Raspberry Pi dengan kartu SD: raspberry pi yang akan menyimpan database dan situs web kami.
- Potensiometer 10k: potensiometer untuk kecerahan LCD
- Layar LCD: layar LCD untuk ditampilkan ke alamat ip rPi
- Solder Kit: Untuk menyolder semua elemen bersama-sama
- Kabel male-to-male dan kabel male-to-female: Kabel untuk menghubungkan semua elemen
- Kabel Micro USB: Untuk menyalakan ESP32
Langkah 2: Menghubungkan Softpot ke ESP32
Pertama-tama kita perlu menghubungkan softpot kita ke esp32. Kami menghubungkan pin kiri dan kanan ke 5V dan GND masing-masing. Kami menghubungkan pin tengah ke pin analog pada ESP32. Kita juga perlu menghubungkan pin tengah dengan resistansi 10k ohm dan menghubungkannya ke GND. Ini agar output softpot kita tidak mengembalikan nilai acak.
Kemudian kita sambungkan ESP32 dengan kabel micro usb ke pc kita sehingga kita bisa mengupload kode ke dalamnya. Kami akan menggunakan Arduino IDE untuk memprogram ESP32. Tetapi pertama-tama kita perlu menginstal inti Arduino untuk ESP32 sehingga kita dapat mengunggahnya. Ini bisa dilakukan di sini.
Kemudian kita bisa mulai menulis kode.
Pertama kita perlu menetapkan pin yang kita hubungkan dengan pin tengah softpot.
const int SOFT_POT_PIN1 = 34;
const int SOFT_POT_PIN2 = 35;
const int SOFT_POT_PIN3 = 32;
const int SOFT_POT_PIN4 = 33;
onTime lama yang tidak ditandatangani;
softPotTime panjang yang tidak ditandatangani;
Kemudian kita bisa mengatur pin kita. Dan kita perlu memulai monitor serial dan waktu kita.
batalkan pengaturan() {
onTime = milis();
Serial.begin(115200);
Serial.println("Program dimulai");
pinMode(SOFT_POT_PIN1, INPUT);
pinMode(SOFT_POT_PIN2, INPUT);
pinMode(SOFT_POT_PIN3, INPUT);
pinMode(SOFT_POT_PIN4, INPUT); }
void getdata(byte pdata) {
// Baca nilai ADC soft pot
Kemudian kita perlu membaca pin kita sehingga kita dapat menerima data kita.
int softPotADC1 = analogRead(SOFT_POT_PIN1);
nt softPotADC2 = analogRead(SOFT_POT_PIN2);
int softPotADC3 = analogRead(SOFT_POT_PIN3);
int softPotADC4 = analogRead(SOFT_POT_PIN4);
Kemudian kami menempatkan nilai dalam daftar sehingga kami dapat dengan mudah menampilkannya nanti.
untuk (int i=0; i < 4; i++){
int Nama = {softPotADC1, softPotADC2, softPotADC3, softPotADC4};
int softpot = Nama;
if (softpot > 10){
pdata[0] = saya;
pdata[1] = softpot;
pdata[2] = milis();
} } }
}
Langkah 3: Menghubungkan ESP32 dan RPI Secara Nirkabel
Untuk menghubungkan ESP32 dan RPI secara nirkabel, kita akan menggunakan library yang disebut websocket. Untuk menginstal perpustakaan ini, kita bisa mendapatkan file di sini. Kita perlu mengubah beberapa kode dalam file itu sendiri untuk menggunakan perpustakaan ini untuk ESP32.
Kita perlu mengubah MD5.c dan MD5.h.
- MD5Init ke MD5InitXXX
- MD5Update ke MD5UpdateXXX
- MD5Final ke MD5FinalXXX
Kita juga perlu menghapus baris avr/io.h di file sha1.
Kemudian kita dapat menambahkan library ke Arduino IDE kita dengan sketch > include library > add. ZIP library dan kemudian kita dapat memilih library dalam file zip.
Setelah itu kita bisa mulai menulis kode kita.
Pertama untuk ESP32:
Termasuk perpustakaan kami
#sertakan #sertakan
Menetapkan pin kami lagi.
const int SOFT_POT_PIN1 = 34;
const int SOFT_POT_PIN2 = 35;
const int SOFT_POT_PIN3 = 32;
const int SOFT_POT_PIN4 = 33;
Menetapkan server wifi kami
Server WiFiServer (80);
Memulai server websocket kami
WebSocketServer webSocketServer;
Menetapkan SSID dan kata sandi wifi Anda
const char* ssid = "SSID wifi Anda";
const char* kata sandi = "kata sandi wifi Anda";
batalkan pengaturan() {
Menyiapkan monitor serial Anda
Serial.begin(115200);
Menyiapkan softpot Anda
pinMode(SOFT_POT_PIN1, INPUT);
pinMode(SOFT_POT_PIN2, INPUT);
pinMode(SOFT_POT_PIN3, INPUT);
pinMode(SOFT_POT_PIN4, INPUT);
Memulai wifi kami dan menghubungkannya
WiFi.begin(ssid, kata sandi);
sementara (WiFi.status() != WL_CONNECTED) {
penundaan (1000);
Serial.println("Menghubungkan ke Wi-Fi.."); }
Serial.println("Tersambung ke jaringan WiFi");
Serial.println(WiFi.localIP());
server.mulai(); penundaan(100); }
void getdata(char *pdata) {
Membaca data Anda
// Baca nilai ADC soft pot
int softPotADC1 = analogRead(SOFT_POT_PIN1);
int softPotADC2 = analogRead(SOFT_POT_PIN2);
int softPotADC3 = analogRead(SOFT_POT_PIN3);
int softPotADC4 = analogRead(SOFT_POT_PIN4);
Menempatkan data dalam daftar dan mengubahnya menjadi heksadesimal.
sprintf(pdata, "%x, %x, %x, %x, %x", softPotADC1, softPotADC2, softPotADC3, softPotADC4, milis());
}
lingkaran kosong() {
Menghubungkan klien Anda (rPI)
Klien WiFiClient = server.available();
jika (klien.terhubung()) {
penundaan (10);
if (webSocketServer.handshake(klien)) {
Serial.println("Klien terhubung");
Mengirim dan menerima data.
while (client.connected()) {
data karakter[30];
getdata(data);
Serial.println(data);
webSocketServer.sendData(data);
penundaan (10); // Diperlukan penundaan untuk menerima data dengan benar }
Serial.println("Klien terputus");
penundaan(100); }
lain {
Serial.println("sialan");
} } }
Kemudian untuk rPI dengan python:
Mengimpor perpustakaan kami
impor websocket waktu impor
Menetapkan variabel globale i
saya = 0
Mengatur maksimum 200 pesan yang dapat kami terima
nrOfMessages = 200
kelas Websocket():
def _init_(sendiri):
Menginisialisasi soket web kami dan menghubungkannya ke ESP32 kami
self.ws = websocket. WebSocket()
self.ws.connect("ws://172.30.248.48/")
Menerima data kami
pasti bekerja (sendiri):
self.ws.send("nomor pesan: 0")
hasil = self.ws.recv() time.sleep(0.5) mengembalikan hasil
Menutup soket web setelah menerima semuanya
def tutup (sendiri):
diri.ws.close()
Langkah 4: Menghubungkan Situs Web dan Basis Data Anda
Untuk menghubungkan Database dan situs web kami, pertama-tama Anda harus membuat database Anda di pi dengan menginstal mariadb: sudo apt install mariadb.
Kemudian Anda dapat mengaksesnya dengan melakukan: Sudo mariadb.
Kemudian Anda juga perlu membuat situs web Anda. Anda dapat melakukan ini sesuka Anda, tetapi Anda harus menggunakan Flask dan Anda harus memiliki formulir di HTML Anda untuk menghentikan dan memulai data Anda.
Kemudian Anda dapat memasukkan kode ini untuk menghubungkan basis data dan situs web Anda (baik situs web dan basis data Anda harus berada di pi Anda, ini dapat dilakukan dengan menggunakan tab penerapan di pengaturan pycharm)
dari flaskext.mysql impor MySQL
app.config["MYSQL_DATABASE_HOST"] = "localhost"
app.config["MYSQL_DATABASE_DB"] = "nama database Anda"
app.config["MYSQL_DATABASE_USER"] = "pengguna basis data Anda"
app.config["MYSQL_DATABASE_PASSWORD"] = "kata sandi basis data Anda"
Berfungsi untuk mengeluarkan data dari database kita.
def get_data(sql, params=None):
samb = mysql.koneksi()
kursor = penghubung.kursor()
print("mendapatkan data")
mencoba:
cetak (sql)
cursor.execute(sql, params)
kecuali Pengecualian sebagai e:
cetak (e)
kembali Salah
hasil = cursor.fetchall()
data =
untuk baris dalam hasil:
data.tambahkan(daftar(baris))
kursor.tutup()
samb.tutup()
kembalikan data
Fungsi untuk memasukkan data ke dalam database kami
def set_data(sql, params=None):
samb = mysql.koneksi()
kursor = penghubung.kursor()
mencoba:
log.debug(sql)
cursor.execute(sql, params) conn.commit()
log.debug("SQL uitgevoerd")
kecuali Pengecualian sebagai e:
log.exception("Fout bij uitvoeren van sql: {0})".format(e))
kembali Salah
kursor.tutup()
samb.tutup()
kembali Benar
Kami juga perlu memasang aplikasi kami sehingga Anda dapat melakukan hal-hal lain saat Anda merekam.
kelas ThreadedTask(threading. Thread):
def _init_(sendiri,):
Menyiapkan utas
threading. Thread._init_(mandiri)
Membuat daftar untuk menyimpan semua data yang Anda terima
self.data_all =
def run (sendiri):
waktu.tidur(5)
Impor kode python Anda sendiri tempat Anda menerima data
impor receiver_websocket
Terima data Anda
w = accept_websocket. Websocket()
Tambahkan data Anda dalam daftar Anda dan cetak.
untuk saya dalam rentang (0, 200):
self.data_all.append(w.work().split(", "))
cetak(self.data_all)
tugas = ThreadedTask()
Kemudian Anda dapat melakukan task.run() untuk memulai Thread Anda dan mulai menerima data.
Langkah 5: Menghubungkan Semuanya Bersama
Untuk menjalankan situs web Anda dari Pi Anda, Anda harus menggunakan layanan:
[Unit]Deskripsi=instance uWSGI untuk melayani antarmuka web project1
Setelah=jaringan.target
BindsTo=mysqld.service
Setelah = mysqld.service
[Melayani]
Ubah ke pengguna Anda
Pengguna=pi
Grup=www-data
Di sini Anda harus memasukkan direktori file Flask Anda
WorkingDirectory=/home/pi/project1/web
Direktori file ini Anda yang dapat ditemukan nanti.
ExecStart=/usr/bin/uwsgi --ini /home/pi/project1/conf/uwsgi-flask.ini
[Install]
WantedBy=multi-pengguna.target
uwsgi-flask.ini yang perlu Anda tempatkan di direktori yang Anda tentukan di ExecStart di atas
[uwsgi]modul = web:aplikasi virtualenv = /home/pi/project1/env
master = proses sebenarnya = 5
plugin = python3
socket = project1.sock chmod-socket = 660 vakum = true
mati-on-term = benar
Sekarang Anda dapat membaca data Anda dan menampilkannya di situs web Anda.
Langkah 6: Ekstra: Menghubungkan Layar LCD
Kami dapat menghubungkan layar LCD sehingga kami dapat menunjukkan alamat ip Pi kami untuk situs web kami.
impor RPi. GPIO sebagai GPIOimpor waktu
perintah impor
GPIO.pembersihan()
D0 = 22
D1 = 5
D2 = 6
D3 = 13
D4 = 19
D5 = 26
D6 = 20
D7 = 21
daftar = [22, 5, 6, 13, 19, 26, 20, 21]
E = 24
RS = 23
layar kelas:
def _init_(sendiri):
GPIO.setmode(GPIO. BCM)
pengaturan sendiri()
#Fungsi mengatur self.stuur_instructie(0x3f) #Menampilkan self.stuur_instructie(0x0c) #On + kursor self.stuur_instructie(0x01) @staticmethod def setup(): GPIO.setup(list, GPIO. OUT) GPIO.setup([E, RS], GPIO. OUT)
def stuur_instructie(sendiri, byte):
GPIO.output(E, GPIO. HIGH)
GPIO.output(RS, GPIO. LOW)
self.set_GPIO_bits(byte)
waktu.tidur(0.005)
GPIO.output(E, GPIO. LOW)
def stuur_teken(diri sendiri, karakter):
suhu = ord(char)
GPIO.output(E, GPIO. HIGH)
GPIO.output(RS, GPIO. HIGH)
self.set_GPIO_bits(temp)
waktu.tidur(0.005)
GPIO.output(E, GPIO. LOW)
def set_GPIO_bits(sendiri, byte):
untuk saya dalam rentang (0, 8):
if (byte & (2**i)) == 0:
GPIO.output(daftar, GPIO. LOW)
lain:
GPIO.output(daftar, GPIO. HIGH)
def utama():
s = Layar()
teken = "Alamat IP lokal:"
untuk surat dalam teken:
s.stuur_teken(surat)
teken2 = commands.getoutput("ip addr show wlan0 | grep -Po 'inet \K[d.]+'")
cetak(teken2)
s.stuur_instructie(0xc0)
untuk letter2 di teken2:
s.stuur_teken(surat2)
if _name_ == '_main_': #Program dimulai dari sini
mencoba:
utama()
kecuali KeyboardInterrupt:
lulus
Kemudian kita dapat membuat layanan untuk memulai LCD saat start-up.
Direkomendasikan:
Jam Kubus Multifungsi Berbasis Posisi: 5 Langkah (dengan Gambar)
Jam Kubus Multifungsi Berbasis Posisi: Ini adalah jam berbasis Arduino yang menampilkan layar OLED yang berfungsi sebagai jam dengan tanggal, sebagai pengatur waktu tidur siang, dan sebagai lampu malam. Perbedaan "fungsi" dikendalikan oleh akselerometer dan dipilih dengan memutar jam kubus
Sistem Umpan Balik Posisi Servo Dengan Arduino: 4 Langkah
Sistem Umpan Balik Posisi Servo Dengan Arduino: Hai mereka, Ini adalah instruksi pertama saya. Proyek SAYA memungkinkan Anda untuk menerima posisi servo Anda di monitor serial atau plotter serial Arduino IDE Anda. Hal ini memudahkan untuk memprogram robot arduino yang menggunakan motor servo seperti robot humanoid bip
Smart Biola Case: 7 Langkah (dengan Gambar)
Smart Biola Case: Musik adalah bagian penting dalam hidup saya. Saya telah bermain biola selama 10 tahun, tetapi ada 1 masalah. Saya tidak pernah tahu berapa lama saya berlatih. Dalam proyek saya, saya akan melacak suhu, kelembaban, dan waktu latihan. Ini adalah pro yang berdiri sendiri
Mengukur Detak Jantung Anda Ada di Ujung Jari Anda: Pendekatan Photoplethysmography untuk Menentukan Detak Jantung: 7 Langkah
Mengukur Detak Jantung Anda Ada di Ujung Jari Anda: Pendekatan Photoplethysmography untuk Menentukan Denyut Jantung: Photoplethysmograph (PPG) adalah teknik optik sederhana dan murah yang sering digunakan untuk mendeteksi perubahan volume darah di jaringan mikrovaskular. Ini sebagian besar digunakan secara non-invasif untuk melakukan pengukuran di permukaan kulit, biasanya
Kontrol Posisi Sudut 28BYJ-48 Stepper Motor Dengan Arduino & Analog Joystick: 3 Langkah
Kontrol Posisi Sudut Motor Stepper 28BYJ-48 Dengan Arduino & Joystick Analog: Ini adalah skema kontrol untuk motor stepper 28BYJ-48 yang telah saya kembangkan untuk digunakan sebagai bagian dari proyek disertasi tahun terakhir saya. Saya belum pernah melihat ini dilakukan sebelumnya, jadi saya pikir saya akan mengunggah apa yang saya temukan. Semoga ini akan membantu orang lain o