Turinys:
- 1 žingsnis: grandinės prijungimas
- 2 veiksmas: prieiga prie „Raspberry Pi“
- 3 žingsnis: kodavimo laikas
- 4 žingsnis: surinkite viską kartu
Video: Išmanieji akiniai: 4 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:44
Sveiki visi šiandien, aš jums parodysiu, kaip pasigaminti išmaniuosius akinius namuose! Vienas iš didžiausių išmaniųjų akinių dalykų yra tai, kaip naudinga turėti kažką panašaus į šiuolaikinį technologijų pasaulį ir kaip nėra tik vienos išmaniųjų akinių versijos, nes visi turi nuostabių funkcijų ir begalę programų, kurias būtų galima integruoti ateityje. Šių išmaniųjų akinių savybės apima laiko nurodymą, temperatūros nurodymą kas 5 minutes, tarp tų 5 minučių jis keičiasi tarp tikėtinos aukštos ir žemos temperatūros tą dieną, taip pat nurodo datą. Tačiau jo pagrindinis bruožas yra tas, kad jis fotografuoja kas 10 sekundžių ir tada analizuoja tą paveikslėlį, kad gautų tekstą, kuriame jis pateiks naudingos informacijos apie jį, jei suras klausimą, jis atsakys į jį naudodamas wolframą arba surasdamas matematinę lygtį tai išspręs!
Priedai:
Šiam projektui reikalingos medžiagos bus šios:
1) A Raspberry Pi 0 W (iš vilros.com)
2) Aiškus 128 x 64 OLED ekranas (iš Sparkfun.com)
3) Kameros modulis, suformatuotas „Raspberry Pi 0 W“(iš amazon.com)
4) Bet kokie jūsų pasirinkti akiniai
5) Laidai
6) Lituoklis
7) Lydmetalis be švino (nes nenorite mirti nuo švino)
8) dviejų krypčių klijai
9) SD kortelė, ne mažesnė kaip 8 GB
10) kompiuteris ir interneto ryšys
Darant prielaidą, kad jau turite kompiuterį ir interneto ryšį, šių akinių kaina bus apie 130,00 USD
1 žingsnis: grandinės prijungimas
Norėdami rodyti tekstą ekrane, kurį ketinate prijungti prie OLED per I2C arba SPI, aš renkuosi I2C, nes tai yra patogiau naudoti, bet jei manote, kad norite prisijungti prie jo per SPI, eikite į šią pamoką „Sparkfun“svetainę ir sugrįžkite čia, kai baigsite. https://learn.sparkfun.com/tutorials/transparent-g… Jei pasirinkote I2C, nes aš lituoju laidus, kaip nurodyta toliau:
Pi \/ OLED \/
3.3v 3.3v
GND GND
SDA SDA
SCL SCL
Atminkite, kad skaidrus OLED gali valdyti tik 3.3v.
Baigę prijungti grandinę, įstumkite fotoaparato modulio juostos kabelį į juostelės kabelio laikiklį ant aviečių pi, ištraukdami juodą spaustuką ir stumdami jį atgal, kai juostelės kabelis yra vietoje.
2 veiksmas: prieiga prie „Raspberry Pi“
Naudodami ssh, mes galime pasiekti savo pi su savo kompiuteriu neprijungdami papildomos išorinės klaviatūros pelės ir monitoriaus. Pirmiausia turite prijungti SD kortelę prie kompiuterio naudodami adapterį arba įmontuotą prievadą, tada turėsite pereiti prie šios nuorodos https://www.raspberrypi.org/downloads/raspbian/ ir atsisiųsti „Raspbian buster“su darbalaukiu. Antra, turite įdėti OS į SD kortelę naudodami „BalenaEtcher“, pasirinkite savo SD kortelę ir „Raspbian“OS ir spustelėkite „blykstė“, šis procesas gali užtrukti, todėl grįžkite, kai baigsite. Trečia, eikite į SD kortelę failų naršyklėje arba „Mac“ieškiklyje ir sukurkite tekstinį failą, pavadintą wpa_supplicant, būtinai ištrinkite.txt plėtinį ir pridėkite.conf, įklijuokite failą:
šalis = JAV
ctrl_interface = DIR =/var/run/wpa_supplicant GROUP = netdev update_config = 1 network = {ssid = "WIFI_SSID" scan_ssid = 1 psk = "WIFI_PASSWORD" key_mgmt = WPA-PSK}
Jei nesate JAV, turėsite įvesti savo „WiFi“pavadinimą ir slaptažodį atitinkamose vietose ir šalyje. Atminkite, kad „Raspberry Pi“gali prisijungti tik prie 2,4 GHz tinklo, tai reiškia, kad jūsų kompiuteris taip pat turės prisijungti prie to tinklo. Sukūrę tuščią teksto failą be plėtinio, pavadinto ssh, tada išimkite SD kortelę. Tada turėsite įdiegti „PuTTY“https://www.putty.org/, kurį naudosite ssh įgalinimui. Įdiegę įveskite savo raspberry pi IP adresą, galite sužinoti, kas tai yra, eidami į savo maršrutizatoriaus svetainę, prisijungdami ir žiūrėdami į prijungtus įrenginius.
Kai gausite prieigą prie „Raspberry Pi“, ji paprašys jūsų prisijungti, numatytasis vartotojo vardas yra „pi“, o slaptažodis-„avietė“. Įveskite sudo raspi-config, tada eikite į sąsajos parinktis ir įjunkite fotoaparatą, ssh ir i2c, tada spustelėkite Baigti ir įveskite sudo reboot. Dabar esate pasiruošę prisijungti prie raspberry pi, eikite į priekį ir įdiekite nuotolinį darbalaukį, įveskite savo raspberry pi IP adresą ir dabar galite pereiti prie raspberry pi.
3 žingsnis: kodavimo laikas
Aš nusprendžiau koduoti šią programą „python“, todėl įsitikinkite, kad darbalaukyje įdiegta „python3.7“arba „3.8“. Šis kodas veikia naudojant serverį ir klientą, o serveris yra jūsų kompiuteris. Klientas arba „Raspberry pi“nufotografuos ir nusiųs jį į „dropbox“, kurį nuskaitys serveris, kuris tada paleis vaizdo apdorojimą ir teksto atpažinimą. Kad tai veiktų, turėsite gauti „wolframalpha“, „dropbox“ir „openweathermap“programos ID. Viskas, ką jums reikia padaryti, tai eiti į registraciją svetainėse ir ji suteiks jums programos ID. ir tada įveskite juos į atitinkamas vietas, nustatytas pagal kodo komentarus. Įsitikinkite, kad viską įdiegėte „pip“ir įdiegėte „Tesseract OCR“ir „OpenCV“. Sukurkite „Python“failą, pavadintą „Server.py“savo kompiuteryje, ir failą pavadinimu client.py „Raspberry pi“, tada nukopijuokite ir įklijuokite kodą. Tačiau žinokite, kad kuo drąsesni simboliai ir baltesnis fonas, tuo geresni rezultatai, taip yra su kiekviena teksto atpažinimo programine įranga.
Visos nuorodos, skirtos prisiregistruoti gauti programos ID \/
www.wolframalpha.com/
openweathermap.org/api
www.dropbox.com/developers/documentation
Įsitikinkite, kad įdiegėte „Tesseract OCR“ir „OpenCV“\/
github.com/UB-Mannheim/tesseract/wiki
opencv.org/
Server.py:
importuoti „dropbox“iš PIL importo vaizdo importuoti cv2 importuoti pytesseract iš „pytesseract“importuoti Išvesties importo numpy kaip np importuoti wolframalpha importavimo lizdą
dbx = dropbox. Dropbox ("dropboxAPIkey")
s = socket.socket (lizdas. AF_INET, lizdas. SOCK_STREAM)
app_id = "Programos ID"
priegloba = socket.gethostname ()
uostas = 60567 spausdinti (pagrindinis kompiuteris) s.bind ((pagrindinis kompiuteris, prievadas)) s.listen (2)
nors tiesa:
c, addr = s.accept () print (f'Got connection from: {addr} ') break
nors tiesa:
o tiesa: laikas.sleep (13.7) metaduomenys, f = dbx.files_download ("/dropbox_API/Image.jpg") out = open ("Image.jpg", 'wb') out.write (f.content) out. close () print ("Vaizdas atsisiųstas!") image = cv2.imread ("Image.jpg") Vaizdas = cv2.resize (vaizdas, (640, 480), interpoliacija = cv2. INTER_AREA) image68 = cv2.rotate (Vaizdas, cv2. ROTATE_90_COUNTERCLOCKWISE) pilka = cv2.cvtColor (68 pav., cv2. COLOR_BGR2GRAY)
def remove_noise (pilka):
return cv2.medianBlur (pilka, 5) def slenkstis (pilka): return cv2.threshold (pilka, 0, 255, cv2. THRESH_BINARY + cv2. THRESH_OTSU) [1] def dilate (pilka): branduolys = np.ones ((5, 5), np.uint8) grąžinti cv2.dilate (pilka, branduolys, iteracijos = 1) d = pytesseract.image_to_data (pilka, output_type = Output. DICT)
n_boxes = len (d ['text'])
i diapazone (n_dėžės): jei int (d ['conf'] )> 60: (x, y, w, h) = (d ['kairė'] , d ['viršuje'] , d ['plotis'] , d ['aukštis'] ) pilka = cv2. stačiakampis (pilka, (x, y), (x + w, y + h), (0, 255, 0), 2) pertrauka pytesseract.pytesseract.tesseract_cmd = r "C: / Program Files / Tesseract-OCR / tesseract.exe" text = pytesseract.image_to_string (pilka) spauda (tekstas), o tiesa: text2 = " "if len (text)> = 2: c.send (bytes (text," utf-8 ")) if len (text) = 2: query = text client = wolframalpha. Client (app_id) res = client.query (užklausa) atsakymas = kitas (res.results).text answer1 = answer.partition ('\ n') [0] print (answer1) c.send (bytes (answer1, "utf-8")) if len (text) <= 1: c.send (baitai (tekstas2, „utf-8“)) time.sleep (7.5) pertrauka
Klientas.py:
importuoti dropboximport picameraimportuoti laiką iš luma.core.interface.serial importuoti i2c iš luma.core.render importuoti drobę iš luma.oled.device importuoti ssd1306, ssd1325, ssd1331, sh1106 importuoti lizdą importo datą iš laiko importo miego importuoti pyowm serial = i2c (port = 1, address = 0x3C) device = ssd1306 (serial, rotate = 1) camera = picamera. PiCamera () dropbox_access_token = "" #Jūsų dropbox-id vėl computer_path = r "/home/pi/Image.jpg" dropbox_path = f "/dropbox_API/Image.jpg" s = socket.socket (lizdas. AF_INET, lizdas. SOCK_STREAM) host = ""#PC adreso prievado adresas = 60567 s.connect ((host, port)) msg1 = "" owm = pyowm. OWM ("")#app-id openweathermap num = ["05", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55", "00"] cdt = datetime.datetime.now () min1 = str (cdt.minute) data = str (cdt.day) + "/" + str (cdt. mėnuo) + "/" + str (cdt.year) obs = owm.weather_at_place ("")#jūsų miestas ir šalis eilutės formatu oras = obs.get_weather () temp2 = str (weather.get_temperature ("fahrenheit") ["tau mp_max "]) temp3 = str (weather.get_temperature (" fahrenheit ") [" temp_min "]), o tiesa: cdt = datetime.datetime.now () min1 = str (cdt.minute) hour = str (cdt.hour) su piešiniu: drobė (įrenginys): draw.text ((0, 0), hour, fill = "white") draw.text ((11, 0), ":", fill = "white") draw.text ((15, 0), min1, fill = "white") draw.text ((0, 9), "_", fill = "white") draw.text ((0, 9), data, fill = "balta ") jei min1 skaičius: obs = owm.weather_at_place (" ")#jūsų miestas ir šalis vėl eilutės formatu
oras = obs.get_weather ()
temp = str (weather.get_temperature ("fahrenheit") ["temp"]) draw.text ((32, 0), "F", fill = "white") draw.text ((40, 0), temp, užpildyti = "balta"), jei min1 nėra skaičius: draw.text ((40, 0), temp2, fill = "white") draw.text ((32, 0), "F", fill = "white") camera.start_preview () time.sleep (2) camera.capture ("/home/pi/Image.jpg") camera.stop_preview client = dropbox. Dropbox (dropbox_access_token) print ("[SUCCESS] dropbox account linked") klientas. files_upload (open (computer_path, "rb"). read (), dropbox_path) print ("[UPLOADED] {}". format (computer_path)) full_msg = "" time.sleep (5) msg = s.recv (100) jei len (msg)> = 2: full_msg += msg.decode ("utf-8") print (full_msg) cdt = datetime.datetime.now () min1 = str (cdt.minute) hour = str (cdt.hour)) su piešiniu: drobė (įrenginys): draw.text ((0, 19), full_msg, fill = "white") draw.text ((0, 0), hour, fill = "white") draw.text ((11, 0), ":", fill = "white") draw.text ((15, 0), min1, fill = "white") draw.text ((0, 9), "_", fill = " balta ") draw.text ((0, 9), data, užpildyti = "balta"), jei min1 skaičius: obs = owm.weather_at_place ("")#jūsų miestas ir šalis vėl eilutės formatu
oras = obs.get_weather ()
temp = str (weather.get_temperature ("fahrenheit") ["temp"]) draw.text ((32, 0), "F", fill = "white") draw.text ((40, 0), temp, užpildyti = "balta"), jei min1 nėra skaičius: draw.text ((40, 0), temp3, fill = "white") draw.text ((32, 0), "F", fill = "white") jei len (msg) <= 1: cdt = datetime.datetime.now () min1 = str (cdt.minute) hour = str (cdt.hour) su drobė (prietaisas) kaip draw: draw.text ((0, 0), hour, fill = "white") draw.text ((11, 0), ":", fill = "white") draw.text ((15, 0), min1, fill = "white") piešti. text ((0, 9), "_", fill = "white") draw.text ((0, 9), date, fill = "white"), jei min1 skaičius: obs = owm.weather_at_place ("") #Jūsų miestas ir šalis vėl eilutės formatu
oras = obs.get_weather ()
temp = str (weather.get_temperature ("fahrenheit") ["temp"]) draw.text ((32, 0), "F", fill = "white") draw.text ((40, 0), temp, užpildyti = "balta"), jei min1 nėra skaičius: draw.text ((40, 0), temp3, fill = "white") draw.text ((32, 0), "F", fill = "white") time.sleep (5.4) full_msg1 = "" msg1 = s.recv (100) if len (msg1)> = 2: full_msg1 += msg1.decode ("utf-8") full_msg2 = ("\ n". prisijungti (textwrap.wrap (full_msg1, 9))) cdt = datetime.datetime.now () min1 = str (cdt.minute) valanda = str (cdt.val.) su drobė (įrenginys) kaip piešinys: draw.text ((0, 19), full_msg, fill = "white") draw.text ((0, 29), full_msg2, fill = "white") draw.text ((0, 0), hour, fill = "white") draw.text ((11, 0), ":", fill = "white") draw.text ((15, 0), min1, fill = "white") draw.text ((0, 9), "_", fill = "balta") draw.text ((0, 9), data, fill = "white"), jei min1 yra skaičius: obs = owm.weather_at_place ("")#jūsų miestas ir šalis vėl eilutės formatu
oras = obs.get_weather ()
temp = str (weather.get_temperature ("fahrenheit") ["temp"]) draw.text ((32, 0), "F", fill = "white") draw.text ((40, 0), temp, užpildyti = "balta"), jei min1 nėra skaičius: obs = owm.weather_at_place ("")#jūsų miestas ir šalis vėl eilutės formatu
oras = obs.get_weather ()
temp = str (weather.get_temperature ("fahrenheit") ["temp"]) draw.text ((32, 0), "F", fill = "white") draw.text ((40, 0), temp, užpildyti = "balta"), jei min1 nėra skaičius: draw.text ((40, 0), temp3, fill = "white") draw.text ((32, 0), "F", fill = "white") jei len (msg1) <= 1: cdt = datetime.datetime.now () min1 = str (cdt.minute) hour = str (cdt.hour) su drobė (prietaisas) kaip draw: draw.text ((0, 0), hour, fill = "white") draw.text ((11, 0), ":", fill = "white") draw.text ((15, 0), min1, fill = "white") piešti. text ((0, 9), "_", fill = "white") draw.text ((0, 9), date, fill = "white"), jei min1 skaičius: obs = owm.weather_at_place ("") #Jūsų miestas ir šalis vėl eilutės formatu
oras = obs.get_weather ()
temp = str (weather.get_temperature ("fahrenheit") ["temp"]) draw.text ((32, 0), "F", fill = "white") draw.text ((40, 0), temp, užpildyti = "balta"), jei min1 nėra skaičius: draw.text ((40, 0), temp3, fill = "white") draw.text ((32, 0), "F", fill = "white") time.sleep (7) client.files_delete (dropbox_path) print („Failai ištrinti“)
P. S. Aš esu programuotojas mėgėjas, todėl prašau neabejoti mano siaubingais programavimo metodais.
4 žingsnis: surinkite viską kartu
Kai baigsite visa kita, praktiškai atliksite viską, ką turite padaryti, tai pritvirtinti aviečių pi kamerą ir ekraną prie akinių. Tai galite padaryti naudodami tiekimuose nurodytus dvipusius klijus arba naudodamiesi bet kokiais, jūsų manymu, reikalingais metodais. Jūs taip pat galbūt pastebėjote, kad šioje pamokoje niekur nepaminėjau baterijos, nes aš planuoju būsimus šių akinių atnaujinimus ir nenorėjau jų uždėti. Bet jei norite prijungti vieną, jums reikės ličio po įkroviklio grandinės iš „Amazon“https://www.amazon.com/McIgIcM-Lithium-Charging-Pr…
Jei jums tai patiko ir norite pamatyti daugiau, aš sukūriau „YouTube“kanalą ir, tikiuosi, ten taip pat paskelbsiu pamokas. Štai nuoroda:
www.youtube.com/channel/UCGqcWhHXdZf231rLe…
Dievas gelbsti!
Jono 3:16 „Nes Dievas taip mylėjo pasaulį, kad atidavė savo viengimį Sūnų, kuris taip tiki Jį, nepražus, bet turės amžinąjį gyvenimą“.
Rekomenduojamas:
„Raspberry Pi“išmanieji namai: 5 žingsniai (su nuotraukomis)
„Raspberry Pi“„Smart Home“: jau yra keletas produktų, dėl kurių jūsų butas tampa protingesnis, tačiau dauguma jų yra patentuoti sprendimai. Bet kodėl jums reikia interneto ryšio, kad galėtumėte perjungti šviesą su savo išmaniuoju telefonu? Tai buvo viena iš priežasčių man sukurti savo „Smar“
Išmanieji akiniai (iki 10 USD !!!): 8 žingsniai (su nuotraukomis)
Išmanieji akiniai (iki 10 USD !!!): Sveiki! Mes visi žinome tokius išmaniuosius akinius kaip E.D.I.T.H. sukūrė mūsų mylimas personažas Tony Starkas, kuris vėliau buvo perduotas Peteriui Parkeriui. Šiandien aš pastatysiu vieną tokį išmanųjį stiklą, kurio kaina taip pat yra mažesnė nei 10 USD! Jie ne visai
Išmanieji akiniai: 6 žingsniai
Išmanieji akiniai: Sveiki visi! Šiandien aš ketinu su jumis pasidalinti vaikinais, ko aš jau seniai norėjau DIY Išmanieji akiniai, pagaminti maždaug 25 USD
„Pasidaryk pats“išmanieji akiniai - „Arduino“/ESP: 5 žingsniai
„Pasidaryk pats“išmanieji akiniai - „Arduino“/ESP: naują versiją galite rasti čia: [„YouTube“] Ei, vaikinai! Aš esu čia, norėdamas parodyti jums savo „pasidaryk pats“projektą ir paskatinti tai padaryti pats! Projektas yra tikri išmanieji akiniai, kuriuos kiekvienas gali pasigaminti namuose . Visą kodą galite rasti čia ir šaltiniuose: [GitHub] Aš taip pat
Skystųjų kristalų akiniai ambliopijai (kintamos okliuzijos treniruočių akiniai) [ATtiny13]: 10 žingsnių (su paveikslėliais)
Skystųjų kristalų akiniai nuo ambliopijos (kintamos okliuzijos treniruočių akiniai) [ATtiny13]: Ambliopija (tinginė akis), regėjimo sutrikimas, pasireiškiantis maždaug 3% gyventojų, paprastai gydomas paprastais akiniais arba atropino lašais. Deja, šie gydymo metodai užkemša stipresnę akį ilgą laiką, nepertraukiamai, ne