Mundarija:

ESP32 yordamida skripkada barmoqlarning holatini o'lchash: 6 qadam
ESP32 yordamida skripkada barmoqlarning holatini o'lchash: 6 qadam

Video: ESP32 yordamida skripkada barmoqlarning holatini o'lchash: 6 qadam

Video: ESP32 yordamida skripkada barmoqlarning holatini o'lchash: 6 qadam
Video: Controlling 2 DC Motors using ESP32 and L298N Motor driver 2024, Iyul
Anonim
ESP32 yordamida skripkada barmoqlarning holatini o'lchash
ESP32 yordamida skripkada barmoqlarning holatini o'lchash
ESP32 yordamida skripkada barmoqlarning holatini o'lchash
ESP32 yordamida skripkada barmoqlarning holatini o'lchash

Men skripkachi sifatida har doim skripkada barmoqlarimni aniq ko'rsatadigan ilova yoki asbobni xohlardim. Ushbu loyiha bilan men buni qurishga harakat qildim. Garchi bu prototip va siz hali ham ko'p funktsiyalarni qo'shishingiz mumkin.

Men ESP32 va rPIni ajratishga harakat qildim, shuning uchun ESP32 ma'lumotlarini rPi -ga simsiz yuborishga majbur qildim. Bu, ehtimol, bu loyihadagi eng qiyin narsa.

Loyihaning oxirida kompyuteringizda hech narsa saqlanmasligi juda muhim, lekin u rPI yoki ESP32 -da.

1 -qadam: Materiallar va asboblar

Materiallar va asboblar
Materiallar va asboblar

Loyihaning o'ziga xos xususiyatlariga kirishdan oldin, biz bir nechta narsaga muhtojmiz.

  1. 4x chiziqli Softpot: barmoq holatini o'lchash uchun chiziqli potentsiometrlar (skripka 4 torli)
  2. ESP32: chiziqli yumshoq nuqtalardan ma'lumotlarni o'qish uchun ESP32 moduli.
  3. 4/4 skripka: chiziqli yumshoq nuqtalarni tepaga joylashtirish uchun skripka.
  4. SD -kartali Raspberry Pi: malina pi, u bizning ma'lumotlar bazamiz va veb -saytimizni saqlaydi.
  5. 10k potensiometr: LCD yorqinligi uchun potansiyometr
  6. LCD-displey: rPi-ning IP-manzillarini ko'rsatish uchun LCD displey
  7. Lehim to'plami: Barcha elementlarni almashtirish uchun
  8. Erkak-erkak simlari va erkak-ayol simlari: Barcha elementlarni ulash uchun kabellar
  9. Micro USB kabeli: ESP32 -ni quvvatlantirish uchun

2 -qadam: Softpots -ni ESP32 -ga ulash

Yumshoq nuqtalarni ESP32 -ga ulash
Yumshoq nuqtalarni ESP32 -ga ulash

Birinchidan, biz dasturiy ta'minotni esp32 ga ulashimiz kerak. Biz chap va o'ng pinlarni mos ravishda 5V va GND ga ulaymiz. Biz o'rta pinni ESP32 analog piniga ulaymiz. Shuningdek, biz o'rta pinni 10k ohm qarshilik bilan ulashimiz va uni GND ga ulashimiz kerak. Bu shuni anglatadiki, bizning yumshoq nuqtalarimiz tasodifiy qiymatni qaytarmaydi.

Keyin biz ESP32 -ni mikro usb kabeli bilan kompyuterga ulaymiz, shunda biz unga kod yuklay olamiz. Biz ESP32 dasturlash uchun Arduino IDE dan foydalanamiz. Lekin oldin biz yuklashimiz uchun ESP32 uchun Arduino yadrosini o'rnatishimiz kerak. Buni bu erda qilish mumkin.

Keyin biz kod yozishni boshlashimiz mumkin.

Birinchidan, biz pinlarni belgilashimiz kerak, ular bilan biz yumshoq punktlarning o'rta pinini bog'ladik.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

uzoq vaqt imzolanmagan;

belgisiz uzun softPotTime;

Keyin biz pinlarni o'rnatishimiz mumkin. Va biz ketma -ket monitorni va vaqtimizni boshlashimiz kerak.

bo'sh o'rnatish () {

onTime = millis ();

Serial.begin (115200);

Serial.println ("Dasturning boshlanishi");

pinMod (SOFT_POT_PIN1, INPUT);

pinMod (SOFT_POT_PIN2, INPUT);

pinMod (SOFT_POT_PIN3, INPUT);

pinMod (SOFT_POT_PIN4, INPUT); }

bekor ma'lumotlar (bayt pdata ) {

// Yumshoq idishning ADC qiymatini o'qing

Keyin biz o'z ma'lumotlarimizni olishimiz uchun pinlarimizni o'qishimiz kerak.

int softPotADC1 = analogRead (SOFT_POT_PIN1);

nt softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Keyin biz qiymatlarni ro'yxatga kiritamiz, shunda biz keyinchalik uni osongina chiqarishimiz mumkin.

uchun (int i = 0; i <4; i ++) {

int Ismlar = {softPotADC1, softPotADC2, softPotADC3, softPotADC4};

int softpot = Ismlar ;

agar (softpot> 10) {

pdata [0] = i;

pdata [1] = dasturiy ta'minot;

pdata [2] = millis ();

} } }

}

3 -qadam: ESP32 va RPI -ni simsiz ulash

ESP32 va RPI -ni simsiz ulash uchun biz websocket deb nomlangan kutubxonadan foydalanamiz. Bu kutubxonani o'rnatish uchun biz fayllarni bu erdan olishimiz mumkin. Ushbu kutubxonani ESP32 uchun ishlatish uchun biz fayllarning o'zida ba'zi kodlarni o'zgartirishimiz kerak bo'ladi.

Biz MD5.c va MD5.h -ni o'zgartirishimiz kerak bo'ladi.

  • MD5Initdan MD5InitXXXgacha
  • MD5UpdateXXX ga yangilang
  • MD5Finaldan MD5FinalXXXgacha

Sha1 fayllaridagi avr/io.h qatorlarini ham o'chirishimiz kerak bo'ladi.

Keyin biz kutubxonani Arduino IDE -ga eskiz orqali qo'shishimiz mumkin> kutubxonani qo'shish>. ZIP kutubxonasini qo'shish va keyin biz zip faylidagi kutubxonani tanlashimiz mumkin.

Shundan so'ng biz o'z kodimizni yozishni boshlashimiz mumkin.

ESP32 uchun birinchi:

Kutubxonamiz shu jumladan

#qo'shing #qo'shing

Bizning pinlarimiz yana tayinlanadi.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

Wi -Fi serverimizni tayinlash

WiFiServer serveri (80);

Bizning veb -server serverimiz ishga tushirilmoqda

WebSocketServer veb -SocketServer;

SSID va Wi -Fi tarmog'ining parolini belgilash

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

const char* password = "wifi parolingiz";

bo'sh o'rnatish () {

Seriyali monitorni sozlash

Serial.begin (115200);

Yumshoq nuqtalarni sozlash

pinMod (SOFT_POT_PIN1, INPUT);

pinMod (SOFT_POT_PIN2, INPUT);

pinMod (SOFT_POT_PIN3, INPUT);

pinMod (SOFT_POT_PIN4, INPUT);

Wi -Fi -ni ishga tushiring va unga ulaning

WiFi.begin (ssid, parol);

esa (WiFi.status ()! = WL_CONNECTED) {

kechikish (1000);

Serial.println ("Wi -Fi tarmog'iga ulanmoqda.."); }

Serial.println ("Wi -Fi tarmog'iga ulangan");

Serial.println (WiFi.localIP ());

server.begin (); kechikish (100); }

bo'sh ma'lumotlar (char *pdata) {

Ma'lumotlaringizni o'qish

// Yumshoq idishning ADC qiymatini o'qing

int softPotADC1 = analogRead (SOFT_POT_PIN1);

int softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Ma'lumotlarni ro'yxatga joylashtirish va uni o'n oltilik tizimga o'tkazish.

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

}

void loop () {

Mijozni ulash (rPI)

WiFiClient mijozi = server.available ();

if (client.connected ()) {

kechikish (10);

agar (webSocketServer.handshake (mijoz)) {

Serial.println ("Mijoz ulandi");

Ma'lumotni yuborish va qabul qilish.

while (client.connected ()) {

char ma'lumotlari [30];

getdata (ma'lumotlar);

Serial.println (ma'lumotlar);

webSocketServer.sendData (ma'lumotlar);

kechikish (10); // Ma'lumotni to'g'ri qabul qilish uchun kechikish kerak}

Serial.println ("Mijoz uzildi");

kechikish (100); }

boshqa {

Serial.println ("shitsfuckedyo");

} } }

Keyin pythondagi rPI uchun:

Kutubxonalarimizni import qilish

veb -saytlarni import qilish vaqti

Dunyo miqyosidagi variabelni tayinlash i

i = 0

Biz qabul qila oladigan maksimal 200 ta xabarni sozlash

nrOfMessages = 200

sinf Websocket ():

def _init _ (o'zi):

Veb -soketni ishga tushirish va uni ESP32 -ga ulash

self.ws = websocket. WebSocket ()

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

Ma'lumotlarimizni qabul qilish

def ish (o'z -o'zidan):

self.ws.send ("xabar nr: 0")

natija = self.ws.recv () time.sleep (0.5) qaytish natijasi

Hamma narsani olgandan keyin veb -rozetkani yopish

def close (o'zini):

self.ws.close ()

4 -qadam: veb -sayt va ma'lumotlar bazasini ulash

Ma'lumotlar bazasi va veb -saytni ulashga kelsak, siz birinchi navbatda mariadb: sudo apt install mariadb ni o'rnatish orqali ma'lumotlar bazasini pi -da yaratishingiz kerak bo'ladi.

Keyin unga kirishingiz mumkin: sudo mariadb.

Keyin siz ham o'z veb -saytingizni yaratishingiz kerak bo'ladi. Siz buni xohlaganingizcha qilishingiz mumkin, lekin siz Flask -dan foydalanishingiz kerak va sizning ma'lumotlaringizni to'xtatish va ishga tushirish uchun HTML -da shakl bo'lishi kerak.

Keyin siz ushbu kodni ma'lumotlar bazasi va veb -saytingizni ulash uchun kiritishingiz mumkin (veb -saytingiz ham, ma'lumotlar bazasi ham sizning pi -da bo'lishi kerak, buni pycharm sozlamalarida tarqatish yorlig'i yordamida amalga oshirish mumkin).

flaskext.mysql -dan MySQL -ni import qiling

app.config ["MYSQL_DATABASE_HOST"] = "mahalliy xost"

app.config ["MYSQL_DATABASE_DB"] = "ma'lumotlar bazangiz nomi"

app.config ["MYSQL_DATABASE_USER"] = "ma'lumotlar bazasi foydalanuvchisi"

app.config ["MYSQL_DATABASE_PASSWORD"] = "ma'lumotlar bazasi paroli"

Ma'lumotlar bazamizdan ma'lumotlarni olish funktsiyasi.

def get_data (sql, params = Yo'q):

ulanish = mysql.connect ()

kursor = ulanish. kursor ()

chop etish ("ma'lumotlarni olish")

harakat qilib ko'ring:

bosib chiqarish (sql)

cursor.execute (sql, parametrlar)

istisnolardan tashqari:

chop etish (e)

False qaytarish

natija = cursor.fetchall ()

ma'lumotlar =

natijada qator uchun:

data.append (ro'yxat (qator))

cursor.close ()

Conn.close ()

ma'lumotlarni qaytarish

Ma'lumotlar bazamizga ma'lumotlarni kiritish funktsiyasi

def set_data (sql, params = Yo'q):

ulanish = mysql.connect ()

kursor = ulanish. kursor ()

harakat qilib ko'ring:

log.debug (sql)

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

log.debug ("SQL uitgevoerd")

istisnolardan tashqari:

log.exception ("Favqulodda vaziyatlar: {0})" formati (e))

False qaytarish

cursor.close ()

Conn.close ()

To'g'ri qaytish

Yozuv paytida boshqa ishlarni bajarish uchun biz ham o'z ilovamizni to'ldirishimiz kerak bo'ladi.

sinf ThreadedTask (threading. Thread):

def _init _ (o'zi,):

Ipni sozlash

mavzu._ mavzu _ (o'z -o'zidan)

Qabul qilingan barcha ma'lumotlarni saqlash uchun ro'yxat tuzish

self.data_all =

def run (o'zini):

uyqu (5)

Ma'lumot oladigan o'z python kodingizni import qiling

import_websocket -ni import qilish

Ma'lumotlaringizni qabul qiling

w = qabul qilish_websocket. Websocket ()

Ma'lumotlaringizni ro'yxatga qo'shing va chop eting.

i uchun (0, 200):

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

chop etish (self.data_all)

vazifa = ThreadedTask ()

Keyin thread.ni ishga tushirish va ma'lumotlarni qabul qilishni boshlash uchun task.run () ni bajarishingiz mumkin.

5 -qadam: Hamma narsani bir -biriga ulash

Hamma narsani bir -biriga bog'lash
Hamma narsani bir -biriga bog'lash

Sizning veb -saytingizni Pi -dan boshqarish uchun siz xizmatdan foydalanishingiz kerak:

[Birlik] Tavsif = uWSGI misoli, Project1 veb -interfeysiga xizmat qiladi

= Tarmoqdan keyin maqsad

BindsTo = mysqld.service

Keyin = mysqld.service

[Xizmat]

Foydalanuvchiga o'zgartirish

Foydalanuvchi = pi

Guruh = www-ma'lumotlar

Bu erda siz Flask faylingiz katalogini kiritishingiz kerak

WorkingDirectory =/home/pi/project1/web

Ini faylingiz katalogini keyinroq topishingiz mumkin.

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

[O'rnatish]

WantedBy = multi-user.target

uwsgi-flask.ini-ni yuqorida ExecStart-da ko'rsatilgan katalogga joylashtirishingiz kerak

[uwsgi] modul = veb: ilova virtualenv =/home/pi/project1/env

master = haqiqiy jarayonlar = 5

plaginlar = python3

soket = loyiha 1. paypoq chmod-soket = 660 vakuum = rost

muddati tugashi = rost

Endi siz ma'lumotlarni o'qishingiz va veb -saytingizda ko'rsatishingiz mumkin.

6 -qadam: Qo'shimcha: LCD ekranni ulash

Qo'shimcha: LCD ekranni ulash
Qo'shimcha: LCD ekranni ulash
Qo'shimcha: LCD ekranni ulash
Qo'shimcha: LCD ekranni ulash
Qo'shimcha: LCD ekranni ulash
Qo'shimcha: LCD ekranni ulash

Biz LCD ekranni ulashimiz mumkin, shunda biz veb-saytimiz uchun Pi-ning IP-manzilini ko'rsatamiz.

RPi. GPIO -ni GPIOimport vaqti sifatida import qilish

import buyruqlar

GPIO.cleanup ()

D0 = 22

D1 = 5

D2 = 6

D3 = 13

D4 = 19

D5 = 26

D6 = 20

D7 = 21

ro'yxat = [22, 5, 6, 13, 19, 26, 20, 21]

E = 24

RS = 23

sinf ekrani:

def _init _ (o'zi):

GPIO.setmode (GPIO. BCM)

self.setup ()

#Funktsiya to'plami self.stuur_instructie (0x3f) #Display self.stuur_instructie (0x0c) #On + kursor self.stuur_instructie (0x01) @staticmethod def setup (): GPIO.setup (ro'yxat, GPIO. OUT) GPIO.setup ([E, RS], GPIO. OUT)

def stuur_instructie (o'z -o'zidan, bayt):

GPIO. chiqish (E, GPIO. HIGH)

GPIO.output (RS, GPIO. LOW)

self.set_GPIO_bits (bayt)

vaqt. uxlash (0.005)

GPIO. chiqish (E, GPIO. LOW)

def stuur_teken (o'zini, char):

temp = ord (char)

GPIO. chiqish (E, GPIO. HIGH)

GPIO. chiqish (RS, GPIO. HIGH)

self.set_GPIO_bits (temp)

vaqt. uxlash (0.005)

GPIO. chiqish (E, GPIO. LOW)

def set_GPIO_bits (o'z -o'zidan, bayt):

i uchun (0, 8):

agar (bayt va (2 ** i)) == 0:

GPIO.output (ro'yxat , GPIO. LOW)

boshqa:

GPIO.output (ro'yxat , GPIO. HIGH)

def main ():

s = Ekran ()

teken = "Mahalliy IP -manzil:"

tekendagi xat uchun:

s.stuur_teken (xat)

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

chop etish (teken2)

s.stuur_instructie (0xc0)

teken2 -dagi 2 -harf uchun:

s.stuur_teken (harf 2)

if _name_ == '_main_': #Bu yerdan boshlanadigan dastur

harakat qilib ko'ring:

asosiy ()

KeyboardInterruptdan tashqari:

o'tish

Keyin biz LCDni ishga tushirishda ishga tushirish uchun xizmat yaratishimiz mumkin.

Tavsiya: