這篇文章來源于DevicePlus.com英語網站的翻譯稿。
目錄
1. 簡介
2. 大致規格
3. ESP32 硬件概述
4. 將固件加載到 ESP32
5. 運行!!
6. 選擇您自己的集線器:主機即為Heart.local所在的位置
7. 構建Wi-Fi 開關
1 簡介
物聯網技術已經深入到了大眾生活中。宇宙大爆炸帶來了世間所有存在的事物,但是以智能方式將它們連接起來,使其在發生相互關聯的同時發揮出作用,是最近才取得的進展。幾次雷擊后,細胞在地球海洋的原始泥漿中做到了這一點,氨基酸為第一個細胞的形成構成了物質基礎。然后就開始與其他萬物合作共贏了嗎?不,完全不是。細胞缺乏更高的智慧,它們只想在無盡的變異迭代中延續自己的生命。就這樣,逐漸進化成了人類,才有了現在正在閱讀有關物聯網文章的您。
物聯網的發展一定是以一個明確的目標開展的,并且在設計時會考慮未來產品的迭代。當然,您沒有辦法永生,只能提出一個想法,然后也許用幾個月的時間來設計出原型。接下來,就是PCB設計了。這樣說也許您會感到喜悅:每一個人都為物聯網的發展作出了貢獻,就像黎明前一個細胞加入了另一個細胞那樣,總有一天會迎來人工智能的全面開花,而人工智能也許會在未來選擇消滅人類,也可能不會。人工智能是基于二進制計算的。那么我們繼續!
在本文中,您將會學習如何使用MicroPython和ESP32來制作一個可用于物聯網項目的Wi-Fi開關。
2 大致規格
我需要一個本地物聯網Wi-Fi開關,用于兩個230V交流負載,每個負載高達500-600W。該開關需要易于更改(在代碼中),需要可以安裝在家里的任何地方,并且在硬件方面,可以快速進行修改和擴展。這意味著我必須使用MicroPython,以及一個ESP32開發板!它的引腳可以提供約10mA的電流,并且只需要串聯一個330歐姆的電阻器就可以對其進行保護。所有的輸出電壓都為3.3V,對于現如今的MOSFET來說很完美,甚至可以驅動更高電壓的負載。只要您確保使用邏輯電平MOSFET。WiFi傳輸速度約為150Mbit/s(18.75MByte/s),并且使用Loboris的ESP32固件(可在此處獲取)可以節省更多時間,因為它已經包含了用于mDNS的庫以及所有其他所需內容了。
mDNS可以使您的ESP32在網絡上被發現(對于Wireshark愛好者,可以多播到224.0.0.251),并讓您告訴其他使用者每個設備提供了哪些服務。它的系統與提供流媒體的媒體中心和Chromecasts的系統相同。我使用它來找到我的Raspberry Pi集線器(HEART.local),并且只接受來自該集線器的指令。
當使用USB TTL適配器連接到您的ESP32的UART時,您可以隨時使用CTRL+C跳出正在運行的程序,然后查看變量,調整內存使用情況(micropython.meminfo(1), esp.freemem()),釋放內存(gc.enable(), gc.collect()),進入粘貼模式(CTRL+E,paste, CTRL+D),從而了解一個想法是如何實現的。
想要在Linux、Windows、 以及MacOS X上使用圖形界面,可以使用ampy(“ampy –port COM4 –put boot.py”)、mpfshell(mpfshell -o ttyUSB0 -nc “put boot.py ; put main.py”)或簡單的ESPlorer。也就是說,如果您不單單只使用WebREPL(( ‘import webrepl’, ‘webrepl.start()’)來實現上傳/下載代碼以及查看代碼運行結果的話,會需要這些程序包。為簡單起見,您可以進行搜索相關信息,然后將MicroPython板連接到您的網絡上。
3 ESP32 硬件概述
ESP32 規格
CPU 雙核@ 160/240MHz,Xtensa(R) 32位 LX6 微處理器
性能: <=600 DMIPS
芯片 ESP32D0WDQ6 (版本1)
Wi-Fi:802.11/b/g/n/e/i – 802.11n @ 2.4GHz 高達150Mbit/s
RAM:
448KB ROM 用于啟動及核心功能
520KB 片上SRAM 用于數據及指令
RTC(RTC FAST MEMORY)中的8KB SRAM用于從深度睡眠模式中恢復
RTC(RTC SLOW MEMORY)中的8KB SRAM用于深度睡眠模式下的協同處理
1Kbit eFuse(256位用于系統(MAC和芯片配置)),768位用于用戶應用程序、閃存加密以及芯片ID
40MHz晶振,可輸出40MHz PWM
可用SPIRAM進行擴張!最多4個16MB外置QSPI 閃存/SRAM芯片,最多8MB映射到CPU數據空間的外置閃存/SRAM,支持存取8位、16位、32位數據。該SRAM可以寫入:
閃存: 4MB SPI 閃存(在GPIO6、 GPIO7、GPIO8、GPIO9、GPIO10上)
安全性: IEEE 802.11 標準安全機制:
WPA/WPA2/WAPI
安全啟動
閃存加密
1024位OTP,最終用戶可達768位
AES,SHA-2,RSA,橢圓曲線加密(ECC),隨機數生成(RNG)的加密硬件加速
ESP32 數據表
雙核CPU和520KB RAM相對于您可能已經習慣使用的Arduino atmega328p (例如Uno)的16MHz和2KB SRAM有了質的提升,可以為您提供足夠的速度和空間來開發更高復雜程度的物聯網系統。相比于它的能力范圍,我的Wi-Fi開關只使用了其中很少的功能。但是,我在ESP32的兩側都添加了引腳公頭,之后可以隨時為我構建的產品添加更多的功能。
wifiswitch.zip
4 將固件加載到 ESP32
您只需要esptool即可上傳Loboris MicroPython。為了方便起見,請直接使用我的腳本:
[begin flash_lobo_esp32_all.sh] # Enable flashing by holding the button to the right of # microUSB port when powering ESP32 on _baudrate=230400 _port=/dev/ttyUSB0 esptool.py --chip esp32 --before no_reset --after no_reset --baud $_baudrate --port $_port erase_flash esptool.py --chip esp32 --port $_port --baud $_baudrate --before no_reset --after no_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 bootloader/bootloader.bin 0xf000 phy_init_data.bin 0x10000 MicroPython.bin 0x8000 partitions_mpy.bin [end flash_lobo_esp32_all.sh]
為了實現連接,您可以在Windows、 Linux、以及MacOS上使用終端指令“python3 -m serial.tools.miniterm”。Miniterm可以與python3-serial模塊一起安裝,或者可以直接下載putty軟件來簡化您的過程。根據您使用的Windows, Linux,以及MacOS系統,端口將會遵循不同的命名慣例。這兩個程序都會要求您輸入想要連接的端口以及波特率。對于MicroPython,使用115200。需要連接的端口在Windows系統上會有所不同(插入設備時在設備管理器中查找COM#端口變化),而在Linux或其他類似的系統中,通常對于第一個連接的USB串行適配器為“/dev/ttyUSB0”,第二個為“/dev/ttyUSB1”等等。
MicroPython的易用性和靈活性使您不會被代碼困擾,從而能有更多的時間投入到電子產品的開發中。
5 運行!
您的ESP32在MicroPython上運行時,首先會執行“boot.py”,接下來是“main.py”(如果存在的話)。“boot.py”通常用于Wi-Fi的初始化,并且完成系統的準備工作。我將所有的指令都保存在了“boot.py”中,但是如果您原意的話,也可以將最后幾個無限循環代碼寫入“main.py”中。如果您對Arduino比較熟悉的話,可以將“boot.py”看作“setup()”,將“main.py”看作“loop()”,只不過您需要添加一行“while True:”使“main.py”可以無限循環。
函數“connection_handler()”建立了一個Wi-Fi連接,會遍歷“_wlans”元組中所有配置過的WLAN。如果無法連接,將會重新開始直到連接成功為止。該函數會每隔一段時間被調用一次。
遺憾的是,在本項目中無法調用“sta_if.status(‘rssi’)”,否則該函數將有助于把您的ESP32物聯網設備放置在信號良好的位置。使用它您可以很方便地查看Wi-Fi信號強度。任何低于-80的信號都可能會導致間歇性的網絡故障,而-65或更高強度的信號可以連接良好。
控制繼電器的函數是“relay_handler()”,這是一個可以自我記錄的ifthis-dothis-ifthat-dothat代碼塊。它會返回一串文本,來通知集線器它發送到ESP32的指令已經被成功執行。我們沒有一個簡單的狀態機來對中繼狀態進行追蹤,因為Loboris的ESP32模塊可能無法使用“state = pin.value()”。您仍然可以添加狀態追蹤功能,但是需要使用“pin.value()”。我相信這樣可以解決這個問題,因為它可以很完美地與官方MicroPython固件配合使用。
在設置mDNS并找到集線器(“HEART.local”)時,代碼會不斷嘗試對集線器進行解析,直到成功為止。這旨在幫助您正確地設置Raspberry Pi。指令“avahi-browse -avtr”和“avahi-resolve –address/–name”會很有用!
最后,在大部分的有用信息被打印完成后,我們進入主循環部分。通過偵聽10101/tcp端口,ESP32可以查看有效指令,并將符合要求的指令傳遞給“relay_handler()”。您可以禁用對“are-you-in-fact ‘HEART.local’?”的檢查。簡單地說,這種檢查是無關緊要的,并不是真正的身份驗證機制。mDNS網絡名稱是可以偽造的,并且隨著時間的推移,集線器將會更改其IP地址。
最后有一個循環將會無限運行下去,該循環只與來自網絡的輸入有關。如果您想對其進行嘗試,需要添加“except KeyboardInterrupt: break”,它包含在wifiswitch.zip中。
6 選擇您的集線器:主機就是Heart.local所在的位置
對于您的集線器,我建議使用一個Raspberry Pi。查看有關如何設置Raspberry Pi的指南,并將其連接到網絡上。對于無顯示器操作,Raspberry Pi Zero W是理想選擇,但是如果您想要通過圖形界面進行操作,請使用Raspberry Pi 2/3/4 B/B+。當然,如果您運行的是Linux或其他類似的系統,也可以直接從您的筆記本電腦端來操作Wi-Fi開關。高級用戶也可以嘗試使用OpenWRT,它在新版路由器上的功能和Raspberry Pi 4 B一樣,并且可以全天候運行。需要的軟件包是avahi-daemon和avahi-discover(Linux或其他類似系統),配置示例請參閱wifiswitch.zip中的wifiswitch/rpi/etc/avahi/avahi-daemon.conf。如果您使用了一個Raspberry Pi,請確保在您的集線器上wifiswitch/rpi運行upgrade.sh和setup.sh,這樣的話就可以保證一切正常。除了avahi-daemon,只需要再安裝幾個有用的額外的安裝包。其中,“nmap”十分有用,它可以讓您查看網絡上的每個節點和服務。
avahi-daemon通常都預裝在使用Linux發行版(如Ubuntu)的臺式機和筆記本電腦上。如果沒有的話,請使用您的軟件包管理器將其添加到您的系統中。同時還必須安裝avahi-discover包。在您的終端中,輸入“sudo apt update; sudo apt install avahi-daemon avahi-discover”。然后,使用wifiswitch.zip中的wifiswitch/rpi/wifi_switch.sh來操作您的WiFiSwitch。您可以很輕松地對事務進行時間安排,而且如果您在外度假的話,cron可以在您期望的時間打開和關閉您家里的燈光,從而給小偷之類的人留下有人在家的印象。把臥室和客廳的燈以1秒鐘的時間間隔進行打開和關閉?只有瘋了的人才會做這種事吧。但是不要進行3-30Hz頻率的循環,這樣會導致一直執行重復性動作。
檢查您的設置時,請使用“avahi-browse -avtr”查看所有的mDNS對等點及其服務。“avahi-browse -lavtr”將顯示除了您所在系統之外的所有內容。使用“avahi-browse -avtr”查看所有服務是對設置進行調試的好方法!腳本“wifi_switch.sh”使用了指令“avahi-resolve –name WiFiSwitch.local”,通過指令“avahi-resolve –address”,您可以查找設備的mDNS名稱。
[begin wifi_switch.sh] #! /usr/bin/env bash #
以下是來自ESP32的日志,以及對來自我的集線器的指令的啟動和執行。
[begin esp32.log] ... D (1096) MicroPython: Main task exit, stack used: 1392 I (1098) MicroPython: [=== MicroPython FreeRTOS task started (sp=3ffc5c10) ===] Internal FS (SPIFFS): Mounted on partition 'internalfs' [size: 1048576; Flash address: 0x200000] ---------------- Filesystem size: 956416 B Used: 10752 B Free: 945664 B ---------------- [!] Booting, running boot.py ... I (2058) phy: phy_version: 3960, 5211945, Jul 18 2018, 10:40:07, 0, 0 [!] Hostname: WiFiSwitch.local [!] Connecting to b'TestNetwork' using key b'TestPassword' ... [!] Network configuration: ('192.168.0.100', '255.255.255.0', '192.168.0.1', '192.168.0.1') [!] Starting mDNS ... [!] Discovering control hub HEART.local ... [!] HEART.local has address 192.168.0.101 [!] Entering listener loop, responding to arg1=>relay1|relay2|both arg2=>on|off - but only from HEART.local (192.168.0.101) [!] relay1: OFF [!] relay1: ON [!] relay1 + relay2: OFF [!] relay1 + relay2: ON [!] Connected peer 192.168.0.103 is _NOT_ HEART.local (192.168.0.101), rejecting it ... [!] Connected peer 192.168.0.103 is _NOT_ HEART.local (192.168.0.101), rejecting it ... [!] relay1 + relay2: OFF [!] relay1: ON [!] relay1: OFF [!] relay2: OFF [!] relay2: ON [!] relay2: OFF [!] relay1 + relay2: ON [end esp32.log]
在集線器上:
[begin hub.log] $ # give wifiswitch a rigorous workout! $ while true do wifi_switch.sh relay1 on ; sleep 2 wifi_switch.sh relay1 off ; sleep 2 wifi_switch.sh relay2 on ; sleep 2 wifi_switch.sh relay2 off ; sleep 2 wifi_switch.sh both on ; sleep 2 wifi_switch.sh both off ; sleep 2 done INFO: Name=>WiFiSwitch.local address=>192.168.0.102 port=>10101 relay=>relay1 action=>on COMMAND: echo relay1 on | nc -w 1 192.168.0.102 10101 REPLY: WiFiSwitch: relay1 ON WiFiSwitch: OK INFO: Name=>WiFiSwitch.local address=>192.168.0.102 port=>10101 relay=>relay1 action=>off COMMAND: echo relay1 off | nc -w 1 192.168.0.102 10101 REPLY: WiFiSwitch: relay1 OFF WiFiSwitch: OK INFO: Name=>WiFiSwitch.local address=>192.168.0.102 port=>10101 relay=>relay2 action=>on COMMAND: echo relay2 on | nc -w 1 192.168.0.102 10101 REPLY: WiFiSwitch: relay2 ON WiFiSwitch: OK INFO: Name=>WiFiSwitch.local address=>192.168.0.102 port=>10101 relay=>relay2 action=>off COMMAND: echo relay2 off | nc -w 1 192.168.0.102 10101 REPLY: WiFiSwitch: relay2 OFF WiFiSwitch: OK INFO: Name=>WiFiSwitch.local address=>192.168.0.102 port=>10101 relay=>both action=>on COMMAND: echo both on | nc -w 1 192.168.0.102 10101 REPLY: WiFiSwitch: relay1 + relay2 ON WiFiSwitch: OK INFO: Name=>WiFiSwitch.local address=>192.168.0.102 port=>10101 relay=>both action=>off COMMAND: echo both off | nc -w 1 192.168.0.102 10101 REPLY: WiFiSwitch: relay1 + relay2 OFF WiFiSwitch: OK [end hub.log]
7 構建Wi-Fi開關
在構建設備時,您將需要以下部件。如果您沒有這些部件,請查看零件數據表并使用具有相似特性的部件。例如,LM317是7805的完美替代品。
ESP32 Wroom (ESP32D0WDQ6(修訂版1)) | https://www.adafruit.com/product/3269 |
12V 電源,1A | https://www.newark.com/xp-power/vel12us120-us-ja/adaptor-ac-dc-12v-1a/dp/71Y7923 |
Raspberry Pi Zero/Zero W/2 B+/3 B+ | https://www.newark.com/raspberry-pi/rpi3-modbp/sbc-arm-cortex-a53-1gb-sdram/dp/49AC7637 |
5.25V 電源 | https://www.newark.com/raspberry-pi/t6712dv/raspberry-pi-power-supply-90-264vac/dp/81AC2841 |
2x 12V 汽車繼電器,>=8A | https://www.newark.com/te-connectivity/v23086c1001a403/relay-automotive-spdt-12vdc-30a/dp/86K0343 |
2P 2.54mm 螺絲端子 | https://www.newark.com/buchanan-te-connectivity/282834-2/terminal-block-pcb-2-position/dp/12H8386 |
2x 3P 2.54mm 螺絲端子 | https://www.newark.com/buchanan-te-connectivity/282834-3/terminal-block-pcb-3-position/dp/12H8387 |
7805 穩壓器 | https://www.newark.com/on-semiconductor/mc7805actg/ldo-voltage-regulator-5v-1a-to/dp/45J1442 |
0.1uF + 0.33uF 電容 | https://www.newark.com/multicomp/mc0805b334k500a5-08mm/ceramic-capacitor-0-33uf-50v-x7r/dp/46P6304 |
3-5W 散熱器 | https://www.newark.com/aavid-thermalloy/sw25-4/heat-sink/dp/01M9146 |
2x PC817 光隔離器 | https://www.newark.com/sharp/pc817x1nsz0f/transistor-output-optocoupler/dp/55X3057 |
2x 330 + 2x 10Kohm 電阻 | https://www.newark.com/velleman-sa/k-res-e3/480-piece-misc-resistor-kit/dp/43W7615 |
烙鐵,推薦使用 TS100 | https://www.newark.com/weller/wp35/temperature-controlled-soldering/dp/34F1023 |
松香芯焊錫 | https://www.newark.com/gc-electronics/6033/solder-60-40-rosin-core-20g-1/dp/01E0120?st=solder%20rosin%20core |
2.54mm 引腳公頭與母頭 |
https://www.newark.com/mcm/ph1-40-ua/break-away-2-54mm-40-pin-strip/dp/97W4638 https://www.newark.com/mcm/rs1-06-g-413/1-x-6-position-female-socket-with/dp/97W4645 |
2x BAT86 肖特基二極管 | https://www.newark.com/nexperia/bat86/rectifier-diode-single-50-v-200/dp/96K6771 |
2x 2N7000 MOSFETs | https://www.newark.com/on-semiconductor/2n7000/n-channel-mosfet-60v-200ma-to/dp/58K9650 |
外盒(塑料材料,金屬材料將會阻擋WiFi信號) | https://www.newark.com/hammond/1591dbk/enclosure-multipurpose-plastic/dp/65F1761 |
細實心線(聚四氟乙烯涂層!) | https://www.newark.com/alpha-wire/2936-br005/hook-up-wire-36awg-brown-30-5m/dp/22AC3546 |
此外,您還需要一些粗絞線(剝出電源線,只需要約10厘米),也可以選擇使用一個帶研磨鉆頭的旋轉工具。
假設您已經具有烙鐵以及松香芯的焊料了,您可以使用任何具備溫度控制功能的工具進行焊接。焊接溫度最好為824華氏度,并且每次只接觸焊點3-5秒。
該Fritzing 示意圖顯示了所有的連接。注意7805 Vout和ESP32之間的滑動開關。如果您想把ESP32和中繼器板完全隔離開,請使用DPDT開關,并將其使用在5V和GND線上。光隔離器在正確操作的情況下不需要公共接地。您可以通過添加一個DPDT開關來免去一些麻煩,因為同時用7805和microUSB為ESP32供電是不可行的。
microUSB端口通常用于上傳代碼,microUSB端口上的5V引腳沒有直接連接到5V引腳上,這里有一個正向偏置到該引腳的肖特基二極管。連接兩個5V電源不僅會燒壞ESP32,可能還會損壞您的USB端口。我們永遠不要讓這種事情發生。只需在microUSB數據線連接到ESP32之前將滑動開關轉到OFF位置即可。這不會影響開發板的操作,光隔離器與驅動繼電器的MOSFET之間沒有電流流通。您可以考慮購買一個USB TTL適配器,它可以讓您連接到ESP32,并且無需在每次重啟程序的時候進行重置。如果您通過其他方式為其供電,請勿將它的5V電線連接到開發板上。
如圖所示將所有部件進行連接,請特別注意繼電器上的電流端子。如果您有帶磨頭的旋轉工具,請移除端子周圍的銅墊,然后將粗絕緣線鋪在清理過的表面上。開關繼電器總是會產生電弧,但是這些電弧不會在繼電器外產生。對板進行打磨。230V電壓不會造成什么傷害,但是還是謹慎些為好。
完成后,您已經驗證了繼電器可以正常工作,在交流電流動的所有點以及這些點之間的線路上涂上具有耐高溫特性的熱膠,并粘上電工膠帶。熱膠在高達194華氏度的溫度下形狀穩定,所以它會一直穩固在其位置上。現在,我們已經確認了不會對身體造成傷害。
PC817光隔離器標有A-K、C-E。這意味著小圓標記旁邊的引腳是陽極(A),旁邊的引腳是陰極(K)。您需要在ESP32引腳和每個光隔離器陽極之間串聯一個330歐姆的電阻。內部有一個紅外線LED。您一定了解LED的一個特點—它們會在過高的電流負載下燒壞。發射的紅外光打開了晶體管集電極(與NPN不太一樣),使集電極(C)側的電流流經發射極(E),到達2N7000 MOSFET柵極。發生這種情況時,2N7000將會打開,讓來自繼電器的電流流過漏極,通過源極流到GND,然后它會即刻發出咔噠聲。
2N7000 MOSFET的連接很簡單,但前提是您需要記得在柵極和GND之間放置10Kohm的下拉電阻。如果您忘記了這一點,柵極就不會被關閉,您的繼電器也就無法可靠地轉換。
您所構建的設備不需要很美觀,它會被一直放在一個盒子里。該設備不會消耗太多功率(約2.7W),不過在外盒上添加幾個小孔是個不錯的主意,這樣系統可以被動地進行冷卻。如果沒有這幾個孔的話,熱量聚集可能會使部件無法正常工作。
以下是一個類似的板,連接到了我的Raspberry Pi集線器上。它有自己的5V電源,并且僅依賴于4條3V3信號線和來自Pi的GND連接。雖然它看起來也不太美觀,但是相比于具有相同容量和繼電器的PCB,它的尺寸更小。
首先在面包板上測試您的電路,然后構建該電路。構建完成后,您可以開始根據自己的想法對代碼進行調整。無論您有什么想法,我想都會比構建物聯網鞋要好得多。我想我永遠都沒法搞明白為什么我用物聯網購買了一些工具和書籍后,亞馬遜會給我推薦這些產品。
Lasse Efrayim Jespersen
Lasse出生在以色列,后來移居到較冷的緯度地區。出于個人興趣,他逐漸了解到了Perl的直接、C/C++的高效以及MicroPython的優雅。他喜歡用ESP8266/ESP32/Raspberry Pi和Arduino來制作機器。
審核編輯黃宇
-
開關
+關注
關注
19文章
3142瀏覽量
93766 -
物聯網
+關注
關注
2911文章
44824瀏覽量
375135 -
wi-fi
+關注
關注
14文章
2157瀏覽量
124721
發布評論請先 登錄
相關推薦
評論