Բովանդակություն:

Ingerութակի վրա մատների դիրքերի չափում ESP32: 6 քայլով
Ingerութակի վրա մատների դիրքերի չափում ESP32: 6 քայլով

Video: Ingerութակի վրա մատների դիրքերի չափում ESP32: 6 քայլով

Video: Ingerութակի վրա մատների դիրքերի չափում ESP32: 6 քայլով
Video: Угрюм-река (1969) (1 серия) фильм 2024, Հուլիսի
Anonim
Ingerութակի վրա մատների դիրքերի չափում ESP32- ով
Ingerութակի վրա մատների դիրքերի չափում ESP32- ով
Ingerութակի վրա մատների դիրքերի չափում ESP32- ով
Ingerութակի վրա մատների դիրքերի չափում ESP32- ով

Որպես ջութակահար, ես միշտ ցանկացել եմ մի ծրագիր կամ գործիք, որը կարող է շատ ճշգրիտ ցույց տալ ինձ մատների դիրքը ջութակի վրա: Այս նախագծով ես փորձեցի կառուցել սա: Չնայած սա նախատիպ է, և դուք դեռ կարող եք ավելացնել բազմաթիվ հնարավորություններ:

Ես նաև փորձեցի տարանջատել ESP32- ը և rPI- ն, և այդպիսով ես ստիպեցի ESP32- ին անլար տվյալներ ուղարկել rPi- ին: Ինչը թերևս ամենադժվարն է այս նախագծում:

Նաև շատ կարևոր է, որ այս ծրագրի վերջում ոչինչ չի պահվում ձեր համակարգչում, բայց այն կա՛մ rPI- ի, կա՛մ ESP32- ի վրա է:

Քայլ 1: Նյութեր և գործիքներ

Նյութեր և գործիքներ
Նյութեր և գործիքներ

Նախքան այս նախագծի կառուցման առանձնահատկություններին անդրադառնալը մեզ պետք է մի քանի բան:

  1. 4x գծային փափուկ կաթսա. Գծային պոտենցիոմետրեր ՝ մատի դիրքը չափելու համար (ջութակն ունի 4 լար)
  2. ESP32. ESP32 մոդուլ `գծային փափուկ կաթսաներից տվյալները կարդալու համար:
  3. 4/4 ջութակ ՝ ջութակ ՝ գծային փափուկ կաթսաները վերևում տեղադրելու համար:
  4. a Raspberry Pi SD քարտով. ազնվամորի pi, որը կպահի մեր տվյալների բազան և կայքը:
  5. 10k պոտենցիոմետր. Պոտենցիոմետր LCD լուսավորության համար
  6. LCD էկրան. LCD էկրան, որը ցույց է տալիս rPi- ի ip հասցեատերերին
  7. Oldոդման հավաքածու. Բոլոր տարրերը միասին զոդելու համար
  8. Արականից արական լարեր և արականից իգական լարեր. Բոլոր տարրերը միացնելու մալուխներ
  9. Միկրո USB մալուխ. ESP32- ը սնուցելու համար

Քայլ 2. Softpots- ը ESP32- ին միացնելը

Softpots- ը ESP32- ին միացնելը
Softpots- ը ESP32- ին միացնելը

Առաջին հերթին մենք պետք է միացնենք մեր փափուկ կաթսաները esp32- ին: Մենք ձախ և աջ կապում ենք համապատասխանաբար 5V և GND- ին: Մենք կապում ենք միջին քորոցը ESP32- ի անալոգային քորոցին: Մենք նաև պետք է միացնենք միջին քորոցը 10k ohm դիմադրությամբ և այն միացնենք GND- ին: Սա այնպես է, որ softpots- ի մեր ելքը պատահական արժեք չվերադարձնի:

Այնուհետև մենք միացնում ենք ESP32- ը միկրո usb մալուխով մեր համակարգչին, որպեսզի կարողանանք դրան վերբեռնել ծածկագիրը: Մենք կօգտագործենք Arduino IDE- ն ESP32- ը ծրագրավորելու համար: Բայց նախ մենք պետք է տեղադրենք Arduino միջուկը 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;

անստորագիր երկար ժամանակ;

անստորագիր երկար softPotTime;

Այնուհետեւ մենք կարող ենք կարգավորել մեր կապում: Եվ մենք պետք է սկսենք մեր սերիական մոնիտորը և մեր ժամանակը:

void setup () {

onTime = millis ();

Serial.begin (115200);

Serial.println («startրագրի սկիզբ»);

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT); }

void getdata (բայթ 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 Անուններ = {softPotADC1, softPotADC2, softPotADC3, softPotADC4};

int softpot = Անուններ ;

if (softpot> 10) {

pdata [0] = i;

pdata [1] = փափուկ կաթսա;

pdata [2] = millis ();

} } }

}

Քայլ 3. ESP32- ի և RPI- ի անլար միացում

ESP32- ը և RPI- ն անլար կապելու համար մենք կօգտագործենք գրադարան, որը կոչվում է websocket: Այս գրադարանը տեղադրելու համար մենք կարող ենք ֆայլերը ստանալ այստեղ: ESP32- ի համար այս գրադարանից օգտվելու համար մենք պետք է փոխենք որոշ ֆայլեր հենց ֆայլերում:

Մենք պետք է փոխենք MD5.c և MD5.h.

  • MD5Init դեպի MD5InitXXX
  • MD5 Թարմացնել MD5 Թարմացնել XXX- ին
  • MD5Final- ից MD5FinalXXX

Մենք նաև պետք է ջնջենք sha1 ֆայլերի avr/io.h տողերը:

Այնուհետև մենք կարող ենք գրադարանը ավելացնել մեր 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 = "ձեր wifi SSID";

const char* գաղտնաբառ = "ձեր wifi գաղտնաբառը";

void setup () {

Կարգավորում եք ձեր սերիական մոնիտորը

Serial.begin (115200);

Կարգավորեք ձեր փափուկ կաթսաները

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT);

Սկսում ենք մեր wifi- ն և միանում դրան

WiFi.begin (ssid, գաղտնաբառ);

while (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 ());

}

դատարկ շրջան () {

Ձեր հաճախորդին միացնելը (rPI)

WiFiClient client = server.available ();

եթե (client.connected ()) {

ուշացում (10);

եթե (webSocketServer.handshake (հաճախորդ)) {

Serial.println («Հաճախորդը միացված է»);

Տվյալների ուղարկում և ընդունում:

while (client.connected ()) {

char տվյալներ [30];

ստացված տվյալներ (տվյալներ);

Serial.println (տվյալներ);

webSocketServer.sendData (տվյալներ);

ուշացում (10); // Տվյալների ճիշտ ստացման համար անհրաժեշտ է ուշացում}

Serial.println («Հաճախորդն անջատված է»);

ուշացում (100); }

ուրիշ {

Serial.println ("shitsfuckedyo");

} } }

Այնուհետև python- ում rPI- ի համար.

Ներմուծելով մեր գրադարանները

ներմուծել ցանցի ներմուծման ժամանակը

Գլոբալ փոփոխական նշանակելը i

i = 0

Սահմանելով առավելագույնը 200 հաղորդագրություն, որը մենք կարող ենք ստանալ

nrOfMessages = 200

դասարան Websocket ():

def _init _ (self):

Նախագծելով մեր վեբ -ցանցը և միացնելով այն մեր ESP32- ին

self.ws = websocket. WebSocket ()

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

Ստանալով մեր տվյալները

def աշխատանք (ինքնուրույն):

self.ws.send ("հաղորդագրություն nr: 0")

արդյունք = self.ws.recv () time.sleep (0.5) վերադարձի արդյունք

Փակել ցանցը ամեն ինչ ստանալուց հետո

def փակել (ինք):

self.ws. փակել ()

Քայլ 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,):

Շարանը կարգավորելը

threading. Թեման._ init _ (ինքնուրույն)

Ստեղծեք ձեր ստացված բոլոր տվյալները պահելու ցուցակ

self.data_all =

def run (self):

ժամանակ. քուն (5)

Ներմուծեք ձեր սեփական Python ծածկագիրը, որտեղ դուք ստանում եք տվյալները

ներմուծեք Receive_websocket

Ստացեք ձեր տվյալները

w = ստանալ_քայլ

Կցեք ձեր տվյալները ձեր ցուցակում և տպեք դրանք:

i- ի համար (0, 200):

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

տպել (self.data_all)

առաջադրանք = ThreadedTask ()

Այնուհետև կարող եք անել task.run () ՝ ձեր թեման սկսելու և տվյալների ստացման համար:

Քայլ 5: Ամեն ինչ միասին միացնելը

Ամեն ինչ միասին միացնելը
Ամեն ինչ միասին միացնելը

Ձեր Pi- ից ձեր կայքը գործարկելու համար դուք պետք է օգտագործեք ծառայություն.

[Միավոր] Նկարագրություն = uWSGI օրինակ `project1 վեբ ինտերֆեյսին ծառայելու համար

Հետո = network.target

BindsTo = mysqld.service

Հետո = mysqld.service

[Ծառայություն]

Փոխեք ձեր օգտվողին

Օգտվող = պի

Խումբ = www-տվյալներ

Այստեղ դուք պետք է մուտքագրեք ձեր Flask ֆայլի գրացուցակը

WorkingDirectory =/home/pi/project1/վեբ

Ձեր ini ֆայլի տեղեկատու, որը կարող եք գտնել ավելի ուշ:

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

[Տեղադրեք]

WantedBy = multi-user.target

uwsgi-flask.ini, որը դուք պետք է տեղադրեք վերը նշված ExecStart- ում նշված գրացուցակում

[uwsgi] մոդուլ = վեբ: app virtualenv =/home/pi/project1/env

վարպետ = ճշմարիտ գործընթացներ = 5

plugins = python3

socket = project1.sock chmod-socket = 660 վակուում = ճշմարիտ

անժամկետ = ճշմարիտ

Այժմ դուք կարող եք կարդալ ձեր տվյալները և ցուցադրել դրանք ձեր կայքում:

Քայլ 6: Լրացուցիչ. LCD էկրան միացնելը

Լրացուցիչ ՝ LCD էկրան միացնելը
Լրացուցիչ ՝ LCD էկրան միացնելը
Լրացուցիչ ՝ LCD էկրան միացնելը
Լրացուցիչ ՝ LCD էկրան միացնելը
Լրացուցիչ ՝ LCD էկրան միացնելը
Լրացուցիչ ՝ LCD էկրան միացնելը

Մենք կարող ենք միացնել LCD էկրան, որպեսզի կարողանանք ցույց տալ մեր Pi- ի IP հասցեն մեր կայքի համար:

ներմուծեք RPi. GPIO- ն որպես GPIOimport ժամանակ

ներմուծման հրամաններ

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]

E = 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.putput (E, GPIO. HIGH)

GPIO.output (RS, GPIO. LOW)

self.set_GPIO_bits (բայթ)

ժամանակ. քուն (0.005)

GPIO.output (E, GPIO. LOW)

def stuur_teken (self, char):

temp = ord (char)

GPIO.putput (E, GPIO. HIGH)

GPIO.putput (RS, GPIO. HIGH)

self.set_GPIO_bits (ջերմաստիճան)

ժամանակ. քուն (0.005)

GPIO.output (E, GPIO. LOW)

def set_GPIO_bits (ինքնակառավարման, բայթ):

i- ի համար (0, 8):

եթե (բայթ & (2 ** i)) == 0:

GPIO.putput (ցուցակ , GPIO. LOW)

այլ:

GPIO.putput (ցուցակ , 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)

տառի համար teken2:

s.stuur_teken (նամակ 2)

if _name_ == '_main_': #startingրագիր սկսած այստեղից

փորձել:

հիմնական ()

բացառությամբ Ստեղնաշարի

անցնել

Այնուհետև մենք կարող ենք ստեղծել ծառայություն ՝ LCD- ը գործարկելուց սկսելու համար:

Խորհուրդ ենք տալիս: