Mündəricat:

ESP32 ilə skripkada barmaq mövqelərinin ölçülməsi: 6 addım
ESP32 ilə skripkada barmaq mövqelərinin ölçülməsi: 6 addım

Video: ESP32 ilə skripkada barmaq mövqelərinin ölçülməsi: 6 addım

Video: ESP32 ilə skripkada barmaq mövqelərinin ölçülməsi: 6 addım
Video: Управляем адресными светодиодами на ESP32, прошивка WLED, применение в Home Assistant 2024, Iyul
Anonim
ESP32 ilə skripkada barmaq mövqelərinin ölçülməsi
ESP32 ilə skripkada barmaq mövqelərinin ölçülməsi
ESP32 ilə skripkada barmaq mövqelərinin ölçülməsi
ESP32 ilə skripkada barmaq mövqelərinin ölçülməsi

Bir skripka ifaçısı olaraq həmişə barmaqlarımın skripka üzərindəki mövqeyini çox dəqiq göstərə biləcək bir tətbiq və ya alət istəyirdim. Bu layihə ilə bunu qurmağa çalışdım. Bu bir prototip olsa da hələ də bir çox xüsusiyyət əlavə edə bilərsiniz.

ESP32 və rPI -ni ayırmağa çalışdım və ESP32 -nin məlumatları rPi -yə simsiz göndərməsini təmin etdim. Yəqin ki, bu layihənin ən çətin tərəfi budur.

Bu layihənin sonunda kompüterinizdə heç bir şeyin saxlanmaması çox vacibdir, ancaq ya rPI -də, ya da ESP32 -dədir.

Addım 1: Materiallar və Alətlər

Alətlər və materiallar
Alətlər və materiallar

Bu layihənin qurulmasının xüsusiyyətlərinə girməzdən əvvəl bir neçə şeyə ehtiyacımız var.

  1. 4x Linear Softpot: Bir barmağın vəziyyətini ölçmək üçün xətti potensiometrlər (skripkada 4 tel var)
  2. ESP32: Xətti proqram nöqtələrindən məlumatları oxumaq üçün bir ESP32 modulu.
  3. 4/4 skripka: xətti softpotları üstə yerləşdirmək üçün bir skripka.
  4. SD kartlı bir Raspberry Pi: verilənlər bazamızı və veb saytımızı saxlayacaq bir moruq pi.
  5. 10k potensiometr: LCD parlaqlığı üçün potensiometr
  6. LCD ekran: rPi-nin ip adreslərinə göstərmək üçün bir LCD ekran
  7. Lehim dəsti: Bütün elementləri bir -birinə bağlamaq üçün
  8. Kişidən kişiyə tel və kişidən dişi tel: Bütün elementləri birləşdirən kabellər
  9. Mikro USB kabeli: ESP32 -ni işə salmaq üçün

Addım 2: Softpotları ESP32 -yə bağlayın

Yumşaq nöqtələri ESP32 -yə bağlamaq
Yumşaq nöqtələri ESP32 -yə bağlamaq

İlk növbədə softpotlarımızı esp32 -yə bağlamalıyıq. Sol və sağ sancaqları sırasıyla 5V və GND -yə bağlayırıq. Orta pimi ESP32 -dəki analoq pinə bağlayırıq. Orta pimi 10k ohm müqavimətlə bağlamalı və bunu GND -yə bağlamalıyıq. Bu, yumşaq nöqtələrdən çıxdığımız məhsulun təsadüfi dəyər verməməsidir.

Sonra ESP32 -ni mikro usb kabeli ilə kompüterimizə bağlayırıq ki, ona kod yükləyə bilək. ESP32 proqramlaşdırmaq üçün Arduino IDE -dən istifadə edəcəyik. Ancaq əvvəlcə yükləyə biləcəyimiz üçün ESP32 üçün Arduino nüvəsini quraşdırmalıyıq. Bunu burada etmək olar.

Sonra kod yazmağa başlaya bilərik.

Əvvəlcə yumşaq nöqtələrin orta pinini bağladığımız pinlərimizi təyin etməliyik.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

uzun müddət imzasız;

imzasız uzun softPotTime;

Sonra sancaqlar qura bilərik. Və serial monitorumuza və vaxtımıza başlamalıyıq.

boş quraşdırma () {

onTime = millis ();

Serial.begin (115200);

Serial.println ("Proqramın başlanğıcı");

pinMode (SOFT_POT_PIN1, GİRİŞ);

pinMode (SOFT_POT_PIN2, GİRİŞ);

pinMode (SOFT_POT_PIN3, GİRİŞ);

pinMode (SOFT_POT_PIN4, GİRİŞ); }

etibarsız getdata (bayt pdata ) {

// Yumşaq qazanın ADC dəyərini oxuyun

Sonra məlumatlarımızı ala bilmək üçün pinlərimizi oxumalıyıq.

int softPotADC1 = analogRead (SOFT_POT_PIN1);

nt softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Sonra dəyərləri bir siyahıya qoyduq ki, sonra asanlıqla çıxara bilək.

üçün (int i = 0; i <4; i ++) {

int Adları = {softPotADC1, softPotADC2, softPotADC3, softPotADC4};

int softpot = Adlar ;

əgər (softpot> 10) {

pdata [0] = i;

pdata [1] = softpot;

pdata [2] = milis ();

} } }

}

Addım 3: ESP32 və RPI -ni Kabelsiz Bağlamaq

ESP32 və RPI -ni simsiz birləşdirmək üçün websocket adlı kitabxanadan istifadə edəcəyik. Bu kitabxananı qurmaq üçün faylları buradan əldə edə bilərik. Bu kitabxananı ESP32 üçün istifadə etmək üçün sənədlərin özündə bəzi kodu dəyişdirməliyik.

MD5.c və MD5.h -ni dəyişdirməliyik.

  • MD5Init -dən MD5InitXXX -ə
  • MD5UpdateXXX -ə yeniləyin
  • MD5Final üçün MD5FinalXXX

Sha1 sənədlərindəki avr/io.h sətirlərini də silməli olacağıq.

Sonra kitabxananı eskizlə Arduino IDE -ə əlavə edə bilərik> kitabxanaya daxil et. ZIP kitabxana əlavə et və sonra kitabxananı zip faylı ilə seçə bilərik.

Bundan sonra kod yazmağa başlaya bilərik.

İlk olaraq ESP32 üçün:

Kitabxanamız da daxil olmaqla

#daxil edin #daxil edin

Yenidən pinlərimizi təyin edirik.

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 serverimizi təyin edirik

WiFiServer serveri (80);

Websocket serverimizi işə salırıq

WebSocketServer vebSocketServer;

SSID və wifi şifrənizi təyin edirik

const char* ssid = "Wi -Fi SSID";

const char* password = "wifi parolunuz";

boş quraşdırma () {

Serial monitorunuzun qurulması

Serial.begin (115200);

Yumşaq nöqtələrinizin qurulması

pinMode (SOFT_POT_PIN1, GİRİŞ);

pinMode (SOFT_POT_PIN2, GİRİŞ);

pinMode (SOFT_POT_PIN3, GİRİŞ);

pinMode (SOFT_POT_PIN4, GİRİŞ);

WiFi -ni işə salırıq və ona qoşuluruq

WiFi.begin (ssid, parol);

isə (WiFi.status ()! = WL_CONNECTED) {

gecikmə (1000);

Serial.println ("WiFi -yə qoşulur.."); }

Serial.println ("WiFi şəbəkəsinə qoşuldu");

Serial.println (WiFi.localIP ());

server.begin (); gecikmə (100); }

etibarsız getdata (char *pdata) {

Məlumatlarınız oxunur

// Yumşaq qazanın ADC dəyərini oxuyun

int softPotADC1 = analogRead (SOFT_POT_PIN1);

int softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Məlumatların siyahıya salınması və onaltılığa çevrilməsi.

sprintf (pdata, " %x, %x, %x, %x, %x", softPotADC1, softPotADC2, softPotADC3, softPotADC4, millis ());

}

boşluq döngəsi () {

Müştəri ilə əlaqə (rPI)

WiFiClient müştəri = server.available ();

if (client.connected ()) {

gecikmə (10);

əgər (webSocketServer.handshake (müştəri)) {

Serial.println ("Müştəri bağlı");

Məlumatların göndərilməsi və alınması.

while (client.connected ()) {

char məlumatları [30];

getdata (məlumatlar);

Serial.println (məlumatlar);

webSocketServer.sendData (məlumatlar);

gecikmə (10); // Verilənlərin düzgün qəbulu üçün gecikmə lazımdır}

Serial.println ("Müştəri əlaqəsi kəsildi");

gecikmə (100); }

başqa {

Serial.println ("shitsfuckedyo");

} } }

Sonra pythondakı rPI üçün:

Kitabxanalarımızı idxal edirik

webocketimport vaxtını idxal edin

Qlobal bir variabel təyin etmək i

i = 0

Qəbul edə biləcəyimiz maksimum 200 mesaj təyin edirik

nrOfMessages = 200

sinif Websocket ():

def _init _ (özünü):

Veb yuvamızın işə salınması və ESP32 -ə qoşulması

self.ws = websocket. WebSocket ()

self.ws.connect ("ws: //172.30.248.48/")

Verilərimizin alınması

def iş (özünü):

self.ws.send ("mesaj nömrəsi: 0")

nəticə = self.ws.recv () vaxt.yuxu (0.5) nəticə

Hər şeyi aldıqdan sonra veb saytın bağlanması

def yaxın (özünü):

self.ws.close ()

Addım 4: Veb saytınızı və verilənlər bazanızı birləşdirin

Verilənlər bazamızı və veb saytımızı birləşdirməyə gəlincə, ilk növbədə mariadb: sudo apt install mariadb yükləyərək verilənlər bazanızı pi üzərində yaratmalısınız.

Sonra bunu edə bilərsiniz: sudo mariadb.

Sonra veb saytınızı da yaratmalı olacaqsınız. Bunu istədiyiniz kimi edə bilərsiniz, ancaq Flask istifadə etməlisiniz və məlumatlarınızı dayandırmaq və işə salmaq üçün HTML -də bir forma sahib olmalısınız.

Sonra bu kodu verilənlər bazanıza və veb saytınıza bağlamaq üçün daxil edə bilərsiniz (həm veb saytınız, həm də verilənlər bazanız pi -də olmalıdır, bunu pycharm ayarlarında yerləşdirmə nişanı istifadə etməklə etmək olar).

flaskext.mysql -dən MySQL idxal edin

app.config ["MYSQL_DATABASE_HOST"] = "localhost"

app.config ["MYSQL_DATABASE_DB"] = "verilənlər bazanızın adı"

app.config ["MYSQL_DATABASE_USER"] = "verilənlər bazası istifadəçiniz"

app.config ["MYSQL_DATABASE_PASSWORD"] = "verilənlər bazası parolunuz"

Verilənlər bazamızdan məlumat çıxarmaq funksiyası.

def get_data (sql, params = Yox):

conn = mysql.connect ()

imleç = əlaqə.kursor ()

çap ("məlumat əldə etmək")

cəhd edin:

çap (sql)

cursor.execute (sql, params)

istisna istisna olmaqla e:

çap (e)

False qayıt

nəticə = cursor.fetchall ()

məlumat =

nəticə sırası üçün:

data.append (siyahı (satır))

cursor.close ()

bağla yaxın ()

məlumatları qaytarın

Verilənlər bazamıza məlumat daxil etmək funksiyası

def set_data (sql, params = Yox):

conn = mysql.connect ()

imleç = əlaqə.kursor ()

cəhd edin:

log.debug (sql)

cursor.execute (sql, params) conn.commit ()

log.debug ("SQL uitgevoerd")

istisna istisna olmaqla e:

log.exception ("Sql: {0})" formatında (e))

False qayıt

cursor.close ()

bağla yaxın ()

Doğru qayıt

Qeydə alarkən başqa şeylər edə biləcəyiniz üçün tətbiqimizi də işlətməliyik.

sinif ThreadedTask (threading. Thread):

def _init _ (özünü,):

Mövzu qurmaq

mövzu._ mövzu _ (özünü)

Alınan bütün məlumatları saxlamaq üçün bir siyahı yaratmaq

self.data_all =

def run (özünü):

vaxt.yuxu (5)

Verilənləri aldığınız öz python kodunuzu idxal edin

receive_websocket idxal edin

Məlumatlarınızı alın

w = qəbul_websocket. Websocket ()

Məlumatlarınızı siyahınıza əlavə edin və çap edin.

i aralığında (0, 200):

self.data_all.append (w.work (). split (","))

çap et (self.data_all)

tapşırıq = ThreadedTask ()

Sonra Threadinizi işə salmaq və məlumat almağa başlamaq üçün task.run () edə bilərsiniz.

Addım 5: Hər şeyi bir -birinə bağlayın

Hər şeyi Bir -birinə Bağlamaq
Hər şeyi Bir -birinə Bağlamaq

Veb saytınızı Pi -dən idarə etmək üçün bir xidmətdən istifadə etməlisiniz:

[Vahid] Təsvir = uWSGI nümunəsi, Project1 veb interfeysinə xidmət edir

Sonra = şəbəkə hədəfi

BindsTo = mysqld.service

Sonra = mysqld.service

[Xidmət]

İstifadəçinizə dəyişdirin

İstifadəçi = pi

Qrup = www-məlumat

Burada Flask faylınızın kataloqunu daxil etməlisiniz

WorkingDirectory =/home/pi/project1/web

İni faylınızın kataloqunu daha sonra tapa bilərsiniz.

ExecStart =/usr/bin/uwsgi --ini /home/pi/project1/conf/uwsgi-flask.ini

[Yüklemek]

WantedBy = multi-user.target

yuxarıda ExecStart-da göstərdiyiniz qovluğa yerləşdirməyiniz lazım olan uwsgi-flask.ini

[uwsgi] module = web: app virtualenv =/home/pi/project1/env

usta = doğru proseslər = 5

plugins = python3

soket = layihə 1. çorabın chmod-socket = 660 vakuum = doğru

vaxtında ölmək = doğru

İndi məlumatlarınızı oxuya və veb saytınızda göstərə bilərsiniz.

Addım 6: Əlavə: LCD Ekranı birləşdirmək

Əlavə: LCD Ekranı birləşdirir
Əlavə: LCD Ekranı birləşdirir
Əlavə: LCD Ekranı birləşdirir
Əlavə: LCD Ekranı birləşdirir
Əlavə: LCD Ekranı birləşdirir
Əlavə: LCD Ekranı birləşdirir

Saytımız üçün Pi-nin IP ünvanını göstərə bilmək üçün bir LCD ekranı bağlaya bilərik.

GPIOimport zamanı olaraq RPi. GPIO idxal edin

idxal əmrləri

GPIO.cleanup ()

D0 = 22

D1 = 5

D2 = 6

D3 = 13

D4 = 19

D5 = 26

D6 = 20

D7 = 21

siyahı = [22, 5, 6, 13, 19, 26, 20, 21]

E = 24

RS = 23

sinif ekranı:

def _init _ (özünü):

GPIO.setmode (GPIO. BCM)

self.setup ()

#Function set self.stuur_instructie (0x3f) #Display 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 (özünü, bayt):

GPIO.çıxış (E, GPIO. HIGH)

GPIO.çıxış (RS, GPIO. LOW)

self.set_GPIO_bits (bayt)

vaxt.yuxu (0.005)

GPIO.çıxış (E, GPIO. LOW)

def stuur_teken (özünü, xarakter):

temp = ord (char)

GPIO.çıxış (E, GPIO. HIGH)

GPIO.çıxış (RS, GPIO. HIGH)

self.set_GPIO_bits (temp)

vaxt.yuxu (0.005)

GPIO.çıxış (E, GPIO. LOW)

def set_GPIO_bits (öz, bayt):

i üçündür (0, 8):

əgər (bayt & (2 ** i)) == 0:

GPIO.output (siyahı , GPIO. LOW)

başqa:

GPIO.output (siyahı , GPIO. HIGH)

def main ():

s = Ekran ()

teken = "Yerli IP ünvanı:"

məktub üçün teken:

s.stuur_teken (məktub)

teken2 = commands.getoutput ("ip addr show wlan0 | grep -Po 'inet / K [d.]+'")

çap (teken2)

s.stuur_instructie (0xc0)

teken2 -də məktub 2 üçün:

s.stuur_teken (məktub2)

if _name_ == '_main_':: #Proqram buradan başlayır

cəhd edin:

əsas ()

KeyboardInterrupt istisna olmaqla:

keçmək

Sonra LCD-ni işə salmaq üçün bir xidmət yarada bilərik.

Tövsiyə: